sassc4 2.4.0

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.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. metadata +396 -0
@@ -0,0 +1,953 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include "ast.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ static Null sass_null(SourceSpan("null"));
10
+
11
+ const char* sass_op_to_name(enum Sass_OP op) {
12
+ switch (op) {
13
+ case AND: return "and";
14
+ case OR: return "or";
15
+ case EQ: return "eq";
16
+ case NEQ: return "neq";
17
+ case GT: return "gt";
18
+ case GTE: return "gte";
19
+ case LT: return "lt";
20
+ case LTE: return "lte";
21
+ case ADD: return "plus";
22
+ case SUB: return "minus";
23
+ case MUL: return "times";
24
+ case DIV: return "div";
25
+ case MOD: return "mod";
26
+ // this is only used internally!
27
+ case NUM_OPS: return "[OPS]";
28
+ default: return "invalid";
29
+ }
30
+ }
31
+
32
+ const char* sass_op_separator(enum Sass_OP op) {
33
+ switch (op) {
34
+ case AND: return "&&";
35
+ case OR: return "||";
36
+ case EQ: return "==";
37
+ case NEQ: return "!=";
38
+ case GT: return ">";
39
+ case GTE: return ">=";
40
+ case LT: return "<";
41
+ case LTE: return "<=";
42
+ case ADD: return "+";
43
+ case SUB: return "-";
44
+ case MUL: return "*";
45
+ case DIV: return "/";
46
+ case MOD: return "%";
47
+ // this is only used internally!
48
+ case NUM_OPS: return "[OPS]";
49
+ default: return "invalid";
50
+ }
51
+ }
52
+
53
+ /////////////////////////////////////////////////////////////////////////
54
+ /////////////////////////////////////////////////////////////////////////
55
+
56
+ void AST_Node::update_pstate(const SourceSpan& pstate)
57
+ {
58
+ pstate_.offset += pstate.position - pstate_.position + pstate.offset;
59
+ }
60
+
61
+ sass::string AST_Node::to_string(Sass_Inspect_Options opt) const
62
+ {
63
+ Sass_Output_Options out(opt);
64
+ Emitter emitter(out);
65
+ Inspect i(emitter);
66
+ i.in_declaration = true;
67
+ // ToDo: inspect should be const
68
+ const_cast<AST_Node*>(this)->perform(&i);
69
+ return i.get_buffer();
70
+ }
71
+
72
+ sass::string AST_Node::to_css(Sass_Inspect_Options opt) const
73
+ {
74
+ opt.output_style = TO_CSS;
75
+ Sass_Output_Options out(opt);
76
+ Emitter emitter(out);
77
+ Inspect i(emitter);
78
+ i.in_declaration = true;
79
+ // ToDo: inspect should be const
80
+ const_cast<AST_Node*>(this)->perform(&i);
81
+ return i.get_buffer();
82
+ }
83
+
84
+ sass::string AST_Node::to_string() const
85
+ {
86
+ return to_string({ NESTED, 5 });
87
+ }
88
+
89
+ /////////////////////////////////////////////////////////////////////////
90
+ /////////////////////////////////////////////////////////////////////////
91
+
92
+ Statement::Statement(SourceSpan pstate, Type st, size_t t)
93
+ : AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
94
+ { }
95
+ Statement::Statement(const Statement* ptr)
96
+ : AST_Node(ptr),
97
+ statement_type_(ptr->statement_type_),
98
+ tabs_(ptr->tabs_),
99
+ group_end_(ptr->group_end_)
100
+ { }
101
+
102
+ bool Statement::bubbles()
103
+ {
104
+ return false;
105
+ }
106
+
107
+ bool Statement::has_content()
108
+ {
109
+ return statement_type_ == CONTENT;
110
+ }
111
+
112
+ bool Statement::is_invisible() const
113
+ {
114
+ return false;
115
+ }
116
+
117
+ /////////////////////////////////////////////////////////////////////////
118
+ /////////////////////////////////////////////////////////////////////////
119
+
120
+ Block::Block(SourceSpan pstate, size_t s, bool r)
121
+ : Statement(pstate),
122
+ Vectorized<Statement_Obj>(s),
123
+ is_root_(r)
124
+ { }
125
+ Block::Block(const Block* ptr)
126
+ : Statement(ptr),
127
+ Vectorized<Statement_Obj>(*ptr),
128
+ is_root_(ptr->is_root_)
129
+ { }
130
+
131
+ bool Block::isInvisible() const
132
+ {
133
+ for (auto& item : elements()) {
134
+ if (!item->is_invisible()) return false;
135
+ }
136
+ return true;
137
+ }
138
+
139
+ bool Block::has_content()
140
+ {
141
+ for (size_t i = 0, L = elements().size(); i < L; ++i) {
142
+ if (elements()[i]->has_content()) return true;
143
+ }
144
+ return Statement::has_content();
145
+ }
146
+
147
+ /////////////////////////////////////////////////////////////////////////
148
+ /////////////////////////////////////////////////////////////////////////
149
+
150
+ ParentStatement::ParentStatement(SourceSpan pstate, Block_Obj b)
151
+ : Statement(pstate), block_(b)
152
+ { }
153
+ ParentStatement::ParentStatement(const ParentStatement* ptr)
154
+ : Statement(ptr), block_(ptr->block_)
155
+ { }
156
+
157
+ bool ParentStatement::has_content()
158
+ {
159
+ return (block_ && block_->has_content()) || Statement::has_content();
160
+ }
161
+
162
+ /////////////////////////////////////////////////////////////////////////
163
+ /////////////////////////////////////////////////////////////////////////
164
+
165
+ StyleRule::StyleRule(SourceSpan pstate, SelectorListObj s, Block_Obj b)
166
+ : ParentStatement(pstate, b), selector_(s), schema_(), is_root_(false)
167
+ { statement_type(RULESET); }
168
+ StyleRule::StyleRule(const StyleRule* ptr)
169
+ : ParentStatement(ptr),
170
+ selector_(ptr->selector_),
171
+ schema_(ptr->schema_),
172
+ is_root_(ptr->is_root_)
173
+ { statement_type(RULESET); }
174
+
175
+ bool StyleRule::is_invisible() const {
176
+ if (const SelectorList * sl = Cast<SelectorList>(selector())) {
177
+ for (size_t i = 0, L = sl->length(); i < L; i += 1)
178
+ if (!(*sl)[i]->isInvisible()) return false;
179
+ }
180
+ return true;
181
+ }
182
+
183
+ /////////////////////////////////////////////////////////////////////////
184
+ /////////////////////////////////////////////////////////////////////////
185
+
186
+ Bubble::Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g, size_t t)
187
+ : Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == nullptr)
188
+ { }
189
+ Bubble::Bubble(const Bubble* ptr)
190
+ : Statement(ptr),
191
+ node_(ptr->node_),
192
+ group_end_(ptr->group_end_)
193
+ { }
194
+
195
+ bool Bubble::bubbles()
196
+ {
197
+ return true;
198
+ }
199
+
200
+ /////////////////////////////////////////////////////////////////////////
201
+ /////////////////////////////////////////////////////////////////////////
202
+
203
+ Trace::Trace(SourceSpan pstate, sass::string n, Block_Obj b, char type)
204
+ : ParentStatement(pstate, b), type_(type), name_(n)
205
+ { }
206
+ Trace::Trace(const Trace* ptr)
207
+ : ParentStatement(ptr),
208
+ type_(ptr->type_),
209
+ name_(ptr->name_)
210
+ { }
211
+
212
+ /////////////////////////////////////////////////////////////////////////
213
+ /////////////////////////////////////////////////////////////////////////
214
+
215
+ AtRule::AtRule(SourceSpan pstate, sass::string kwd, SelectorListObj sel, Block_Obj b, ExpressionObj val)
216
+ : ParentStatement(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
217
+ { statement_type(DIRECTIVE); }
218
+ AtRule::AtRule(const AtRule* ptr)
219
+ : ParentStatement(ptr),
220
+ keyword_(ptr->keyword_),
221
+ selector_(ptr->selector_),
222
+ value_(ptr->value_) // set value manually if needed
223
+ { statement_type(DIRECTIVE); }
224
+
225
+ bool AtRule::bubbles() { return is_keyframes() || is_media(); }
226
+
227
+ bool AtRule::is_media() {
228
+ return keyword_.compare("@-webkit-media") == 0 ||
229
+ keyword_.compare("@-moz-media") == 0 ||
230
+ keyword_.compare("@-o-media") == 0 ||
231
+ keyword_.compare("@media") == 0;
232
+ }
233
+ bool AtRule::is_keyframes() {
234
+ return keyword_.compare("@-webkit-keyframes") == 0 ||
235
+ keyword_.compare("@-moz-keyframes") == 0 ||
236
+ keyword_.compare("@-o-keyframes") == 0 ||
237
+ keyword_.compare("@keyframes") == 0;
238
+ }
239
+
240
+ /////////////////////////////////////////////////////////////////////////
241
+ /////////////////////////////////////////////////////////////////////////
242
+
243
+ Keyframe_Rule::Keyframe_Rule(SourceSpan pstate, Block_Obj b)
244
+ : ParentStatement(pstate, b), name_()
245
+ { statement_type(KEYFRAMERULE); }
246
+ Keyframe_Rule::Keyframe_Rule(const Keyframe_Rule* ptr)
247
+ : ParentStatement(ptr), name_(ptr->name_)
248
+ { statement_type(KEYFRAMERULE); }
249
+
250
+ /////////////////////////////////////////////////////////////////////////
251
+ /////////////////////////////////////////////////////////////////////////
252
+
253
+ Declaration::Declaration(SourceSpan pstate, String_Obj prop, ExpressionObj val, bool i, bool c, Block_Obj b)
254
+ : ParentStatement(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
255
+ { statement_type(DECLARATION); }
256
+ Declaration::Declaration(const Declaration* ptr)
257
+ : ParentStatement(ptr),
258
+ property_(ptr->property_),
259
+ value_(ptr->value_),
260
+ is_important_(ptr->is_important_),
261
+ is_custom_property_(ptr->is_custom_property_),
262
+ is_indented_(ptr->is_indented_)
263
+ { statement_type(DECLARATION); }
264
+
265
+ bool Declaration::is_invisible() const
266
+ {
267
+ if (is_custom_property()) return false;
268
+ return !(value_ && !Cast<Null>(value_));
269
+ }
270
+
271
+ /////////////////////////////////////////////////////////////////////////
272
+ /////////////////////////////////////////////////////////////////////////
273
+
274
+ Assignment::Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default, bool is_global)
275
+ : Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
276
+ { statement_type(ASSIGNMENT); }
277
+ Assignment::Assignment(const Assignment* ptr)
278
+ : Statement(ptr),
279
+ variable_(ptr->variable_),
280
+ value_(ptr->value_),
281
+ is_default_(ptr->is_default_),
282
+ is_global_(ptr->is_global_)
283
+ { statement_type(ASSIGNMENT); }
284
+
285
+ /////////////////////////////////////////////////////////////////////////
286
+ /////////////////////////////////////////////////////////////////////////
287
+
288
+ Import::Import(SourceSpan pstate)
289
+ : Statement(pstate),
290
+ urls_(sass::vector<ExpressionObj>()),
291
+ incs_(sass::vector<Include>()),
292
+ import_queries_()
293
+ { statement_type(IMPORT); }
294
+ Import::Import(const Import* ptr)
295
+ : Statement(ptr),
296
+ urls_(ptr->urls_),
297
+ incs_(ptr->incs_),
298
+ import_queries_(ptr->import_queries_)
299
+ { statement_type(IMPORT); }
300
+
301
+ sass::vector<Include>& Import::incs() { return incs_; }
302
+ sass::vector<ExpressionObj>& Import::urls() { return urls_; }
303
+
304
+ /////////////////////////////////////////////////////////////////////////
305
+ /////////////////////////////////////////////////////////////////////////
306
+
307
+ Import_Stub::Import_Stub(SourceSpan pstate, Include res)
308
+ : Statement(pstate), resource_(res)
309
+ { statement_type(IMPORT_STUB); }
310
+ Import_Stub::Import_Stub(const Import_Stub* ptr)
311
+ : Statement(ptr), resource_(ptr->resource_)
312
+ { statement_type(IMPORT_STUB); }
313
+ Include Import_Stub::resource() { return resource_; };
314
+ sass::string Import_Stub::imp_path() { return resource_.imp_path; };
315
+ sass::string Import_Stub::abs_path() { return resource_.abs_path; };
316
+
317
+ /////////////////////////////////////////////////////////////////////////
318
+ /////////////////////////////////////////////////////////////////////////
319
+
320
+ WarningRule::WarningRule(SourceSpan pstate, ExpressionObj msg)
321
+ : Statement(pstate), message_(msg)
322
+ { statement_type(WARNING); }
323
+ WarningRule::WarningRule(const WarningRule* ptr)
324
+ : Statement(ptr), message_(ptr->message_)
325
+ { statement_type(WARNING); }
326
+
327
+ /////////////////////////////////////////////////////////////////////////
328
+ /////////////////////////////////////////////////////////////////////////
329
+
330
+ ErrorRule::ErrorRule(SourceSpan pstate, ExpressionObj msg)
331
+ : Statement(pstate), message_(msg)
332
+ { statement_type(ERROR); }
333
+ ErrorRule::ErrorRule(const ErrorRule* ptr)
334
+ : Statement(ptr), message_(ptr->message_)
335
+ { statement_type(ERROR); }
336
+
337
+ /////////////////////////////////////////////////////////////////////////
338
+ /////////////////////////////////////////////////////////////////////////
339
+
340
+ DebugRule::DebugRule(SourceSpan pstate, ExpressionObj val)
341
+ : Statement(pstate), value_(val)
342
+ { statement_type(DEBUGSTMT); }
343
+ DebugRule::DebugRule(const DebugRule* ptr)
344
+ : Statement(ptr), value_(ptr->value_)
345
+ { statement_type(DEBUGSTMT); }
346
+
347
+ /////////////////////////////////////////////////////////////////////////
348
+ /////////////////////////////////////////////////////////////////////////
349
+
350
+ Comment::Comment(SourceSpan pstate, String_Obj txt, bool is_important)
351
+ : Statement(pstate), text_(txt), is_important_(is_important)
352
+ { statement_type(COMMENT); }
353
+ Comment::Comment(const Comment* ptr)
354
+ : Statement(ptr),
355
+ text_(ptr->text_),
356
+ is_important_(ptr->is_important_)
357
+ { statement_type(COMMENT); }
358
+
359
+ bool Comment::is_invisible() const
360
+ {
361
+ return false;
362
+ }
363
+
364
+ /////////////////////////////////////////////////////////////////////////
365
+ /////////////////////////////////////////////////////////////////////////
366
+
367
+ If::If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt)
368
+ : ParentStatement(pstate, con), predicate_(pred), alternative_(alt)
369
+ { statement_type(IF); }
370
+ If::If(const If* ptr)
371
+ : ParentStatement(ptr),
372
+ predicate_(ptr->predicate_),
373
+ alternative_(ptr->alternative_)
374
+ { statement_type(IF); }
375
+
376
+ bool If::has_content()
377
+ {
378
+ return ParentStatement::has_content() || (alternative_ && alternative_->has_content());
379
+ }
380
+
381
+ /////////////////////////////////////////////////////////////////////////
382
+ /////////////////////////////////////////////////////////////////////////
383
+
384
+ ForRule::ForRule(SourceSpan pstate,
385
+ sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc)
386
+ : ParentStatement(pstate, b),
387
+ variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
388
+ { statement_type(FOR); }
389
+ ForRule::ForRule(const ForRule* ptr)
390
+ : ParentStatement(ptr),
391
+ variable_(ptr->variable_),
392
+ lower_bound_(ptr->lower_bound_),
393
+ upper_bound_(ptr->upper_bound_),
394
+ is_inclusive_(ptr->is_inclusive_)
395
+ { statement_type(FOR); }
396
+
397
+ /////////////////////////////////////////////////////////////////////////
398
+ /////////////////////////////////////////////////////////////////////////
399
+
400
+ EachRule::EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b)
401
+ : ParentStatement(pstate, b), variables_(vars), list_(lst)
402
+ { statement_type(EACH); }
403
+ EachRule::EachRule(const EachRule* ptr)
404
+ : ParentStatement(ptr), variables_(ptr->variables_), list_(ptr->list_)
405
+ { statement_type(EACH); }
406
+
407
+ /////////////////////////////////////////////////////////////////////////
408
+ /////////////////////////////////////////////////////////////////////////
409
+
410
+ WhileRule::WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b)
411
+ : ParentStatement(pstate, b), predicate_(pred)
412
+ { statement_type(WHILE); }
413
+ WhileRule::WhileRule(const WhileRule* ptr)
414
+ : ParentStatement(ptr), predicate_(ptr->predicate_)
415
+ { statement_type(WHILE); }
416
+
417
+ /////////////////////////////////////////////////////////////////////////
418
+ /////////////////////////////////////////////////////////////////////////
419
+
420
+ Return::Return(SourceSpan pstate, ExpressionObj val)
421
+ : Statement(pstate), value_(val)
422
+ { statement_type(RETURN); }
423
+ Return::Return(const Return* ptr)
424
+ : Statement(ptr), value_(ptr->value_)
425
+ { statement_type(RETURN); }
426
+
427
+ /////////////////////////////////////////////////////////////////////////
428
+ /////////////////////////////////////////////////////////////////////////
429
+
430
+ ExtendRule::ExtendRule(SourceSpan pstate, SelectorListObj s)
431
+ : Statement(pstate), isOptional_(false), selector_(s), schema_()
432
+ { statement_type(EXTEND); }
433
+ ExtendRule::ExtendRule(SourceSpan pstate, Selector_Schema_Obj s)
434
+ : Statement(pstate), isOptional_(false), selector_(), schema_(s)
435
+ {
436
+ statement_type(EXTEND);
437
+ }
438
+ ExtendRule::ExtendRule(const ExtendRule* ptr)
439
+ : Statement(ptr),
440
+ isOptional_(ptr->isOptional_),
441
+ selector_(ptr->selector_),
442
+ schema_(ptr->schema_)
443
+ { statement_type(EXTEND); }
444
+
445
+ /////////////////////////////////////////////////////////////////////////
446
+ /////////////////////////////////////////////////////////////////////////
447
+
448
+ Definition::Definition(const Definition* ptr)
449
+ : ParentStatement(ptr),
450
+ name_(ptr->name_),
451
+ parameters_(ptr->parameters_),
452
+ environment_(ptr->environment_),
453
+ type_(ptr->type_),
454
+ native_function_(ptr->native_function_),
455
+ c_function_(ptr->c_function_),
456
+ cookie_(ptr->cookie_),
457
+ is_overload_stub_(ptr->is_overload_stub_),
458
+ signature_(ptr->signature_)
459
+ { }
460
+
461
+ Definition::Definition(SourceSpan pstate,
462
+ sass::string n,
463
+ Parameters_Obj params,
464
+ Block_Obj b,
465
+ Type t)
466
+ : ParentStatement(pstate, b),
467
+ name_(n),
468
+ parameters_(params),
469
+ environment_(0),
470
+ type_(t),
471
+ native_function_(0),
472
+ c_function_(0),
473
+ cookie_(0),
474
+ is_overload_stub_(false),
475
+ signature_(0)
476
+ { }
477
+
478
+ Definition::Definition(SourceSpan pstate,
479
+ Signature sig,
480
+ sass::string n,
481
+ Parameters_Obj params,
482
+ Native_Function func_ptr,
483
+ bool overload_stub)
484
+ : ParentStatement(pstate, {}),
485
+ name_(n),
486
+ parameters_(params),
487
+ environment_(0),
488
+ type_(FUNCTION),
489
+ native_function_(func_ptr),
490
+ c_function_(0),
491
+ cookie_(0),
492
+ is_overload_stub_(overload_stub),
493
+ signature_(sig)
494
+ { }
495
+
496
+ Definition::Definition(SourceSpan pstate,
497
+ Signature sig,
498
+ sass::string n,
499
+ Parameters_Obj params,
500
+ Sass_Function_Entry c_func)
501
+ : ParentStatement(pstate, {}),
502
+ name_(n),
503
+ parameters_(params),
504
+ environment_(0),
505
+ type_(FUNCTION),
506
+ native_function_(0),
507
+ c_function_(c_func),
508
+ cookie_(sass_function_get_cookie(c_func)),
509
+ is_overload_stub_(false),
510
+ signature_(sig)
511
+ { }
512
+
513
+ /////////////////////////////////////////////////////////////////////////
514
+ /////////////////////////////////////////////////////////////////////////
515
+
516
+ Mixin_Call::Mixin_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Parameters_Obj b_params, Block_Obj b)
517
+ : ParentStatement(pstate, b), name_(n), arguments_(args), block_parameters_(b_params)
518
+ { }
519
+ Mixin_Call::Mixin_Call(const Mixin_Call* ptr)
520
+ : ParentStatement(ptr),
521
+ name_(ptr->name_),
522
+ arguments_(ptr->arguments_),
523
+ block_parameters_(ptr->block_parameters_)
524
+ { }
525
+
526
+ /////////////////////////////////////////////////////////////////////////
527
+ /////////////////////////////////////////////////////////////////////////
528
+
529
+ Content::Content(SourceSpan pstate, Arguments_Obj args)
530
+ : Statement(pstate),
531
+ arguments_(args)
532
+ { statement_type(CONTENT); }
533
+ Content::Content(const Content* ptr)
534
+ : Statement(ptr),
535
+ arguments_(ptr->arguments_)
536
+ { statement_type(CONTENT); }
537
+
538
+ /////////////////////////////////////////////////////////////////////////
539
+ /////////////////////////////////////////////////////////////////////////
540
+
541
+ Expression::Expression(SourceSpan pstate, bool d, bool e, bool i, Type ct)
542
+ : AST_Node(pstate),
543
+ is_delayed_(d),
544
+ is_expanded_(e),
545
+ is_interpolant_(i),
546
+ concrete_type_(ct)
547
+ { }
548
+
549
+ Expression::Expression(const Expression* ptr)
550
+ : AST_Node(ptr),
551
+ is_delayed_(ptr->is_delayed_),
552
+ is_expanded_(ptr->is_expanded_),
553
+ is_interpolant_(ptr->is_interpolant_),
554
+ concrete_type_(ptr->concrete_type_)
555
+ { }
556
+
557
+ /////////////////////////////////////////////////////////////////////////
558
+ /////////////////////////////////////////////////////////////////////////
559
+
560
+ Unary_Expression::Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o)
561
+ : Expression(pstate), optype_(t), operand_(o), hash_(0)
562
+ { }
563
+ Unary_Expression::Unary_Expression(const Unary_Expression* ptr)
564
+ : Expression(ptr),
565
+ optype_(ptr->optype_),
566
+ operand_(ptr->operand_),
567
+ hash_(ptr->hash_)
568
+ { }
569
+ const sass::string Unary_Expression::type_name() {
570
+ switch (optype_) {
571
+ case PLUS: return "plus";
572
+ case MINUS: return "minus";
573
+ case SLASH: return "slash";
574
+ case NOT: return "not";
575
+ default: return "invalid";
576
+ }
577
+ }
578
+ bool Unary_Expression::operator==(const Expression& rhs) const
579
+ {
580
+ try
581
+ {
582
+ const Unary_Expression* m = Cast<Unary_Expression>(&rhs);
583
+ if (m == 0) return false;
584
+ return type() == m->type() &&
585
+ *operand() == *m->operand();
586
+ }
587
+ catch (std::bad_cast&)
588
+ {
589
+ return false;
590
+ }
591
+ catch (...) { throw; }
592
+ }
593
+ size_t Unary_Expression::hash() const
594
+ {
595
+ if (hash_ == 0) {
596
+ hash_ = std::hash<size_t>()(optype_);
597
+ hash_combine(hash_, operand()->hash());
598
+ };
599
+ return hash_;
600
+ }
601
+
602
+ /////////////////////////////////////////////////////////////////////////
603
+ /////////////////////////////////////////////////////////////////////////
604
+
605
+ Argument::Argument(SourceSpan pstate, ExpressionObj val, sass::string n, bool rest, bool keyword)
606
+ : Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
607
+ {
608
+ if (!name_.empty() && is_rest_argument_) {
609
+ coreError("variable-length argument may not be passed by name", pstate_);
610
+ }
611
+ }
612
+ Argument::Argument(const Argument* ptr)
613
+ : Expression(ptr),
614
+ value_(ptr->value_),
615
+ name_(ptr->name_),
616
+ is_rest_argument_(ptr->is_rest_argument_),
617
+ is_keyword_argument_(ptr->is_keyword_argument_),
618
+ hash_(ptr->hash_)
619
+ {
620
+ if (!name_.empty() && is_rest_argument_) {
621
+ coreError("variable-length argument may not be passed by name", pstate_);
622
+ }
623
+ }
624
+
625
+ void Argument::set_delayed(bool delayed)
626
+ {
627
+ if (value_) value_->set_delayed(delayed);
628
+ is_delayed(delayed);
629
+ }
630
+
631
+ bool Argument::operator==(const Expression& rhs) const
632
+ {
633
+ try
634
+ {
635
+ const Argument* m = Cast<Argument>(&rhs);
636
+ if (!(m && name() == m->name())) return false;
637
+ return *value() == *m->value();
638
+ }
639
+ catch (std::bad_cast&)
640
+ {
641
+ return false;
642
+ }
643
+ catch (...) { throw; }
644
+ }
645
+
646
+ size_t Argument::hash() const
647
+ {
648
+ if (hash_ == 0) {
649
+ hash_ = std::hash<sass::string>()(name());
650
+ hash_combine(hash_, value()->hash());
651
+ }
652
+ return hash_;
653
+ }
654
+
655
+ /////////////////////////////////////////////////////////////////////////
656
+ /////////////////////////////////////////////////////////////////////////
657
+
658
+ Arguments::Arguments(SourceSpan pstate)
659
+ : Expression(pstate),
660
+ Vectorized<Argument_Obj>(),
661
+ has_named_arguments_(false),
662
+ has_rest_argument_(false),
663
+ has_keyword_argument_(false)
664
+ { }
665
+ Arguments::Arguments(const Arguments* ptr)
666
+ : Expression(ptr),
667
+ Vectorized<Argument_Obj>(*ptr),
668
+ has_named_arguments_(ptr->has_named_arguments_),
669
+ has_rest_argument_(ptr->has_rest_argument_),
670
+ has_keyword_argument_(ptr->has_keyword_argument_)
671
+ { }
672
+
673
+ void Arguments::set_delayed(bool delayed)
674
+ {
675
+ for (Argument_Obj arg : elements()) {
676
+ if (arg) arg->set_delayed(delayed);
677
+ }
678
+ is_delayed(delayed);
679
+ }
680
+
681
+ Argument_Obj Arguments::get_rest_argument()
682
+ {
683
+ if (this->has_rest_argument()) {
684
+ for (Argument_Obj arg : this->elements()) {
685
+ if (arg->is_rest_argument()) {
686
+ return arg;
687
+ }
688
+ }
689
+ }
690
+ return {};
691
+ }
692
+
693
+ Argument_Obj Arguments::get_keyword_argument()
694
+ {
695
+ if (this->has_keyword_argument()) {
696
+ for (Argument_Obj arg : this->elements()) {
697
+ if (arg->is_keyword_argument()) {
698
+ return arg;
699
+ }
700
+ }
701
+ }
702
+ return {};
703
+ }
704
+
705
+ void Arguments::adjust_after_pushing(Argument_Obj a)
706
+ {
707
+ if (!a->name().empty()) {
708
+ if (has_keyword_argument()) {
709
+ coreError("named arguments must precede variable-length argument", a->pstate());
710
+ }
711
+ has_named_arguments(true);
712
+ }
713
+ else if (a->is_rest_argument()) {
714
+ if (has_rest_argument()) {
715
+ coreError("functions and mixins may only be called with one variable-length argument", a->pstate());
716
+ }
717
+ if (has_keyword_argument_) {
718
+ coreError("only keyword arguments may follow variable arguments", a->pstate());
719
+ }
720
+ has_rest_argument(true);
721
+ }
722
+ else if (a->is_keyword_argument()) {
723
+ if (has_keyword_argument()) {
724
+ coreError("functions and mixins may only be called with one keyword argument", a->pstate());
725
+ }
726
+ has_keyword_argument(true);
727
+ }
728
+ else {
729
+ if (has_rest_argument()) {
730
+ coreError("ordinal arguments must precede variable-length arguments", a->pstate());
731
+ }
732
+ if (has_named_arguments()) {
733
+ coreError("ordinal arguments must precede named arguments", a->pstate());
734
+ }
735
+ }
736
+ }
737
+
738
+ /////////////////////////////////////////////////////////////////////////
739
+ /////////////////////////////////////////////////////////////////////////
740
+
741
+ Media_Query::Media_Query(SourceSpan pstate, String_Obj t, size_t s, bool n, bool r)
742
+ : Expression(pstate), Vectorized<Media_Query_ExpressionObj>(s),
743
+ media_type_(t), is_negated_(n), is_restricted_(r)
744
+ { }
745
+ Media_Query::Media_Query(const Media_Query* ptr)
746
+ : Expression(ptr),
747
+ Vectorized<Media_Query_ExpressionObj>(*ptr),
748
+ media_type_(ptr->media_type_),
749
+ is_negated_(ptr->is_negated_),
750
+ is_restricted_(ptr->is_restricted_)
751
+ { }
752
+
753
+ /////////////////////////////////////////////////////////////////////////
754
+ /////////////////////////////////////////////////////////////////////////
755
+
756
+ Media_Query_Expression::Media_Query_Expression(SourceSpan pstate,
757
+ ExpressionObj f, ExpressionObj v, bool i)
758
+ : Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
759
+ { }
760
+ Media_Query_Expression::Media_Query_Expression(const Media_Query_Expression* ptr)
761
+ : Expression(ptr),
762
+ feature_(ptr->feature_),
763
+ value_(ptr->value_),
764
+ is_interpolated_(ptr->is_interpolated_)
765
+ { }
766
+
767
+ /////////////////////////////////////////////////////////////////////////
768
+ /////////////////////////////////////////////////////////////////////////
769
+
770
+ At_Root_Query::At_Root_Query(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i)
771
+ : Expression(pstate), feature_(f), value_(v)
772
+ { }
773
+ At_Root_Query::At_Root_Query(const At_Root_Query* ptr)
774
+ : Expression(ptr),
775
+ feature_(ptr->feature_),
776
+ value_(ptr->value_)
777
+ { }
778
+
779
+ bool At_Root_Query::exclude(sass::string str)
780
+ {
781
+ bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
782
+ List* l = static_cast<List*>(value().ptr());
783
+ sass::string v;
784
+
785
+ if (with)
786
+ {
787
+ if (!l || l->length() == 0) return str.compare("rule") != 0;
788
+ for (size_t i = 0, L = l->length(); i < L; ++i)
789
+ {
790
+ v = unquote((*l)[i]->to_string());
791
+ if (v.compare("all") == 0 || v == str) return false;
792
+ }
793
+ return true;
794
+ }
795
+ else
796
+ {
797
+ if (!l || !l->length()) return str.compare("rule") == 0;
798
+ for (size_t i = 0, L = l->length(); i < L; ++i)
799
+ {
800
+ v = unquote((*l)[i]->to_string());
801
+ if (v.compare("all") == 0 || v == str) return true;
802
+ }
803
+ return false;
804
+ }
805
+ }
806
+
807
+ /////////////////////////////////////////////////////////////////////////
808
+ /////////////////////////////////////////////////////////////////////////
809
+
810
+ AtRootRule::AtRootRule(SourceSpan pstate, Block_Obj b, At_Root_Query_Obj e)
811
+ : ParentStatement(pstate, b), expression_(e)
812
+ { statement_type(ATROOT); }
813
+ AtRootRule::AtRootRule(const AtRootRule* ptr)
814
+ : ParentStatement(ptr), expression_(ptr->expression_)
815
+ { statement_type(ATROOT); }
816
+
817
+ bool AtRootRule::bubbles() {
818
+ return true;
819
+ }
820
+
821
+ bool AtRootRule::exclude_node(Statement_Obj s) {
822
+ if (expression() == nullptr)
823
+ {
824
+ return s->statement_type() == Statement::RULESET;
825
+ }
826
+
827
+ if (s->statement_type() == Statement::DIRECTIVE)
828
+ {
829
+ if (AtRuleObj dir = Cast<AtRule>(s))
830
+ {
831
+ sass::string keyword(dir->keyword());
832
+ if (keyword.length() > 0) keyword.erase(0, 1);
833
+ return expression()->exclude(keyword);
834
+ }
835
+ }
836
+ if (s->statement_type() == Statement::MEDIA)
837
+ {
838
+ return expression()->exclude("media");
839
+ }
840
+ if (s->statement_type() == Statement::RULESET)
841
+ {
842
+ return expression()->exclude("rule");
843
+ }
844
+ if (s->statement_type() == Statement::SUPPORTS)
845
+ {
846
+ return expression()->exclude("supports");
847
+ }
848
+ if (AtRuleObj dir = Cast<AtRule>(s))
849
+ {
850
+ if (dir->is_keyframes()) return expression()->exclude("keyframes");
851
+ }
852
+ return false;
853
+ }
854
+
855
+ /////////////////////////////////////////////////////////////////////////
856
+ /////////////////////////////////////////////////////////////////////////
857
+
858
+ Parameter::Parameter(SourceSpan pstate, sass::string n, ExpressionObj def, bool rest)
859
+ : AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
860
+ { }
861
+ Parameter::Parameter(const Parameter* ptr)
862
+ : AST_Node(ptr),
863
+ name_(ptr->name_),
864
+ default_value_(ptr->default_value_),
865
+ is_rest_parameter_(ptr->is_rest_parameter_)
866
+ { }
867
+
868
+ /////////////////////////////////////////////////////////////////////////
869
+ /////////////////////////////////////////////////////////////////////////
870
+
871
+ Parameters::Parameters(SourceSpan pstate)
872
+ : AST_Node(pstate),
873
+ Vectorized<Parameter_Obj>(),
874
+ has_optional_parameters_(false),
875
+ has_rest_parameter_(false)
876
+ { }
877
+ Parameters::Parameters(const Parameters* ptr)
878
+ : AST_Node(ptr),
879
+ Vectorized<Parameter_Obj>(*ptr),
880
+ has_optional_parameters_(ptr->has_optional_parameters_),
881
+ has_rest_parameter_(ptr->has_rest_parameter_)
882
+ { }
883
+
884
+ void Parameters::adjust_after_pushing(Parameter_Obj p)
885
+ {
886
+ if (p->default_value()) {
887
+ if (has_rest_parameter()) {
888
+ coreError("optional parameters may not be combined with variable-length parameters", p->pstate());
889
+ }
890
+ has_optional_parameters(true);
891
+ }
892
+ else if (p->is_rest_parameter()) {
893
+ if (has_rest_parameter()) {
894
+ coreError("functions and mixins cannot have more than one variable-length parameter", p->pstate());
895
+ }
896
+ has_rest_parameter(true);
897
+ }
898
+ else {
899
+ if (has_rest_parameter()) {
900
+ coreError("required parameters must precede variable-length parameters", p->pstate());
901
+ }
902
+ if (has_optional_parameters()) {
903
+ coreError("required parameters must precede optional parameters", p->pstate());
904
+ }
905
+ }
906
+ }
907
+
908
+ /////////////////////////////////////////////////////////////////////////
909
+ /////////////////////////////////////////////////////////////////////////
910
+
911
+ // If you forget to add a class here you will get
912
+ // undefined reference to `vtable for Sass::Class'
913
+
914
+ IMPLEMENT_AST_OPERATORS(StyleRule);
915
+ IMPLEMENT_AST_OPERATORS(MediaRule);
916
+ IMPLEMENT_AST_OPERATORS(CssMediaRule);
917
+ IMPLEMENT_AST_OPERATORS(CssMediaQuery);
918
+ IMPLEMENT_AST_OPERATORS(Import);
919
+ IMPLEMENT_AST_OPERATORS(Import_Stub);
920
+ IMPLEMENT_AST_OPERATORS(AtRule);
921
+ IMPLEMENT_AST_OPERATORS(AtRootRule);
922
+ IMPLEMENT_AST_OPERATORS(WhileRule);
923
+ IMPLEMENT_AST_OPERATORS(EachRule);
924
+ IMPLEMENT_AST_OPERATORS(ForRule);
925
+ IMPLEMENT_AST_OPERATORS(If);
926
+ IMPLEMENT_AST_OPERATORS(Mixin_Call);
927
+ IMPLEMENT_AST_OPERATORS(ExtendRule);
928
+ IMPLEMENT_AST_OPERATORS(Media_Query);
929
+ IMPLEMENT_AST_OPERATORS(Media_Query_Expression);
930
+ IMPLEMENT_AST_OPERATORS(DebugRule);
931
+ IMPLEMENT_AST_OPERATORS(ErrorRule);
932
+ IMPLEMENT_AST_OPERATORS(WarningRule);
933
+ IMPLEMENT_AST_OPERATORS(Assignment);
934
+ IMPLEMENT_AST_OPERATORS(Return);
935
+ IMPLEMENT_AST_OPERATORS(At_Root_Query);
936
+ IMPLEMENT_AST_OPERATORS(Comment);
937
+ IMPLEMENT_AST_OPERATORS(Parameters);
938
+ IMPLEMENT_AST_OPERATORS(Parameter);
939
+ IMPLEMENT_AST_OPERATORS(Arguments);
940
+ IMPLEMENT_AST_OPERATORS(Argument);
941
+ IMPLEMENT_AST_OPERATORS(Unary_Expression);
942
+ IMPLEMENT_AST_OPERATORS(Block);
943
+ IMPLEMENT_AST_OPERATORS(Content);
944
+ IMPLEMENT_AST_OPERATORS(Trace);
945
+ IMPLEMENT_AST_OPERATORS(Keyframe_Rule);
946
+ IMPLEMENT_AST_OPERATORS(Bubble);
947
+ IMPLEMENT_AST_OPERATORS(Definition);
948
+ IMPLEMENT_AST_OPERATORS(Declaration);
949
+
950
+ /////////////////////////////////////////////////////////////////////////
951
+ /////////////////////////////////////////////////////////////////////////
952
+
953
+ }