sassc 2.2.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +18 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory/allocator.cpp +48 -0
  81. data/ext/libsass/src/memory/allocator.hpp +138 -0
  82. data/ext/libsass/src/memory/config.hpp +20 -0
  83. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  84. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  85. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  86. data/ext/libsass/src/memory.hpp +12 -0
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +8 -8
  132. data/lib/sassc/native.rb +4 -6
  133. data/lib/sassc/script.rb +4 -4
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +18 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +29 -15
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
@@ -1,23 +1,12 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "ast.hpp"
3
- #include "context.hpp"
4
- #include "node.hpp"
5
- #include "eval.hpp"
6
- #include "extend.hpp"
7
- #include "emitter.hpp"
8
- #include "color_maps.hpp"
9
- #include "ast_fwd_decl.hpp"
10
- #include <set>
11
- #include <iomanip>
12
- #include <iostream>
13
- #include <algorithm>
14
- #include <functional>
15
- #include <cctype>
16
- #include <locale>
17
6
 
18
7
  namespace Sass {
19
8
 
20
- static Null sass_null(ParserState("null"));
9
+ static Null sass_null(SourceSpan("null"));
21
10
 
22
11
  const char* sass_op_to_name(enum Sass_OP op) {
23
12
  switch (op) {
@@ -64,12 +53,12 @@ namespace Sass {
64
53
  /////////////////////////////////////////////////////////////////////////
65
54
  /////////////////////////////////////////////////////////////////////////
66
55
 
67
- void AST_Node::update_pstate(const ParserState& pstate)
56
+ void AST_Node::update_pstate(const SourceSpan& pstate)
68
57
  {
69
- pstate_.offset += pstate - pstate_ + pstate.offset;
58
+ pstate_.offset += pstate.position - pstate_.position + pstate.offset;
70
59
  }
71
60
 
72
- const std::string AST_Node::to_string(Sass_Inspect_Options opt) const
61
+ sass::string AST_Node::to_string(Sass_Inspect_Options opt) const
73
62
  {
74
63
  Sass_Output_Options out(opt);
75
64
  Emitter emitter(out);
@@ -80,25 +69,27 @@ namespace Sass {
80
69
  return i.get_buffer();
81
70
  }
82
71
 
83
- const std::string AST_Node::to_string() const
72
+ sass::string AST_Node::to_css(Sass_Inspect_Options opt) const
84
73
  {
85
- return to_string({ NESTED, 5 });
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();
86
82
  }
87
83
 
88
- /////////////////////////////////////////////////////////////////////////
89
- /////////////////////////////////////////////////////////////////////////
90
-
91
- Expression_Obj Hashed::at(Expression_Obj k) const
84
+ sass::string AST_Node::to_string() const
92
85
  {
93
- if (elements_.count(k))
94
- { return elements_.at(k); }
95
- else { return {}; }
86
+ return to_string({ NESTED, 5 });
96
87
  }
97
88
 
98
89
  /////////////////////////////////////////////////////////////////////////
99
90
  /////////////////////////////////////////////////////////////////////////
100
91
 
101
- Statement::Statement(ParserState pstate, Type st, size_t t)
92
+ Statement::Statement(SourceSpan pstate, Type st, size_t t)
102
93
  : AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
103
94
  { }
104
95
  Statement::Statement(const Statement* ptr)
@@ -126,7 +117,7 @@ namespace Sass {
126
117
  /////////////////////////////////////////////////////////////////////////
127
118
  /////////////////////////////////////////////////////////////////////////
128
119
 
129
- Block::Block(ParserState pstate, size_t s, bool r)
120
+ Block::Block(SourceSpan pstate, size_t s, bool r)
130
121
  : Statement(pstate),
131
122
  Vectorized<Statement_Obj>(s),
132
123
  is_root_(r)
@@ -137,6 +128,14 @@ namespace Sass {
137
128
  is_root_(ptr->is_root_)
138
129
  { }
139
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
+
140
139
  bool Block::has_content()
141
140
  {
142
141
  for (size_t i = 0, L = elements().size(); i < L; ++i) {
@@ -148,14 +147,14 @@ namespace Sass {
148
147
  /////////////////////////////////////////////////////////////////////////
149
148
  /////////////////////////////////////////////////////////////////////////
150
149
 
151
- Has_Block::Has_Block(ParserState pstate, Block_Obj b)
150
+ ParentStatement::ParentStatement(SourceSpan pstate, Block_Obj b)
152
151
  : Statement(pstate), block_(b)
153
152
  { }
154
- Has_Block::Has_Block(const Has_Block* ptr)
153
+ ParentStatement::ParentStatement(const ParentStatement* ptr)
155
154
  : Statement(ptr), block_(ptr->block_)
156
155
  { }
157
156
 
158
- bool Has_Block::has_content()
157
+ bool ParentStatement::has_content()
159
158
  {
160
159
  return (block_ && block_->has_content()) || Statement::has_content();
161
160
  }
@@ -163,19 +162,20 @@ namespace Sass {
163
162
  /////////////////////////////////////////////////////////////////////////
164
163
  /////////////////////////////////////////////////////////////////////////
165
164
 
166
- Ruleset::Ruleset(ParserState pstate, Selector_List_Obj s, Block_Obj b)
167
- : Has_Block(pstate, b), selector_(s), is_root_(false)
165
+ StyleRule::StyleRule(SourceSpan pstate, SelectorListObj s, Block_Obj b)
166
+ : ParentStatement(pstate, b), selector_(s), schema_(), is_root_(false)
168
167
  { statement_type(RULESET); }
169
- Ruleset::Ruleset(const Ruleset* ptr)
170
- : Has_Block(ptr),
168
+ StyleRule::StyleRule(const StyleRule* ptr)
169
+ : ParentStatement(ptr),
171
170
  selector_(ptr->selector_),
171
+ schema_(ptr->schema_),
172
172
  is_root_(ptr->is_root_)
173
173
  { statement_type(RULESET); }
174
174
 
175
- bool Ruleset::is_invisible() const {
176
- if (Selector_List* sl = Cast<Selector_List>(selector())) {
177
- for (size_t i = 0, L = sl->length(); i < L; ++i)
178
- if (!(*sl)[i]->has_placeholder()) return false;
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
179
  }
180
180
  return true;
181
181
  }
@@ -183,7 +183,7 @@ namespace Sass {
183
183
  /////////////////////////////////////////////////////////////////////////
184
184
  /////////////////////////////////////////////////////////////////////////
185
185
 
186
- Bubble::Bubble(ParserState pstate, Statement_Obj n, Statement_Obj g, size_t t)
186
+ Bubble::Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g, size_t t)
187
187
  : Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == nullptr)
188
188
  { }
189
189
  Bubble::Bubble(const Bubble* ptr)
@@ -200,11 +200,11 @@ namespace Sass {
200
200
  /////////////////////////////////////////////////////////////////////////
201
201
  /////////////////////////////////////////////////////////////////////////
202
202
 
203
- Trace::Trace(ParserState pstate, std::string n, Block_Obj b, char type)
204
- : Has_Block(pstate, b), type_(type), name_(n)
203
+ Trace::Trace(SourceSpan pstate, sass::string n, Block_Obj b, char type)
204
+ : ParentStatement(pstate, b), type_(type), name_(n)
205
205
  { }
206
206
  Trace::Trace(const Trace* ptr)
207
- : Has_Block(ptr),
207
+ : ParentStatement(ptr),
208
208
  type_(ptr->type_),
209
209
  name_(ptr->name_)
210
210
  { }
@@ -212,48 +212,25 @@ namespace Sass {
212
212
  /////////////////////////////////////////////////////////////////////////
213
213
  /////////////////////////////////////////////////////////////////////////
214
214
 
215
- Media_Block::Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b)
216
- : Has_Block(pstate, b), media_queries_(mqs)
217
- { statement_type(MEDIA); }
218
- Media_Block::Media_Block(const Media_Block* ptr)
219
- : Has_Block(ptr), media_queries_(ptr->media_queries_)
220
- { statement_type(MEDIA); }
221
-
222
- bool Media_Block::is_invisible() const {
223
- for (size_t i = 0, L = block()->length(); i < L; ++i) {
224
- Statement_Obj stm = block()->at(i);
225
- if (!stm->is_invisible()) return false;
226
- }
227
- return true;
228
- }
229
-
230
- bool Media_Block::bubbles()
231
- {
232
- return true;
233
- }
234
-
235
- /////////////////////////////////////////////////////////////////////////
236
- /////////////////////////////////////////////////////////////////////////
237
-
238
- Directive::Directive(ParserState pstate, std::string kwd, Selector_List_Obj sel, Block_Obj b, Expression_Obj val)
239
- : Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
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
240
217
  { statement_type(DIRECTIVE); }
241
- Directive::Directive(const Directive* ptr)
242
- : Has_Block(ptr),
218
+ AtRule::AtRule(const AtRule* ptr)
219
+ : ParentStatement(ptr),
243
220
  keyword_(ptr->keyword_),
244
221
  selector_(ptr->selector_),
245
222
  value_(ptr->value_) // set value manually if needed
246
223
  { statement_type(DIRECTIVE); }
247
224
 
248
- bool Directive::bubbles() { return is_keyframes() || is_media(); }
225
+ bool AtRule::bubbles() { return is_keyframes() || is_media(); }
249
226
 
250
- bool Directive::is_media() {
227
+ bool AtRule::is_media() {
251
228
  return keyword_.compare("@-webkit-media") == 0 ||
252
229
  keyword_.compare("@-moz-media") == 0 ||
253
230
  keyword_.compare("@-o-media") == 0 ||
254
231
  keyword_.compare("@media") == 0;
255
232
  }
256
- bool Directive::is_keyframes() {
233
+ bool AtRule::is_keyframes() {
257
234
  return keyword_.compare("@-webkit-keyframes") == 0 ||
258
235
  keyword_.compare("@-moz-keyframes") == 0 ||
259
236
  keyword_.compare("@-o-keyframes") == 0 ||
@@ -263,21 +240,21 @@ namespace Sass {
263
240
  /////////////////////////////////////////////////////////////////////////
264
241
  /////////////////////////////////////////////////////////////////////////
265
242
 
266
- Keyframe_Rule::Keyframe_Rule(ParserState pstate, Block_Obj b)
267
- : Has_Block(pstate, b), name_()
243
+ Keyframe_Rule::Keyframe_Rule(SourceSpan pstate, Block_Obj b)
244
+ : ParentStatement(pstate, b), name_()
268
245
  { statement_type(KEYFRAMERULE); }
269
246
  Keyframe_Rule::Keyframe_Rule(const Keyframe_Rule* ptr)
270
- : Has_Block(ptr), name_(ptr->name_)
247
+ : ParentStatement(ptr), name_(ptr->name_)
271
248
  { statement_type(KEYFRAMERULE); }
272
249
 
273
250
  /////////////////////////////////////////////////////////////////////////
274
251
  /////////////////////////////////////////////////////////////////////////
275
252
 
276
- Declaration::Declaration(ParserState pstate, String_Obj prop, Expression_Obj val, bool i, bool c, Block_Obj b)
277
- : Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
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)
278
255
  { statement_type(DECLARATION); }
279
256
  Declaration::Declaration(const Declaration* ptr)
280
- : Has_Block(ptr),
257
+ : ParentStatement(ptr),
281
258
  property_(ptr->property_),
282
259
  value_(ptr->value_),
283
260
  is_important_(ptr->is_important_),
@@ -294,7 +271,7 @@ namespace Sass {
294
271
  /////////////////////////////////////////////////////////////////////////
295
272
  /////////////////////////////////////////////////////////////////////////
296
273
 
297
- Assignment::Assignment(ParserState pstate, std::string var, Expression_Obj val, bool is_default, bool is_global)
274
+ Assignment::Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default, bool is_global)
298
275
  : Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
299
276
  { statement_type(ASSIGNMENT); }
300
277
  Assignment::Assignment(const Assignment* ptr)
@@ -308,10 +285,10 @@ namespace Sass {
308
285
  /////////////////////////////////////////////////////////////////////////
309
286
  /////////////////////////////////////////////////////////////////////////
310
287
 
311
- Import::Import(ParserState pstate)
288
+ Import::Import(SourceSpan pstate)
312
289
  : Statement(pstate),
313
- urls_(std::vector<Expression_Obj>()),
314
- incs_(std::vector<Include>()),
290
+ urls_(sass::vector<ExpressionObj>()),
291
+ incs_(sass::vector<Include>()),
315
292
  import_queries_()
316
293
  { statement_type(IMPORT); }
317
294
  Import::Import(const Import* ptr)
@@ -321,56 +298,56 @@ namespace Sass {
321
298
  import_queries_(ptr->import_queries_)
322
299
  { statement_type(IMPORT); }
323
300
 
324
- std::vector<Include>& Import::incs() { return incs_; }
325
- std::vector<Expression_Obj>& Import::urls() { return urls_; }
301
+ sass::vector<Include>& Import::incs() { return incs_; }
302
+ sass::vector<ExpressionObj>& Import::urls() { return urls_; }
326
303
 
327
304
  /////////////////////////////////////////////////////////////////////////
328
305
  /////////////////////////////////////////////////////////////////////////
329
306
 
330
- Import_Stub::Import_Stub(ParserState pstate, Include res)
307
+ Import_Stub::Import_Stub(SourceSpan pstate, Include res)
331
308
  : Statement(pstate), resource_(res)
332
309
  { statement_type(IMPORT_STUB); }
333
310
  Import_Stub::Import_Stub(const Import_Stub* ptr)
334
311
  : Statement(ptr), resource_(ptr->resource_)
335
312
  { statement_type(IMPORT_STUB); }
336
313
  Include Import_Stub::resource() { return resource_; };
337
- std::string Import_Stub::imp_path() { return resource_.imp_path; };
338
- std::string Import_Stub::abs_path() { return resource_.abs_path; };
314
+ sass::string Import_Stub::imp_path() { return resource_.imp_path; };
315
+ sass::string Import_Stub::abs_path() { return resource_.abs_path; };
339
316
 
340
317
  /////////////////////////////////////////////////////////////////////////
341
318
  /////////////////////////////////////////////////////////////////////////
342
319
 
343
- Warning::Warning(ParserState pstate, Expression_Obj msg)
320
+ WarningRule::WarningRule(SourceSpan pstate, ExpressionObj msg)
344
321
  : Statement(pstate), message_(msg)
345
322
  { statement_type(WARNING); }
346
- Warning::Warning(const Warning* ptr)
323
+ WarningRule::WarningRule(const WarningRule* ptr)
347
324
  : Statement(ptr), message_(ptr->message_)
348
325
  { statement_type(WARNING); }
349
326
 
350
327
  /////////////////////////////////////////////////////////////////////////
351
328
  /////////////////////////////////////////////////////////////////////////
352
329
 
353
- Error::Error(ParserState pstate, Expression_Obj msg)
330
+ ErrorRule::ErrorRule(SourceSpan pstate, ExpressionObj msg)
354
331
  : Statement(pstate), message_(msg)
355
332
  { statement_type(ERROR); }
356
- Error::Error(const Error* ptr)
333
+ ErrorRule::ErrorRule(const ErrorRule* ptr)
357
334
  : Statement(ptr), message_(ptr->message_)
358
335
  { statement_type(ERROR); }
359
336
 
360
337
  /////////////////////////////////////////////////////////////////////////
361
338
  /////////////////////////////////////////////////////////////////////////
362
339
 
363
- Debug::Debug(ParserState pstate, Expression_Obj val)
340
+ DebugRule::DebugRule(SourceSpan pstate, ExpressionObj val)
364
341
  : Statement(pstate), value_(val)
365
342
  { statement_type(DEBUGSTMT); }
366
- Debug::Debug(const Debug* ptr)
343
+ DebugRule::DebugRule(const DebugRule* ptr)
367
344
  : Statement(ptr), value_(ptr->value_)
368
345
  { statement_type(DEBUGSTMT); }
369
346
 
370
347
  /////////////////////////////////////////////////////////////////////////
371
348
  /////////////////////////////////////////////////////////////////////////
372
349
 
373
- Comment::Comment(ParserState pstate, String_Obj txt, bool is_important)
350
+ Comment::Comment(SourceSpan pstate, String_Obj txt, bool is_important)
374
351
  : Statement(pstate), text_(txt), is_important_(is_important)
375
352
  { statement_type(COMMENT); }
376
353
  Comment::Comment(const Comment* ptr)
@@ -387,30 +364,30 @@ namespace Sass {
387
364
  /////////////////////////////////////////////////////////////////////////
388
365
  /////////////////////////////////////////////////////////////////////////
389
366
 
390
- If::If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt)
391
- : Has_Block(pstate, con), predicate_(pred), alternative_(alt)
367
+ If::If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt)
368
+ : ParentStatement(pstate, con), predicate_(pred), alternative_(alt)
392
369
  { statement_type(IF); }
393
370
  If::If(const If* ptr)
394
- : Has_Block(ptr),
371
+ : ParentStatement(ptr),
395
372
  predicate_(ptr->predicate_),
396
373
  alternative_(ptr->alternative_)
397
374
  { statement_type(IF); }
398
375
 
399
376
  bool If::has_content()
400
377
  {
401
- return Has_Block::has_content() || (alternative_ && alternative_->has_content());
378
+ return ParentStatement::has_content() || (alternative_ && alternative_->has_content());
402
379
  }
403
380
 
404
381
  /////////////////////////////////////////////////////////////////////////
405
382
  /////////////////////////////////////////////////////////////////////////
406
383
 
407
- For::For(ParserState pstate,
408
- std::string var, Expression_Obj lo, Expression_Obj hi, Block_Obj b, bool inc)
409
- : Has_Block(pstate, b),
384
+ ForRule::ForRule(SourceSpan pstate,
385
+ sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc)
386
+ : ParentStatement(pstate, b),
410
387
  variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
411
388
  { statement_type(FOR); }
412
- For::For(const For* ptr)
413
- : Has_Block(ptr),
389
+ ForRule::ForRule(const ForRule* ptr)
390
+ : ParentStatement(ptr),
414
391
  variable_(ptr->variable_),
415
392
  lower_bound_(ptr->lower_bound_),
416
393
  upper_bound_(ptr->upper_bound_),
@@ -420,27 +397,27 @@ namespace Sass {
420
397
  /////////////////////////////////////////////////////////////////////////
421
398
  /////////////////////////////////////////////////////////////////////////
422
399
 
423
- Each::Each(ParserState pstate, std::vector<std::string> vars, Expression_Obj lst, Block_Obj b)
424
- : Has_Block(pstate, b), variables_(vars), list_(lst)
400
+ EachRule::EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b)
401
+ : ParentStatement(pstate, b), variables_(vars), list_(lst)
425
402
  { statement_type(EACH); }
426
- Each::Each(const Each* ptr)
427
- : Has_Block(ptr), variables_(ptr->variables_), list_(ptr->list_)
403
+ EachRule::EachRule(const EachRule* ptr)
404
+ : ParentStatement(ptr), variables_(ptr->variables_), list_(ptr->list_)
428
405
  { statement_type(EACH); }
429
406
 
430
407
  /////////////////////////////////////////////////////////////////////////
431
408
  /////////////////////////////////////////////////////////////////////////
432
409
 
433
- While::While(ParserState pstate, Expression_Obj pred, Block_Obj b)
434
- : Has_Block(pstate, b), predicate_(pred)
410
+ WhileRule::WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b)
411
+ : ParentStatement(pstate, b), predicate_(pred)
435
412
  { statement_type(WHILE); }
436
- While::While(const While* ptr)
437
- : Has_Block(ptr), predicate_(ptr->predicate_)
413
+ WhileRule::WhileRule(const WhileRule* ptr)
414
+ : ParentStatement(ptr), predicate_(ptr->predicate_)
438
415
  { statement_type(WHILE); }
439
416
 
440
417
  /////////////////////////////////////////////////////////////////////////
441
418
  /////////////////////////////////////////////////////////////////////////
442
419
 
443
- Return::Return(ParserState pstate, Expression_Obj val)
420
+ Return::Return(SourceSpan pstate, ExpressionObj val)
444
421
  : Statement(pstate), value_(val)
445
422
  { statement_type(RETURN); }
446
423
  Return::Return(const Return* ptr)
@@ -450,18 +427,26 @@ namespace Sass {
450
427
  /////////////////////////////////////////////////////////////////////////
451
428
  /////////////////////////////////////////////////////////////////////////
452
429
 
453
- Extension::Extension(ParserState pstate, Selector_List_Obj s)
454
- : Statement(pstate), selector_(s)
430
+ ExtendRule::ExtendRule(SourceSpan pstate, SelectorListObj s)
431
+ : Statement(pstate), isOptional_(false), selector_(s), schema_()
455
432
  { statement_type(EXTEND); }
456
- Extension::Extension(const Extension* ptr)
457
- : Statement(ptr), selector_(ptr->selector_)
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_)
458
443
  { statement_type(EXTEND); }
459
444
 
460
445
  /////////////////////////////////////////////////////////////////////////
461
446
  /////////////////////////////////////////////////////////////////////////
462
447
 
463
448
  Definition::Definition(const Definition* ptr)
464
- : Has_Block(ptr),
449
+ : ParentStatement(ptr),
465
450
  name_(ptr->name_),
466
451
  parameters_(ptr->parameters_),
467
452
  environment_(ptr->environment_),
@@ -473,12 +458,12 @@ namespace Sass {
473
458
  signature_(ptr->signature_)
474
459
  { }
475
460
 
476
- Definition::Definition(ParserState pstate,
477
- std::string n,
461
+ Definition::Definition(SourceSpan pstate,
462
+ sass::string n,
478
463
  Parameters_Obj params,
479
464
  Block_Obj b,
480
465
  Type t)
481
- : Has_Block(pstate, b),
466
+ : ParentStatement(pstate, b),
482
467
  name_(n),
483
468
  parameters_(params),
484
469
  environment_(0),
@@ -490,13 +475,13 @@ namespace Sass {
490
475
  signature_(0)
491
476
  { }
492
477
 
493
- Definition::Definition(ParserState pstate,
478
+ Definition::Definition(SourceSpan pstate,
494
479
  Signature sig,
495
- std::string n,
480
+ sass::string n,
496
481
  Parameters_Obj params,
497
482
  Native_Function func_ptr,
498
483
  bool overload_stub)
499
- : Has_Block(pstate, {}),
484
+ : ParentStatement(pstate, {}),
500
485
  name_(n),
501
486
  parameters_(params),
502
487
  environment_(0),
@@ -508,12 +493,12 @@ namespace Sass {
508
493
  signature_(sig)
509
494
  { }
510
495
 
511
- Definition::Definition(ParserState pstate,
496
+ Definition::Definition(SourceSpan pstate,
512
497
  Signature sig,
513
- std::string n,
498
+ sass::string n,
514
499
  Parameters_Obj params,
515
500
  Sass_Function_Entry c_func)
516
- : Has_Block(pstate, {}),
501
+ : ParentStatement(pstate, {}),
517
502
  name_(n),
518
503
  parameters_(params),
519
504
  environment_(0),
@@ -528,11 +513,11 @@ namespace Sass {
528
513
  /////////////////////////////////////////////////////////////////////////
529
514
  /////////////////////////////////////////////////////////////////////////
530
515
 
531
- Mixin_Call::Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Parameters_Obj b_params, Block_Obj b)
532
- : Has_Block(pstate, b), name_(n), arguments_(args), block_parameters_(b_params)
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)
533
518
  { }
534
519
  Mixin_Call::Mixin_Call(const Mixin_Call* ptr)
535
- : Has_Block(ptr),
520
+ : ParentStatement(ptr),
536
521
  name_(ptr->name_),
537
522
  arguments_(ptr->arguments_),
538
523
  block_parameters_(ptr->block_parameters_)
@@ -541,7 +526,7 @@ namespace Sass {
541
526
  /////////////////////////////////////////////////////////////////////////
542
527
  /////////////////////////////////////////////////////////////////////////
543
528
 
544
- Content::Content(ParserState pstate, Arguments_Obj args)
529
+ Content::Content(SourceSpan pstate, Arguments_Obj args)
545
530
  : Statement(pstate),
546
531
  arguments_(args)
547
532
  { statement_type(CONTENT); }
@@ -553,7 +538,7 @@ namespace Sass {
553
538
  /////////////////////////////////////////////////////////////////////////
554
539
  /////////////////////////////////////////////////////////////////////////
555
540
 
556
- Expression::Expression(ParserState pstate, bool d, bool e, bool i, Type ct)
541
+ Expression::Expression(SourceSpan pstate, bool d, bool e, bool i, Type ct)
557
542
  : AST_Node(pstate),
558
543
  is_delayed_(d),
559
544
  is_expanded_(e),
@@ -572,7 +557,7 @@ namespace Sass {
572
557
  /////////////////////////////////////////////////////////////////////////
573
558
  /////////////////////////////////////////////////////////////////////////
574
559
 
575
- Unary_Expression::Unary_Expression(ParserState pstate, Type t, Expression_Obj o)
560
+ Unary_Expression::Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o)
576
561
  : Expression(pstate), optype_(t), operand_(o), hash_(0)
577
562
  { }
578
563
  Unary_Expression::Unary_Expression(const Unary_Expression* ptr)
@@ -581,7 +566,7 @@ namespace Sass {
581
566
  operand_(ptr->operand_),
582
567
  hash_(ptr->hash_)
583
568
  { }
584
- const std::string Unary_Expression::type_name() {
569
+ const sass::string Unary_Expression::type_name() {
585
570
  switch (optype_) {
586
571
  case PLUS: return "plus";
587
572
  case MINUS: return "minus";
@@ -617,7 +602,7 @@ namespace Sass {
617
602
  /////////////////////////////////////////////////////////////////////////
618
603
  /////////////////////////////////////////////////////////////////////////
619
604
 
620
- Argument::Argument(ParserState pstate, Expression_Obj val, std::string n, bool rest, bool keyword)
605
+ Argument::Argument(SourceSpan pstate, ExpressionObj val, sass::string n, bool rest, bool keyword)
621
606
  : Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
622
607
  {
623
608
  if (!name_.empty() && is_rest_argument_) {
@@ -661,7 +646,7 @@ namespace Sass {
661
646
  size_t Argument::hash() const
662
647
  {
663
648
  if (hash_ == 0) {
664
- hash_ = std::hash<std::string>()(name());
649
+ hash_ = std::hash<sass::string>()(name());
665
650
  hash_combine(hash_, value()->hash());
666
651
  }
667
652
  return hash_;
@@ -670,7 +655,7 @@ namespace Sass {
670
655
  /////////////////////////////////////////////////////////////////////////
671
656
  /////////////////////////////////////////////////////////////////////////
672
657
 
673
- Arguments::Arguments(ParserState pstate)
658
+ Arguments::Arguments(SourceSpan pstate)
674
659
  : Expression(pstate),
675
660
  Vectorized<Argument_Obj>(),
676
661
  has_named_arguments_(false),
@@ -753,13 +738,13 @@ namespace Sass {
753
738
  /////////////////////////////////////////////////////////////////////////
754
739
  /////////////////////////////////////////////////////////////////////////
755
740
 
756
- Media_Query::Media_Query(ParserState pstate, String_Obj t, size_t s, bool n, bool r)
757
- : Expression(pstate), Vectorized<Media_Query_Expression_Obj>(s),
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),
758
743
  media_type_(t), is_negated_(n), is_restricted_(r)
759
744
  { }
760
745
  Media_Query::Media_Query(const Media_Query* ptr)
761
746
  : Expression(ptr),
762
- Vectorized<Media_Query_Expression_Obj>(*ptr),
747
+ Vectorized<Media_Query_ExpressionObj>(*ptr),
763
748
  media_type_(ptr->media_type_),
764
749
  is_negated_(ptr->is_negated_),
765
750
  is_restricted_(ptr->is_restricted_)
@@ -768,8 +753,8 @@ namespace Sass {
768
753
  /////////////////////////////////////////////////////////////////////////
769
754
  /////////////////////////////////////////////////////////////////////////
770
755
 
771
- Media_Query_Expression::Media_Query_Expression(ParserState pstate,
772
- Expression_Obj f, Expression_Obj v, bool i)
756
+ Media_Query_Expression::Media_Query_Expression(SourceSpan pstate,
757
+ ExpressionObj f, ExpressionObj v, bool i)
773
758
  : Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
774
759
  { }
775
760
  Media_Query_Expression::Media_Query_Expression(const Media_Query_Expression* ptr)
@@ -782,7 +767,7 @@ namespace Sass {
782
767
  /////////////////////////////////////////////////////////////////////////
783
768
  /////////////////////////////////////////////////////////////////////////
784
769
 
785
- At_Root_Query::At_Root_Query(ParserState pstate, Expression_Obj f, Expression_Obj v, bool i)
770
+ At_Root_Query::At_Root_Query(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i)
786
771
  : Expression(pstate), feature_(f), value_(v)
787
772
  { }
788
773
  At_Root_Query::At_Root_Query(const At_Root_Query* ptr)
@@ -791,11 +776,11 @@ namespace Sass {
791
776
  value_(ptr->value_)
792
777
  { }
793
778
 
794
- bool At_Root_Query::exclude(std::string str)
779
+ bool At_Root_Query::exclude(sass::string str)
795
780
  {
796
781
  bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
797
782
  List* l = static_cast<List*>(value().ptr());
798
- std::string v;
783
+ sass::string v;
799
784
 
800
785
  if (with)
801
786
  {
@@ -822,18 +807,18 @@ namespace Sass {
822
807
  /////////////////////////////////////////////////////////////////////////
823
808
  /////////////////////////////////////////////////////////////////////////
824
809
 
825
- At_Root_Block::At_Root_Block(ParserState pstate, Block_Obj b, At_Root_Query_Obj e)
826
- : Has_Block(pstate, b), expression_(e)
810
+ AtRootRule::AtRootRule(SourceSpan pstate, Block_Obj b, At_Root_Query_Obj e)
811
+ : ParentStatement(pstate, b), expression_(e)
827
812
  { statement_type(ATROOT); }
828
- At_Root_Block::At_Root_Block(const At_Root_Block* ptr)
829
- : Has_Block(ptr), expression_(ptr->expression_)
813
+ AtRootRule::AtRootRule(const AtRootRule* ptr)
814
+ : ParentStatement(ptr), expression_(ptr->expression_)
830
815
  { statement_type(ATROOT); }
831
816
 
832
- bool At_Root_Block::bubbles() {
817
+ bool AtRootRule::bubbles() {
833
818
  return true;
834
819
  }
835
820
 
836
- bool At_Root_Block::exclude_node(Statement_Obj s) {
821
+ bool AtRootRule::exclude_node(Statement_Obj s) {
837
822
  if (expression() == nullptr)
838
823
  {
839
824
  return s->statement_type() == Statement::RULESET;
@@ -841,9 +826,9 @@ namespace Sass {
841
826
 
842
827
  if (s->statement_type() == Statement::DIRECTIVE)
843
828
  {
844
- if (Directive_Obj dir = Cast<Directive>(s))
829
+ if (AtRuleObj dir = Cast<AtRule>(s))
845
830
  {
846
- std::string keyword(dir->keyword());
831
+ sass::string keyword(dir->keyword());
847
832
  if (keyword.length() > 0) keyword.erase(0, 1);
848
833
  return expression()->exclude(keyword);
849
834
  }
@@ -860,7 +845,7 @@ namespace Sass {
860
845
  {
861
846
  return expression()->exclude("supports");
862
847
  }
863
- if (Directive_Obj dir = Cast<Directive>(s))
848
+ if (AtRuleObj dir = Cast<AtRule>(s))
864
849
  {
865
850
  if (dir->is_keyframes()) return expression()->exclude("keyframes");
866
851
  }
@@ -870,7 +855,7 @@ namespace Sass {
870
855
  /////////////////////////////////////////////////////////////////////////
871
856
  /////////////////////////////////////////////////////////////////////////
872
857
 
873
- Parameter::Parameter(ParserState pstate, std::string n, Expression_Obj def, bool rest)
858
+ Parameter::Parameter(SourceSpan pstate, sass::string n, ExpressionObj def, bool rest)
874
859
  : AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
875
860
  { }
876
861
  Parameter::Parameter(const Parameter* ptr)
@@ -883,7 +868,7 @@ namespace Sass {
883
868
  /////////////////////////////////////////////////////////////////////////
884
869
  /////////////////////////////////////////////////////////////////////////
885
870
 
886
- Parameters::Parameters(ParserState pstate)
871
+ Parameters::Parameters(SourceSpan pstate)
887
872
  : AST_Node(pstate),
888
873
  Vectorized<Parameter_Obj>(),
889
874
  has_optional_parameters_(false),
@@ -923,23 +908,28 @@ namespace Sass {
923
908
  /////////////////////////////////////////////////////////////////////////
924
909
  /////////////////////////////////////////////////////////////////////////
925
910
 
926
- IMPLEMENT_AST_OPERATORS(Ruleset);
927
- IMPLEMENT_AST_OPERATORS(Media_Block);
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);
928
918
  IMPLEMENT_AST_OPERATORS(Import);
929
919
  IMPLEMENT_AST_OPERATORS(Import_Stub);
930
- IMPLEMENT_AST_OPERATORS(Directive);
931
- IMPLEMENT_AST_OPERATORS(At_Root_Block);
932
- IMPLEMENT_AST_OPERATORS(While);
933
- IMPLEMENT_AST_OPERATORS(Each);
934
- IMPLEMENT_AST_OPERATORS(For);
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);
935
925
  IMPLEMENT_AST_OPERATORS(If);
936
926
  IMPLEMENT_AST_OPERATORS(Mixin_Call);
937
- IMPLEMENT_AST_OPERATORS(Extension);
927
+ IMPLEMENT_AST_OPERATORS(ExtendRule);
938
928
  IMPLEMENT_AST_OPERATORS(Media_Query);
939
929
  IMPLEMENT_AST_OPERATORS(Media_Query_Expression);
940
- IMPLEMENT_AST_OPERATORS(Debug);
941
- IMPLEMENT_AST_OPERATORS(Error);
942
- IMPLEMENT_AST_OPERATORS(Warning);
930
+ IMPLEMENT_AST_OPERATORS(DebugRule);
931
+ IMPLEMENT_AST_OPERATORS(ErrorRule);
932
+ IMPLEMENT_AST_OPERATORS(WarningRule);
943
933
  IMPLEMENT_AST_OPERATORS(Assignment);
944
934
  IMPLEMENT_AST_OPERATORS(Return);
945
935
  IMPLEMENT_AST_OPERATORS(At_Root_Query);