Class: Sass::Tree::Visitors::CheckNesting
- Inherits:
-
Base
- Object
- Base
- Sass::Tree::Visitors::CheckNesting
show all
- Defined in:
- lib/sass/tree/visitors/check_nesting.rb
Overview
A visitor for checking that all nodes are properly nested.
Constant Summary
collapse
- CONTROL_NODES =
[Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
Sass::Tree::WhileNode, Sass::Tree::TraceNode]
- SCRIPT_NODES =
[Sass::Tree::ImportNode] + CONTROL_NODES
- VALID_EXTEND_PARENTS =
[Sass::Tree::RuleNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
- INVALID_IMPORT_PARENTS =
CONTROL_NODES +
[Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
- VALID_FUNCTION_CHILDREN =
[
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::ReturnNode,
Sass::Tree::VariableNode, Sass::Tree::WarnNode
] + CONTROL_NODES
- VALID_PROP_CHILDREN =
[Sass::Tree::CommentNode, Sass::Tree::PropNode, Sass::Tree::MixinNode] + CONTROL_NODES
- VALID_PROP_PARENTS =
[Sass::Tree::RuleNode, Sass::Tree::PropNode,
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode,
Sass::Tree::MixinNode]
Constants inherited
from Base
Base::NODE_NAME_RE
Instance Method Summary
collapse
-
#initialize ⇒ CheckNesting
constructor
protected
A new instance of CheckNesting.
-
#invalid_charset_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_content_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_extend_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_function_child?(parent, child) ⇒ Boolean
protected
-
#invalid_function_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_import_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_mixindef_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_prop_child?(parent, child) ⇒ Boolean
protected
-
#invalid_prop_parent?(parent, child) ⇒ Boolean
protected
-
#invalid_return_parent?(parent, child) ⇒ Boolean
protected
-
#visit(node)
protected
-
#visit_children(parent)
protected
-
#visit_import(node)
protected
-
#visit_mixindef(node)
protected
-
#visit_root(node)
protected
Methods inherited from Base
#node_name, visit, #visit_if
Constructor Details
Returns a new instance of CheckNesting.
5
6
7
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 5
def initialize
@parents = []
end
|
Instance Method Details
#invalid_charset_parent?(parent, child) ⇒ Boolean
66
67
68
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 66
def invalid_charset_parent?(parent, child)
"@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
end
|
#invalid_content_parent?(parent, child) ⇒ Boolean
57
58
59
60
61
62
63
64
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 57
def invalid_content_parent?(parent, child)
if @current_mixin_def
@current_mixin_def.has_content = true
nil
else
"@content may only be used within a mixin."
end
end
|
#invalid_extend_parent?(parent, child) ⇒ Boolean
71
72
73
74
75
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 71
def invalid_extend_parent?(parent, child)
unless is_any_of?(parent, VALID_EXTEND_PARENTS)
return "Extend directives may only be used within rules."
end
end
|
#invalid_function_child?(parent, child) ⇒ Boolean
107
108
109
110
111
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 107
def invalid_function_child?(parent, child)
unless is_any_of?(child, VALID_FUNCTION_CHILDREN)
"Functions can only contain variable declarations and control directives."
end
end
|
#invalid_function_parent?(parent, child) ⇒ Boolean
97
98
99
100
101
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 97
def invalid_function_parent?(parent, child)
unless (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
return "Functions may not be defined within control directives or other mixins."
end
end
|
#invalid_import_parent?(parent, child) ⇒ Boolean
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 79
def invalid_import_parent?(parent, child)
unless (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
return "Import directives may not be used within control directives or mixins."
end
return if parent.is_a?(Sass::Tree::RootNode)
return "CSS import directives may only be used at the root of a document." if child.css_import?
rescue Sass::SyntaxError => e
e.modify_backtrace(:filename => child.imported_file.options[:filename])
e.add_backtrace(:filename => child.filename, :line => child.line)
raise e
end
|
#invalid_mixindef_parent?(parent, child) ⇒ Boolean
91
92
93
94
95
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 91
def invalid_mixindef_parent?(parent, child)
unless (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
return "Mixins may not be defined within control directives or other mixins."
end
end
|
#invalid_prop_child?(parent, child) ⇒ Boolean
114
115
116
117
118
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 114
def invalid_prop_child?(parent, child)
unless is_any_of?(child, VALID_PROP_CHILDREN)
"Illegal nesting: Only properties may be nested beneath properties."
end
end
|
#invalid_prop_parent?(parent, child) ⇒ Boolean
123
124
125
126
127
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 123
def invalid_prop_parent?(parent, child)
unless is_any_of?(parent, VALID_PROP_PARENTS)
"Properties are only allowed within rules, directives, mixin includes, or other properties." + child.pseudo_class_selector_message
end
end
|
#invalid_return_parent?(parent, child) ⇒ Boolean
129
130
131
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 129
def invalid_return_parent?(parent, child)
"@return may only be used within a function." unless parent.is_a?(Sass::Tree::FunctionNode)
end
|
#visit(node)
9
10
11
12
13
14
15
16
17
18
19
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 9
def visit(node)
if error = @parent && (
try_send("invalid_#{node_name @parent}_child?", @parent, node) ||
try_send("invalid_#{node_name node}_parent?", @parent, node))
raise Sass::SyntaxError.new(error)
end
super
rescue Sass::SyntaxError => e
e.modify_backtrace(:filename => node.filename, :line => node.line)
raise e
end
|
#visit_children(parent)
24
25
26
27
28
29
30
31
32
33
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 24
def visit_children(parent)
old_parent = @parent
@parent = parent unless is_any_of?(parent, SCRIPT_NODES) ||
(parent.bubbles? && !old_parent.is_a?(Sass::Tree::RootNode))
@parents.push parent
super
ensure
@parent = old_parent
@parents.pop
end
|
#visit_import(node)
42
43
44
45
46
47
48
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 42
def visit_import(node)
yield
rescue Sass::SyntaxError => e
e.modify_backtrace(:filename => node.children.first.filename)
e.add_backtrace(:filename => node.filename, :line => node.line)
raise e
end
|
#visit_mixindef(node)
50
51
52
53
54
55
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 50
def visit_mixindef(node)
@current_mixin_def, old_mixin_def = node, @current_mixin_def
yield
ensure
@current_mixin_def = old_mixin_def
end
|
#visit_root(node)
35
36
37
38
39
40
|
# File 'lib/sass/tree/visitors/check_nesting.rb', line 35
def visit_root(node)
yield
rescue Sass::SyntaxError => e
e.sass_template ||= node.template
raise e
end
|