sass 3.2.7 → 3.3.0.rc.1
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/MIT-LICENSE +2 -2
- data/README.md +14 -2
- data/Rakefile +25 -1
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/lib/sass/cache_stores/base.rb +4 -2
- data/lib/sass/cache_stores/chain.rb +2 -1
- data/lib/sass/cache_stores/filesystem.rb +2 -6
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +1 -0
- data/lib/sass/css.rb +10 -10
- data/lib/sass/engine.rb +403 -150
- data/lib/sass/environment.rb +136 -57
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +123 -39
- data/lib/sass/features.rb +41 -0
- data/lib/sass/importers/base.rb +33 -2
- data/lib/sass/importers/deprecated_path.rb +45 -0
- data/lib/sass/importers/filesystem.rb +25 -14
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +3 -3
- data/lib/sass/logger/log_level.rb +4 -6
- data/lib/sass/media.rb +19 -19
- data/lib/sass/plugin/compiler.rb +141 -101
- data/lib/sass/plugin/configuration.rb +18 -22
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +24 -8
- data/lib/sass/plugin.rb +4 -2
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script/css_lexer.rb +9 -4
- data/lib/sass/script/css_parser.rb +6 -2
- data/lib/sass/script/functions.rb +1343 -590
- data/lib/sass/script/lexer.rb +84 -52
- data/lib/sass/script/parser.rb +217 -97
- data/lib/sass/script/tree/funcall.rb +290 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
- data/lib/sass/script/tree/list_literal.rb +80 -0
- data/lib/sass/script/tree/literal.rb +47 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
- data/lib/sass/script/tree/selector.rb +30 -0
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +16 -0
- data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
- data/lib/sass/script/value/base.rb +248 -0
- data/lib/sass/script/value/bool.rb +36 -0
- data/lib/sass/script/{color.rb → value/color.rb} +239 -195
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +119 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +45 -0
- data/lib/sass/script/{number.rb → value/number.rb} +91 -65
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +11 -0
- data/lib/sass/script.rb +35 -8
- data/lib/sass/scss/css_parser.rb +2 -1
- data/lib/sass/scss/parser.rb +338 -170
- data/lib/sass/scss/rx.rb +5 -6
- data/lib/sass/scss/script_lexer.rb +1 -0
- data/lib/sass/scss/script_parser.rb +1 -0
- data/lib/sass/scss/static_parser.rb +23 -6
- data/lib/sass/selector/abstract_sequence.rb +2 -2
- data/lib/sass/selector/comma_sequence.rb +21 -16
- data/lib/sass/selector/sequence.rb +60 -34
- data/lib/sass/selector/simple.rb +11 -12
- data/lib/sass/selector/simple_sequence.rb +55 -33
- data/lib/sass/selector.rb +52 -48
- data/lib/sass/source/map.rb +211 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +120 -0
- data/lib/sass/supports.rb +12 -13
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +13 -2
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +13 -6
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +5 -4
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +4 -5
- data/lib/sass/tree/media_node.rb +4 -14
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +21 -8
- data/lib/sass/tree/node.rb +29 -12
- data/lib/sass/tree/prop_node.rb +38 -18
- data/lib/sass/tree/return_node.rb +3 -2
- data/lib/sass/tree/root_node.rb +19 -3
- data/lib/sass/tree/rule_node.rb +25 -17
- data/lib/sass/tree/supports_node.rb +0 -13
- data/lib/sass/tree/trace_node.rb +2 -1
- data/lib/sass/tree/variable_node.rb +9 -3
- data/lib/sass/tree/visitors/base.rb +6 -6
- data/lib/sass/tree/visitors/check_nesting.rb +12 -9
- data/lib/sass/tree/visitors/convert.rb +63 -38
- data/lib/sass/tree/visitors/cssize.rb +63 -23
- data/lib/sass/tree/visitors/deep_copy.rb +6 -5
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +256 -151
- data/lib/sass/tree/visitors/set_options.rb +6 -6
- data/lib/sass/tree/visitors/to_css.rb +231 -81
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util/multibyte_string_scanner.rb +2 -0
- data/lib/sass/util/normalized_map.rb +65 -0
- data/lib/sass/util/ordered_hash.rb +188 -0
- data/lib/sass/util/subset_map.rb +3 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +220 -34
- data/lib/sass/version.rb +9 -9
- data/lib/sass.rb +14 -7
- data/test/sass/compiler_test.rb +213 -0
- data/test/sass/conversion_test.rb +235 -9
- data/test/sass/engine_test.rb +230 -60
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +215 -147
- data/test/sass/functions_test.rb +584 -99
- data/test/sass/importer_test.rb +165 -17
- data/test/sass/plugin_test.rb +19 -13
- data/test/sass/script_conversion_test.rb +40 -0
- data/test/sass/script_test.rb +231 -21
- data/test/sass/scss/css_test.rb +14 -5
- data/test/sass/scss/scss_test.rb +1266 -66
- data/test/sass/source_map_test.rb +879 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/util/normalized_map_test.rb +30 -0
- data/test/sass/util_test.rb +90 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +7 -2
- metadata +316 -291
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -231
- data/lib/sass/script/list.rb +0 -84
- data/lib/sass/script/literal.rb +0 -239
- data/lib/sass/script/null.rb +0 -34
- data/lib/sass/script/variable.rb +0 -58
- data/test/Gemfile +0 -3
- data/vendor/listen/CHANGELOG.md +0 -221
- data/vendor/listen/CONTRIBUTING.md +0 -38
- data/vendor/listen/Gemfile +0 -30
- data/vendor/listen/Guardfile +0 -8
- data/vendor/listen/LICENSE +0 -20
- data/vendor/listen/README.md +0 -315
- data/vendor/listen/Rakefile +0 -47
- data/vendor/listen/Vagrantfile +0 -96
- data/vendor/listen/lib/listen/adapter.rb +0 -214
- data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
- data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
- data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
- data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
- data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/directory_record.rb +0 -371
- data/vendor/listen/lib/listen/listener.rb +0 -225
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/lib/listen/turnstile.rb +0 -28
- data/vendor/listen/lib/listen/version.rb +0 -3
- data/vendor/listen/lib/listen.rb +0 -40
- data/vendor/listen/listen.gemspec +0 -22
- data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
- data/vendor/listen/spec/listen/listener_spec.rb +0 -169
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
- data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
- data/vendor/listen/spec/listen_spec.rb +0 -73
- data/vendor/listen/spec/spec_helper.rb +0 -21
- data/vendor/listen/spec/support/adapter_helper.rb +0 -629
- data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
- data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
- data/vendor/listen/spec/support/listeners_helper.rb +0 -156
- data/vendor/listen/spec/support/platform_helper.rb +0 -15
|
@@ -27,11 +27,20 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
27
27
|
# Keeps track of the current parent node.
|
|
28
28
|
def visit_children(parent)
|
|
29
29
|
with_parent parent do
|
|
30
|
-
parent.children =
|
|
30
|
+
parent.children = visit_children_without_parent(parent)
|
|
31
31
|
parent
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
# Like {#visit\_children}, but doesn't set {#parent}.
|
|
36
|
+
#
|
|
37
|
+
# @param node [Sass::Tree::Node]
|
|
38
|
+
# @return [Array<Sass::Tree::Node>] the flattened results of
|
|
39
|
+
# visiting all the children of `node`
|
|
40
|
+
def visit_children_without_parent(node)
|
|
41
|
+
node.children.map {|c| visit(c)}.flatten
|
|
42
|
+
end
|
|
43
|
+
|
|
35
44
|
MERGEABLE_DIRECTIVES = [Sass::Tree::MediaNode]
|
|
36
45
|
|
|
37
46
|
# Runs a block of code with the current parent node
|
|
@@ -81,7 +90,7 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
81
90
|
node.children.each_with_index.find {|c, _| c.is_a?(Sass::Tree::CharsetNode)}
|
|
82
91
|
if charset_and_index
|
|
83
92
|
index = charset_and_index.last
|
|
84
|
-
node.children = node.children[0..index] + imports + node.children[index+1..-1]
|
|
93
|
+
node.children = node.children[0..index] + imports + node.children[index + 1..-1]
|
|
85
94
|
else
|
|
86
95
|
node.children = imports + node.children
|
|
87
96
|
end
|
|
@@ -94,7 +103,7 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
94
103
|
end
|
|
95
104
|
|
|
96
105
|
# A simple struct wrapping up information about a single `@extend` instance. A
|
|
97
|
-
# single
|
|
106
|
+
# single {ExtendNode} can have multiple Extends if either the parent node or
|
|
98
107
|
# the extended selector is a comma sequence.
|
|
99
108
|
#
|
|
100
109
|
# @attr extender [Sass::Selector::Sequence]
|
|
@@ -124,12 +133,12 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
124
133
|
end
|
|
125
134
|
|
|
126
135
|
sel = sseq.members
|
|
127
|
-
parent.resolved_rules.members.each do |
|
|
128
|
-
|
|
129
|
-
raise Sass::SyntaxError.new("#{
|
|
136
|
+
parent.resolved_rules.members.each do |member|
|
|
137
|
+
unless member.members.last.is_a?(Sass::Selector::SimpleSequence)
|
|
138
|
+
raise Sass::SyntaxError.new("#{member} can't extend: invalid selector")
|
|
130
139
|
end
|
|
131
140
|
|
|
132
|
-
@extends[sel] = Extend.new(
|
|
141
|
+
@extends[sel] = Extend.new(member, sel, node, @parent_directives.dup, :not_found)
|
|
133
142
|
end
|
|
134
143
|
end
|
|
135
144
|
|
|
@@ -138,8 +147,7 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
138
147
|
|
|
139
148
|
# Modifies exception backtraces to include the imported file.
|
|
140
149
|
def visit_import(node)
|
|
141
|
-
|
|
142
|
-
node.children.map {|c| visit(c)}.flatten
|
|
150
|
+
visit_children_without_parent(node)
|
|
143
151
|
rescue Sass::SyntaxError => e
|
|
144
152
|
e.modify_backtrace(:filename => node.children.first.filename)
|
|
145
153
|
e.add_backtrace(:filename => node.filename, :line => node.line)
|
|
@@ -150,28 +158,46 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
150
158
|
# and merges it with other `@media` directives.
|
|
151
159
|
def visit_media(node)
|
|
152
160
|
yield unless bubble(node)
|
|
153
|
-
|
|
154
|
-
node.children.
|
|
155
|
-
|
|
156
|
-
|
|
161
|
+
|
|
162
|
+
bubbled = node.children.select do |n|
|
|
163
|
+
n.is_a?(Sass::Tree::AtRootNode) || n.is_a?(Sass::Tree::MediaNode)
|
|
164
|
+
end
|
|
165
|
+
node.children -= bubbled
|
|
166
|
+
|
|
167
|
+
bubbled = bubbled.map do |n|
|
|
168
|
+
next visit(n) if n.is_a?(Sass::Tree::AtRootNode)
|
|
169
|
+
# Otherwise, n should be a MediaNode.
|
|
170
|
+
next [] unless n.resolved_query = n.resolved_query.merge(node.resolved_query)
|
|
171
|
+
n
|
|
172
|
+
end.flatten
|
|
173
|
+
|
|
174
|
+
(node.children.empty? ? [] : [node]) + bubbled
|
|
157
175
|
end
|
|
158
176
|
|
|
159
177
|
# Bubbles the `@supports` directive up through RuleNodes.
|
|
160
178
|
def visit_supports(node)
|
|
161
|
-
|
|
162
|
-
node
|
|
179
|
+
visit_directive(node) {yield}
|
|
163
180
|
end
|
|
164
181
|
|
|
165
182
|
# Asserts that all the traced children are valid in their new location.
|
|
166
183
|
def visit_trace(node)
|
|
167
|
-
|
|
168
|
-
node.children.map {|c| visit(c)}.flatten
|
|
184
|
+
visit_children_without_parent(node)
|
|
169
185
|
rescue Sass::SyntaxError => e
|
|
170
186
|
e.modify_backtrace(:mixin => node.name, :filename => node.filename, :line => node.line)
|
|
171
187
|
e.add_backtrace(:filename => node.filename, :line => node.line)
|
|
172
188
|
raise e
|
|
173
189
|
end
|
|
174
190
|
|
|
191
|
+
# Bubbles a directive up through RuleNodes.
|
|
192
|
+
def visit_directive(node)
|
|
193
|
+
return yield unless node.has_children
|
|
194
|
+
yield unless (bubbled = bubble(node))
|
|
195
|
+
at_roots = node.children.select {|n| n.is_a?(Sass::Tree::AtRootNode)}
|
|
196
|
+
node.children -= at_roots
|
|
197
|
+
at_roots.map! {|n| visit(n)}.flatten
|
|
198
|
+
(bubbled && node.children.empty? ? [] : [node]) + at_roots
|
|
199
|
+
end
|
|
200
|
+
|
|
175
201
|
# Converts nested properties into flat properties
|
|
176
202
|
# and updates the indentation of the prop node based on the nesting level.
|
|
177
203
|
def visit_prop(node)
|
|
@@ -191,18 +217,16 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
191
217
|
result
|
|
192
218
|
end
|
|
193
219
|
|
|
194
|
-
#
|
|
195
|
-
#
|
|
220
|
+
# Updates the indentation of the rule node based on the nesting
|
|
221
|
+
# level. The selectors were resolved in {Perform}.
|
|
196
222
|
def visit_rule(node)
|
|
197
|
-
parent_resolved_rules = parent.is_a?(Sass::Tree::RuleNode) ? parent.resolved_rules : nil
|
|
198
|
-
# It's possible for resolved_rules to be set if we've duplicated this node during @media bubbling
|
|
199
|
-
node.resolved_rules ||= node.parsed_rules.resolve_parent_refs(parent_resolved_rules)
|
|
200
|
-
|
|
201
223
|
yield
|
|
202
224
|
|
|
203
225
|
rules = node.children.select {|c| c.is_a?(Sass::Tree::RuleNode) || c.bubbles?}
|
|
204
226
|
props = node.children.reject {|c| c.is_a?(Sass::Tree::RuleNode) || c.bubbles? || c.invisible?}
|
|
205
227
|
|
|
228
|
+
rules.map {|c| c.is_a?(Sass::Tree::AtRootNode) ? visit(c) : c}.flatten
|
|
229
|
+
|
|
206
230
|
unless props.empty?
|
|
207
231
|
node.children = props
|
|
208
232
|
rules.each {|r| r.tabs += 1} if node.style == :nested
|
|
@@ -214,6 +238,22 @@ class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
|
|
|
214
238
|
rules
|
|
215
239
|
end
|
|
216
240
|
|
|
241
|
+
def visit_atroot(node)
|
|
242
|
+
if @parent_directives.any? {|n| node.exclude_node?(n)}
|
|
243
|
+
return node if node.exclude_node?(parent)
|
|
244
|
+
|
|
245
|
+
new_rule = parent.dup
|
|
246
|
+
new_rule.children = node.children
|
|
247
|
+
node.children = [new_rule]
|
|
248
|
+
return node
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
results = visit_children_without_parent(node)
|
|
252
|
+
results.each {|n| n.tabs += node.tabs}
|
|
253
|
+
results.last.group_end = node.group_end unless results.empty?
|
|
254
|
+
results
|
|
255
|
+
end
|
|
256
|
+
|
|
217
257
|
private
|
|
218
258
|
|
|
219
259
|
def bubble(node)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# A visitor for copying the full structure of a Sass tree.
|
|
2
2
|
class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
|
3
|
+
|
|
3
4
|
protected
|
|
4
5
|
|
|
5
6
|
def visit(node)
|
|
@@ -22,7 +23,7 @@ class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
def visit_extend(node)
|
|
25
|
-
node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
|
26
|
+
node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
|
|
26
27
|
yield
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -55,7 +56,7 @@ class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
def visit_prop(node)
|
|
58
|
-
node.name = node.name.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
|
59
|
+
node.name = node.name.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
|
|
59
60
|
node.value = node.value.deep_copy
|
|
60
61
|
yield
|
|
61
62
|
end
|
|
@@ -66,7 +67,7 @@ class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def visit_rule(node)
|
|
69
|
-
node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
|
70
|
+
node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
|
|
70
71
|
yield
|
|
71
72
|
end
|
|
72
73
|
|
|
@@ -86,12 +87,12 @@ class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
|
|
|
86
87
|
end
|
|
87
88
|
|
|
88
89
|
def visit_directive(node)
|
|
89
|
-
node.value = node.value.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
|
90
|
+
node.value = node.value.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
|
|
90
91
|
yield
|
|
91
92
|
end
|
|
92
93
|
|
|
93
94
|
def visit_media(node)
|
|
94
|
-
node.query = node.query.map {|c| c.is_a?(Sass::Script::Node) ? c.deep_copy : c}
|
|
95
|
+
node.query = node.query.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
|
|
95
96
|
yield
|
|
96
97
|
end
|
|
97
98
|
|
|
@@ -49,7 +49,7 @@ class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
|
|
|
49
49
|
def self.check_extends_fired!(extends)
|
|
50
50
|
extends.each_value do |ex|
|
|
51
51
|
next if ex.result == :succeeded || ex.node.optional?
|
|
52
|
-
|
|
52
|
+
message = "\"#{ex.extender}\" failed to @extend \"#{ex.target.join}\"."
|
|
53
53
|
reason =
|
|
54
54
|
if ex.result == :not_found
|
|
55
55
|
"The selector \"#{ex.target.join}\" was not found."
|
|
@@ -57,12 +57,12 @@ class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
|
|
|
57
57
|
"No selectors matching \"#{ex.target.join}\" could be unified with \"#{ex.extender}\"."
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
Sass
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
# TODO(nweiz): this should use the Sass stack trace of the extend node.
|
|
61
|
+
raise Sass::SyntaxError.new(<<MESSAGE, :filename => ex.node.filename, :line => ex.node.line)
|
|
62
|
+
#{message}
|
|
63
|
+
#{reason}
|
|
64
|
+
Use "@extend #{ex.target.join} !optional" if the extend should be able to fail.
|
|
65
|
+
MESSAGE
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
end
|