sass 3.2.0.alpha.11 → 3.2.0.alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/lib/sass/cache_stores/base.rb +4 -9
- data/lib/sass/cache_stores/filesystem.rb +2 -0
- data/lib/sass/css.rb +2 -1
- data/lib/sass/engine.rb +28 -8
- data/lib/sass/environment.rb +26 -0
- data/lib/sass/exec.rb +13 -0
- data/lib/sass/importers/base.rb +2 -1
- data/lib/sass/script/funcall.rb +8 -0
- data/lib/sass/script/interpolation.rb +9 -0
- data/lib/sass/script/list.rb +7 -0
- data/lib/sass/script/literal.rb +5 -0
- data/lib/sass/script/node.rb +8 -0
- data/lib/sass/script/number.rb +28 -5
- data/lib/sass/script/operation.rb +8 -0
- data/lib/sass/script/string_interpolation.rb +9 -0
- data/lib/sass/script/unary_operation.rb +7 -0
- data/lib/sass/script/variable.rb +5 -0
- data/lib/sass/scss/parser.rb +26 -13
- data/lib/sass/scss/rx.rb +1 -1
- data/lib/sass/scss/static_parser.rb +2 -2
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/debug_node.rb +1 -6
- data/lib/sass/tree/each_node.rb +1 -7
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -7
- data/lib/sass/tree/function_node.rb +1 -6
- data/lib/sass/tree/if_node.rb +1 -19
- data/lib/sass/tree/mixin_def_node.rb +5 -6
- data/lib/sass/tree/mixin_node.rb +2 -7
- data/lib/sass/tree/node.rb +4 -19
- data/lib/sass/tree/prop_node.rb +0 -5
- data/lib/sass/tree/return_node.rb +1 -6
- data/lib/sass/tree/rule_node.rb +9 -7
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +1 -7
- data/lib/sass/tree/visitors/check_nesting.rb +30 -13
- data/lib/sass/tree/visitors/convert.rb +5 -1
- data/lib/sass/tree/visitors/cssize.rb +3 -3
- data/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/lib/sass/tree/visitors/perform.rb +36 -16
- data/lib/sass/tree/visitors/set_options.rb +97 -0
- data/lib/sass/tree/visitors/to_css.rb +5 -1
- data/lib/sass/tree/warn_node.rb +1 -7
- data/lib/sass/tree/while_node.rb +1 -7
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/conversion_test.rb +38 -0
- data/test/sass/css2sass_test.rb +9 -0
- data/test/sass/engine_test.rb +248 -17
- data/test/sass/scss/css_test.rb +4 -2
- data/test/sass/scss/scss_test.rb +53 -12
- data/vendor/fssm/Gemfile +3 -0
- data/vendor/fssm/LICENSE +1 -1
- data/vendor/fssm/README.markdown +55 -27
- data/vendor/fssm/Rakefile +6 -54
- data/vendor/fssm/example.rb +6 -3
- data/vendor/fssm/fssm.gemspec +17 -70
- data/vendor/fssm/lib/fssm.rb +7 -3
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/fssm/lib/fssm/monitor.rb +19 -9
- data/vendor/fssm/lib/fssm/path.rb +24 -21
- data/vendor/fssm/lib/fssm/pathname.rb +13 -479
- data/vendor/fssm/lib/fssm/state/directory.rb +29 -11
- data/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/fssm/lib/fssm/support.rb +41 -12
- data/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/fssm/lib/fssm/version.rb +3 -0
- data/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
- data/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/fssm/spec/count_down_latch.rb +151 -0
- data/vendor/fssm/spec/monitor_spec.rb +202 -0
- data/vendor/fssm/spec/path_spec.rb +36 -15
- data/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +14 -4
- data/vendor/fssm/VERSION.yml +0 -5
data/lib/sass/scss/rx.rb
CHANGED
@@ -110,7 +110,7 @@ module Sass
|
|
110
110
|
# Custom
|
111
111
|
HEXCOLOR = /\#[0-9a-fA-F]+/
|
112
112
|
INTERP_START = /#\{/
|
113
|
-
|
113
|
+
ANY = /:(-[-\w]+-)?any\(/i
|
114
114
|
|
115
115
|
STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\"/
|
116
116
|
STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\'/
|
@@ -13,12 +13,12 @@ module Sass
|
|
13
13
|
# Used for error reporting.
|
14
14
|
# @return [Selector::CommaSequence] The parsed selector
|
15
15
|
# @raise [Sass::SyntaxError] if there's a syntax error in the selector
|
16
|
-
def parse_selector
|
16
|
+
def parse_selector
|
17
17
|
init_scanner!
|
18
18
|
seq = expr!(:selector_comma_sequence)
|
19
19
|
expected("selector") unless @scanner.eos?
|
20
20
|
seq.line = @line
|
21
|
-
seq.filename = filename
|
21
|
+
seq.filename = @filename
|
22
22
|
seq
|
23
23
|
end
|
24
24
|
|
data/lib/sass/tree/debug_node.rb
CHANGED
@@ -6,12 +6,7 @@ module Sass
|
|
6
6
|
class DebugNode < Node
|
7
7
|
# The expression to print.
|
8
8
|
# @return [Script::Node]
|
9
|
-
|
10
|
-
|
11
|
-
# Returns sub nodes that are not tree children.
|
12
|
-
def subnodes
|
13
|
-
Array(expr)
|
14
|
-
end
|
9
|
+
attr_accessor :expr
|
15
10
|
|
16
11
|
# @param expr [Script::Node] The expression to print
|
17
12
|
def initialize(expr)
|
data/lib/sass/tree/each_node.rb
CHANGED
@@ -11,7 +11,7 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the list.
|
13
13
|
# @param [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :list
|
15
15
|
|
16
16
|
# @param var [String] The name of the loop variable
|
17
17
|
# @param list [Script::Node] The parse tree for the list
|
@@ -20,11 +20,5 @@ module Sass::Tree
|
|
20
20
|
@list = list
|
21
21
|
super()
|
22
22
|
end
|
23
|
-
|
24
|
-
# Returns sub nodes that are not tree children.
|
25
|
-
def subnodes
|
26
|
-
Array(list)
|
27
|
-
end
|
28
|
-
|
29
23
|
end
|
30
24
|
end
|
data/lib/sass/tree/for_node.rb
CHANGED
@@ -11,11 +11,11 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the initial expression.
|
13
13
|
# @return [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :from
|
15
15
|
|
16
16
|
# The parse tree for the final expression.
|
17
17
|
# @return [Script::Node]
|
18
|
-
|
18
|
+
attr_accessor :to
|
19
19
|
|
20
20
|
# Whether to include `to` in the loop or stop just before.
|
21
21
|
# @return [Boolean]
|
@@ -32,10 +32,5 @@ module Sass::Tree
|
|
32
32
|
@exclusive = exclusive
|
33
33
|
super()
|
34
34
|
end
|
35
|
-
|
36
|
-
# Returns sub nodes that are not tree children.
|
37
|
-
def subnodes
|
38
|
-
Array(from) + Array(to)
|
39
|
-
end
|
40
35
|
end
|
41
36
|
end
|
@@ -13,7 +13,7 @@ module Sass
|
|
13
13
|
# the default value of the argument
|
14
14
|
#
|
15
15
|
# @return [Array<Script::Node>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# @param name [String] The function name
|
19
19
|
# @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
|
@@ -22,11 +22,6 @@ module Sass
|
|
22
22
|
@args = args
|
23
23
|
super()
|
24
24
|
end
|
25
|
-
|
26
|
-
# Returns sub nodes that are not tree children.
|
27
|
-
def subnodes
|
28
|
-
Array(args)
|
29
|
-
end
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
data/lib/sass/tree/if_node.rb
CHANGED
@@ -13,7 +13,7 @@ module Sass::Tree
|
|
13
13
|
# If this is nil, this is an `@else` node, not an `@else if`.
|
14
14
|
#
|
15
15
|
# @return [Script::Expr]
|
16
|
-
|
16
|
+
attr_accessor :expr
|
17
17
|
|
18
18
|
# The next {IfNode} in the if-else list, or `nil`.
|
19
19
|
#
|
@@ -35,12 +35,6 @@ module Sass::Tree
|
|
35
35
|
@last_else = node
|
36
36
|
end
|
37
37
|
|
38
|
-
# @see Node#options=
|
39
|
-
def options=(options)
|
40
|
-
super
|
41
|
-
self.else.options = options if self.else
|
42
|
-
end
|
43
|
-
|
44
38
|
def _dump(f)
|
45
39
|
Marshal.dump([self.expr, self.else, self.children])
|
46
40
|
end
|
@@ -54,17 +48,5 @@ module Sass::Tree
|
|
54
48
|
node.else ? node.else.instance_variable_get('@last_else') : node)
|
55
49
|
node
|
56
50
|
end
|
57
|
-
|
58
|
-
# @see Node#deep_copy
|
59
|
-
def deep_copy
|
60
|
-
node = super
|
61
|
-
node.else = self.else.deep_copy if self.else
|
62
|
-
node
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns sub nodes that are not tree children.
|
66
|
-
def subnodes
|
67
|
-
Array(expr) + Array(self.else)
|
68
|
-
end
|
69
51
|
end
|
70
52
|
end
|
@@ -13,7 +13,11 @@ module Sass
|
|
13
13
|
# and the parse tree for the default value of the argument.
|
14
14
|
#
|
15
15
|
# @return [Array<(Script::Node, Script::Node)>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
|
+
|
18
|
+
# Whether the mixin uses `@content`. Set during the nesting check phase.
|
19
|
+
# @return [Boolean]
|
20
|
+
attr_accessor :has_content
|
17
21
|
|
18
22
|
# @param name [String] The mixin name
|
19
23
|
# @param args [Array<(Script::Node, Script::Node)>] See \{#args}
|
@@ -22,11 +26,6 @@ module Sass
|
|
22
26
|
@args = args
|
23
27
|
super()
|
24
28
|
end
|
25
|
-
|
26
|
-
# Returns sub nodes that are not tree children.
|
27
|
-
def subnodes
|
28
|
-
Array(args)
|
29
|
-
end
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
data/lib/sass/tree/mixin_node.rb
CHANGED
@@ -13,11 +13,11 @@ module Sass::Tree
|
|
13
13
|
|
14
14
|
# The arguments to the mixin.
|
15
15
|
# @return [Array<Script::Node>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# A hash from keyword argument names to values.
|
19
19
|
# @return [{String => Script::Node}]
|
20
|
-
|
20
|
+
attr_accessor :keywords
|
21
21
|
|
22
22
|
# @param name [String] The name of the mixin
|
23
23
|
# @param args [Array<Script::Node>] See \{#args}
|
@@ -28,10 +28,5 @@ module Sass::Tree
|
|
28
28
|
@keywords = keywords
|
29
29
|
super()
|
30
30
|
end
|
31
|
-
|
32
|
-
# Returns sub nodes that are not tree children.
|
33
|
-
def subnodes
|
34
|
-
Array(args) + (keywords||{}).values
|
35
|
-
end
|
36
31
|
end
|
37
32
|
end
|
data/lib/sass/tree/node.rb
CHANGED
@@ -14,7 +14,8 @@ module Sass
|
|
14
14
|
# The nodes in this state are in the same structure as the Sass document:
|
15
15
|
# rules and properties are nested beneath one another.
|
16
16
|
# Nodes that can be in this state or in the dynamic state
|
17
|
-
# are called **static nodes
|
17
|
+
# are called **static nodes**; nodes that can only be in this state
|
18
|
+
# are called **solely static nodes**.
|
18
19
|
#
|
19
20
|
# {Tree::Visitors::Cssize} is then used to create a static CSS tree.
|
20
21
|
# This is like a static Sass tree,
|
@@ -65,11 +66,7 @@ module Sass
|
|
65
66
|
# @param options [{Symbol => Object}] The options
|
66
67
|
# @see #options
|
67
68
|
def options=(options)
|
68
|
-
|
69
|
-
if respond_to?(:subnodes)
|
70
|
-
subnodes.each {|n| n.options = options if n.respond_to?(:options=)}
|
71
|
-
end
|
72
|
-
@options = options
|
69
|
+
Sass::Tree::Visitors::SetOptions.visit(self, options)
|
73
70
|
end
|
74
71
|
|
75
72
|
# @private
|
@@ -188,19 +185,7 @@ module Sass
|
|
188
185
|
#
|
189
186
|
# @return [Node]
|
190
187
|
def deep_copy
|
191
|
-
|
192
|
-
node.children = children.map {|c| c.deep_copy}
|
193
|
-
node
|
194
|
-
end
|
195
|
-
|
196
|
-
def before_sass_cache_store
|
197
|
-
o = self.options
|
198
|
-
self.options = {}
|
199
|
-
return o
|
200
|
-
end
|
201
|
-
|
202
|
-
def after_sass_cache_store(o)
|
203
|
-
self.options = o
|
188
|
+
Sass::Tree::Visitors::DeepCopy.visit(self)
|
204
189
|
end
|
205
190
|
|
206
191
|
protected
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -55,11 +55,6 @@ module Sass::Tree
|
|
55
55
|
super()
|
56
56
|
end
|
57
57
|
|
58
|
-
# Returns sub nodes that are not tree children.
|
59
|
-
def subnodes
|
60
|
-
Array(name).select{|n| n.is_a?(Sass::Script::Node)} + [value]
|
61
|
-
end
|
62
|
-
|
63
58
|
# Compares the names and values of two properties.
|
64
59
|
#
|
65
60
|
# @param other [Object] The object to compare with
|
@@ -6,18 +6,13 @@ module Sass
|
|
6
6
|
class ReturnNode < Node
|
7
7
|
# The expression to return.
|
8
8
|
# @type [Script::Node]
|
9
|
-
|
9
|
+
attr_accessor :expr
|
10
10
|
|
11
11
|
# @param expr [Script::Node] The expression to return
|
12
12
|
def initialize(expr)
|
13
13
|
@expr = expr
|
14
14
|
super()
|
15
15
|
end
|
16
|
-
|
17
|
-
# Returns sub nodes that are not tree children.
|
18
|
-
def subnodes
|
19
|
-
Array(expr)
|
20
|
-
end
|
21
16
|
end
|
22
17
|
end
|
23
18
|
end
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -50,6 +50,13 @@ module Sass::Tree
|
|
50
50
|
# @return [Boolean]
|
51
51
|
attr_accessor :group_end
|
52
52
|
|
53
|
+
# The stack trace.
|
54
|
+
# This is only readable in a CSS tree as it is written during the perform step
|
55
|
+
# and only when the :trace_selectors option is set.
|
56
|
+
#
|
57
|
+
# @return [Array<String>]
|
58
|
+
attr_accessor :stack_trace
|
59
|
+
|
53
60
|
# @param rule [Array<String, Sass::Script::Node>]
|
54
61
|
# The CSS rule. See \{#rule}
|
55
62
|
def initialize(rule)
|
@@ -115,19 +122,14 @@ module Sass::Tree
|
|
115
122
|
:line => self.line}
|
116
123
|
end
|
117
124
|
|
118
|
-
# Returns sub nodes that are not tree children.
|
119
|
-
def subnodes
|
120
|
-
rule.select{|r| r.is_a?(Sass::Script::Node)}
|
121
|
-
end
|
122
|
-
|
123
125
|
private
|
124
126
|
|
125
127
|
def try_to_parse_non_interpolated_rules
|
126
128
|
if @rule.all? {|t| t.kind_of?(String)}
|
127
129
|
# We don't use real filename/line info because we don't have it yet.
|
128
130
|
# When we get it, we'll set it on the parsed rules if possible.
|
129
|
-
parser = Sass::SCSS::StaticParser.new(@rule.join.strip, 1)
|
130
|
-
@parsed_rules = parser.parse_selector
|
131
|
+
parser = Sass::SCSS::StaticParser.new(@rule.join.strip, '', 1)
|
132
|
+
@parsed_rules = parser.parse_selector rescue nil
|
131
133
|
end
|
132
134
|
end
|
133
135
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'sass/tree/node'
|
2
|
+
|
3
|
+
module Sass::Tree
|
4
|
+
# A solely static node left over after a mixin include or @content has been performed.
|
5
|
+
# Its sole purpose is to wrap exceptions to add to the backtrace.
|
6
|
+
#
|
7
|
+
# @see Sass::Tree
|
8
|
+
class TraceNode < Node
|
9
|
+
# The name of the trace entry to add.
|
10
|
+
# @return [String]
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
# @param name [String] The name of the trace entry to add.
|
14
|
+
def initialize(name)
|
15
|
+
@name = name
|
16
|
+
self.has_children = true
|
17
|
+
super()
|
18
|
+
end
|
19
|
+
|
20
|
+
# Initializes this node from an existing node.
|
21
|
+
# @param name [String] The name of the trace entry to add.
|
22
|
+
# @param mixin [Node] The node to copy information from.
|
23
|
+
# @return [TraceNode]
|
24
|
+
def self.from_node(name, node)
|
25
|
+
trace = new(name)
|
26
|
+
trace.line = node.line
|
27
|
+
trace.filename = node.filename
|
28
|
+
trace.options = node.options
|
29
|
+
trace
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -10,7 +10,7 @@ module Sass
|
|
10
10
|
|
11
11
|
# The parse tree for the variable value.
|
12
12
|
# @return [Script::Node]
|
13
|
-
|
13
|
+
attr_accessor :expr
|
14
14
|
|
15
15
|
# Whether this is a guarded variable assignment (`!default`).
|
16
16
|
# @return [Boolean]
|
@@ -25,12 +25,6 @@ module Sass
|
|
25
25
|
@guarded = guarded
|
26
26
|
super()
|
27
27
|
end
|
28
|
-
|
29
|
-
# Returns sub nodes that are not tree children.
|
30
|
-
def subnodes
|
31
|
-
Array(expr)
|
32
|
-
end
|
33
|
-
|
34
28
|
end
|
35
29
|
end
|
36
30
|
end
|
@@ -18,7 +18,7 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
18
18
|
end
|
19
19
|
|
20
20
|
PARENT_CLASSES = [ Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
|
21
|
-
Sass::Tree::ImportNode, Sass::Tree::
|
21
|
+
Sass::Tree::ImportNode, Sass::Tree::TraceNode, Sass::Tree::WhileNode]
|
22
22
|
def visit_children(parent)
|
23
23
|
old_parent = @parent
|
24
24
|
@parent = parent unless is_any_of?(parent, PARENT_CLASSES)
|
@@ -44,13 +44,29 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
44
44
|
raise e
|
45
45
|
end
|
46
46
|
|
47
|
+
def visit_mixindef(node)
|
48
|
+
@current_mixin_def, old_mixin_def = node, @current_mixin_def
|
49
|
+
yield
|
50
|
+
ensure
|
51
|
+
@current_mixin_def = old_mixin_def
|
52
|
+
end
|
53
|
+
|
54
|
+
def invalid_content_parent?(parent, child)
|
55
|
+
if @current_mixin_def
|
56
|
+
@current_mixin_def.has_content = true
|
57
|
+
nil
|
58
|
+
else
|
59
|
+
"@content may only be used within a mixin."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
47
63
|
def invalid_charset_parent?(parent, child)
|
48
64
|
"@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
49
65
|
end
|
50
66
|
|
51
|
-
|
67
|
+
VALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
|
52
68
|
def invalid_extend_parent?(parent, child)
|
53
|
-
unless is_any_of?(parent,
|
69
|
+
unless is_any_of?(parent, VALID_EXTEND_PARENTS)
|
54
70
|
"Extend directives may only be used within rules."
|
55
71
|
end
|
56
72
|
end
|
@@ -59,20 +75,20 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
59
75
|
"Functions may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
60
76
|
end
|
61
77
|
|
62
|
-
|
78
|
+
VALID_FUNCTION_CHILDREN = [
|
63
79
|
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::EachNode,
|
64
80
|
Sass::Tree::ForNode, Sass::Tree::IfNode, Sass::Tree::ReturnNode,
|
65
81
|
Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::WhileNode
|
66
82
|
]
|
67
83
|
def invalid_function_child?(parent, child)
|
68
|
-
unless is_any_of?(child,
|
84
|
+
unless is_any_of?(child, VALID_FUNCTION_CHILDREN)
|
69
85
|
"Functions can only contain variable declarations and control directives."
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
73
89
|
INVALID_IMPORT_PARENTS = [
|
74
|
-
Sass::Tree::IfNode, Sass::Tree::ForNode,
|
75
|
-
Sass::Tree::EachNode, Sass::Tree::MixinDefNode
|
90
|
+
Sass::Tree::IfNode, Sass::Tree::ForNode, Sass::Tree::WhileNode,
|
91
|
+
Sass::Tree::EachNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode
|
76
92
|
]
|
77
93
|
def invalid_import_parent?(parent, child)
|
78
94
|
if is_any_of?(@real_parent, INVALID_IMPORT_PARENTS)
|
@@ -98,18 +114,19 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
98
114
|
"Mixins may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
99
115
|
end
|
100
116
|
|
101
|
-
|
117
|
+
VALID_PROP_CHILDREN = [Sass::Tree::CommentNode, Sass::Tree::PropNode]
|
102
118
|
def invalid_prop_child?(parent, child)
|
103
|
-
unless is_any_of?(child,
|
119
|
+
unless is_any_of?(child, VALID_PROP_CHILDREN)
|
104
120
|
"Illegal nesting: Only properties may be nested beneath properties."
|
105
121
|
end
|
106
122
|
end
|
107
123
|
|
108
|
-
|
109
|
-
|
124
|
+
VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
125
|
+
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode,
|
126
|
+
Sass::Tree::MixinNode]
|
110
127
|
def invalid_prop_parent?(parent, child)
|
111
|
-
unless is_any_of?(parent,
|
112
|
-
"Properties are only allowed within rules, directives, or other properties." + child.pseudo_class_selector_message
|
128
|
+
unless is_any_of?(parent, VALID_PROP_PARENTS)
|
129
|
+
"Properties are only allowed within rules, directives, mixin includes, or other properties." + child.pseudo_class_selector_message
|
113
130
|
end
|
114
131
|
end
|
115
132
|
|