sassc 2.2.1 → 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 (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
@@ -12,10 +12,9 @@
12
12
  namespace Sass {
13
13
 
14
14
  Cssize::Cssize(Context& ctx)
15
- : ctx(ctx),
16
- traces(ctx.traces),
15
+ : traces(ctx.traces),
17
16
  block_stack(BlockStack()),
18
- p_stack(std::vector<Statement*>())
17
+ p_stack(sass::vector<Statement*>())
19
18
  { }
20
19
 
21
20
  Statement* Cssize::parent()
@@ -81,17 +80,17 @@ namespace Sass {
81
80
  return 0;
82
81
  }
83
82
 
84
- Statement* Cssize::operator()(Directive* r)
83
+ Statement* Cssize::operator()(AtRule* r)
85
84
  {
86
85
  if (!r->block() || !r->block()->length()) return r;
87
86
 
88
87
  if (parent()->statement_type() == Statement::RULESET)
89
88
  {
90
- return (r->is_keyframes()) ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r);
89
+ return r->is_keyframes() ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r);
91
90
  }
92
91
 
93
92
  p_stack.push_back(r);
94
- Directive_Obj rr = SASS_MEMORY_NEW(Directive,
93
+ AtRuleObj rr = SASS_MEMORY_NEW(AtRule,
95
94
  r->pstate(),
96
95
  r->keyword(),
97
96
  r->selector(),
@@ -108,7 +107,7 @@ namespace Sass {
108
107
  Bubble_Obj s_obj = Cast<Bubble>(s);
109
108
  s = s_obj->node();
110
109
  if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false;
111
- else directive_exists = (Cast<Directive>(s)->keyword() == rr->keyword());
110
+ else directive_exists = (Cast<AtRule>(s)->keyword() == rr->keyword());
112
111
  }
113
112
 
114
113
  }
@@ -116,7 +115,7 @@ namespace Sass {
116
115
  Block* result = SASS_MEMORY_NEW(Block, rr->pstate());
117
116
  if (!(directive_exists || rr->is_keyframes()))
118
117
  {
119
- Directive* empty_node = Cast<Directive>(rr);
118
+ AtRule* empty_node = Cast<AtRule>(rr);
120
119
  empty_node->block(SASS_MEMORY_NEW(Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
121
120
  result->append(empty_node);
122
121
  }
@@ -143,20 +142,20 @@ namespace Sass {
143
142
  return debubble(rr->block(), rr);
144
143
  }
145
144
 
146
- Statement* Cssize::operator()(Ruleset* r)
145
+ Statement* Cssize::operator()(StyleRule* r)
147
146
  {
148
147
  p_stack.push_back(r);
149
148
  // this can return a string schema
150
149
  // string schema is not a statement!
151
150
  // r->block() is already a string schema
152
- // and that is comming from propset expand
151
+ // and that is coming from propset expand
153
152
  Block* bb = operator()(r->block());
154
153
  // this should protect us (at least a bit) from our mess
155
154
  // fixing this properly is harder that it should be ...
156
155
  if (Cast<Statement>(bb) == NULL) {
157
156
  error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces);
158
157
  }
159
- Ruleset_Obj rr = SASS_MEMORY_NEW(Ruleset,
158
+ StyleRuleObj rr = SASS_MEMORY_NEW(StyleRule,
160
159
  r->pstate(),
161
160
  r->selector(),
162
161
  bb);
@@ -215,20 +214,23 @@ namespace Sass {
215
214
  return 0;
216
215
  }
217
216
 
218
- Statement* Cssize::operator()(Media_Block* m)
217
+ Statement* Cssize::operator()(CssMediaRule* m)
219
218
  {
220
219
  if (parent()->statement_type() == Statement::RULESET)
221
- { return bubble(m); }
220
+ {
221
+ return bubble(m);
222
+ }
222
223
 
223
224
  if (parent()->statement_type() == Statement::MEDIA)
224
- { return SASS_MEMORY_NEW(Bubble, m->pstate(), m); }
225
+ {
226
+ return SASS_MEMORY_NEW(Bubble, m->pstate(), m);
227
+ }
225
228
 
226
229
  p_stack.push_back(m);
227
230
 
228
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
229
- m->pstate(),
230
- m->media_queries(),
231
- operator()(m->block()));
231
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule, m->pstate(), m->block());
232
+ mm->concat(m->elements());
233
+ mm->block(operator()(m->block()));
232
234
  mm->tabs(m->tabs());
233
235
 
234
236
  p_stack.pop_back();
@@ -236,7 +238,7 @@ namespace Sass {
236
238
  return debubble(mm->block(), mm);
237
239
  }
238
240
 
239
- Statement* Cssize::operator()(Supports_Block* m)
241
+ Statement* Cssize::operator()(SupportsRule* m)
240
242
  {
241
243
  if (!m->block()->length())
242
244
  { return m; }
@@ -246,7 +248,7 @@ namespace Sass {
246
248
 
247
249
  p_stack.push_back(m);
248
250
 
249
- Supports_Block_Obj mm = SASS_MEMORY_NEW(Supports_Block,
251
+ SupportsRuleObj mm = SASS_MEMORY_NEW(SupportsRule,
250
252
  m->pstate(),
251
253
  m->condition(),
252
254
  operator()(m->block()));
@@ -257,7 +259,7 @@ namespace Sass {
257
259
  return debubble(mm->block(), mm);
258
260
  }
259
261
 
260
- Statement* Cssize::operator()(At_Root_Block* m)
262
+ Statement* Cssize::operator()(AtRootRule* m)
261
263
  {
262
264
  bool tmp = false;
263
265
  for (size_t i = 0, L = p_stack.size(); i < L; ++i) {
@@ -285,17 +287,17 @@ namespace Sass {
285
287
  return bubble(m);
286
288
  }
287
289
 
288
- Statement* Cssize::bubble(Directive* m)
290
+ Statement* Cssize::bubble(AtRule* m)
289
291
  {
290
292
  Block* bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
291
- Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
293
+ ParentStatementObj new_rule = Cast<ParentStatement>(SASS_MEMORY_COPY(this->parent()));
292
294
  new_rule->block(bb);
293
295
  new_rule->tabs(this->parent()->tabs());
294
296
  new_rule->block()->concat(m->block());
295
297
 
296
298
  Block_Obj wrapper_block = SASS_MEMORY_NEW(Block, m->block() ? m->block()->pstate() : m->pstate());
297
299
  wrapper_block->append(new_rule);
298
- Directive_Obj mm = SASS_MEMORY_NEW(Directive,
300
+ AtRuleObj mm = SASS_MEMORY_NEW(AtRule,
299
301
  m->pstate(),
300
302
  m->keyword(),
301
303
  m->selector(),
@@ -306,11 +308,11 @@ namespace Sass {
306
308
  return bubble;
307
309
  }
308
310
 
309
- Statement* Cssize::bubble(At_Root_Block* m)
311
+ Statement* Cssize::bubble(AtRootRule* m)
310
312
  {
311
313
  if (!m || !m->block()) return NULL;
312
314
  Block* bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
313
- Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
315
+ ParentStatementObj new_rule = Cast<ParentStatement>(SASS_MEMORY_COPY(this->parent()));
314
316
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
315
317
  if (new_rule) {
316
318
  new_rule->block(bb);
@@ -319,7 +321,7 @@ namespace Sass {
319
321
  wrapper_block->append(new_rule);
320
322
  }
321
323
 
322
- At_Root_Block* mm = SASS_MEMORY_NEW(At_Root_Block,
324
+ AtRootRule* mm = SASS_MEMORY_NEW(AtRootRule,
323
325
  m->pstate(),
324
326
  wrapper_block,
325
327
  m->expression());
@@ -327,12 +329,12 @@ namespace Sass {
327
329
  return bubble;
328
330
  }
329
331
 
330
- Statement* Cssize::bubble(Supports_Block* m)
332
+ Statement* Cssize::bubble(SupportsRule* m)
331
333
  {
332
- Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
334
+ StyleRuleObj parent = Cast<StyleRule>(SASS_MEMORY_COPY(this->parent()));
333
335
 
334
336
  Block* bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
335
- Ruleset* new_rule = SASS_MEMORY_NEW(Ruleset,
337
+ StyleRule* new_rule = SASS_MEMORY_NEW(StyleRule,
336
338
  parent->pstate(),
337
339
  parent->selector(),
338
340
  bb);
@@ -341,7 +343,7 @@ namespace Sass {
341
343
 
342
344
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
343
345
  wrapper_block->append(new_rule);
344
- Supports_Block* mm = SASS_MEMORY_NEW(Supports_Block,
346
+ SupportsRule* mm = SASS_MEMORY_NEW(SupportsRule,
345
347
  m->pstate(),
346
348
  m->condition(),
347
349
  wrapper_block);
@@ -352,24 +354,24 @@ namespace Sass {
352
354
  return bubble;
353
355
  }
354
356
 
355
- Statement* Cssize::bubble(Media_Block* m)
357
+ Statement* Cssize::bubble(CssMediaRule* m)
356
358
  {
357
- Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
359
+ StyleRuleObj parent = Cast<StyleRule>(SASS_MEMORY_COPY(this->parent()));
358
360
 
359
361
  Block* bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
360
- Ruleset* new_rule = SASS_MEMORY_NEW(Ruleset,
361
- parent->pstate(),
362
- parent->selector(),
363
- bb);
362
+ StyleRule* new_rule = SASS_MEMORY_NEW(StyleRule,
363
+ parent->pstate(),
364
+ parent->selector(),
365
+ bb);
364
366
  new_rule->tabs(parent->tabs());
365
367
  new_rule->block()->concat(m->block());
366
368
 
367
369
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
368
370
  wrapper_block->append(new_rule);
369
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
370
- m->pstate(),
371
- m->media_queries(),
372
- wrapper_block);
371
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule,
372
+ m->pstate(),
373
+ wrapper_block);
374
+ mm->concat(m->elements());
373
375
 
374
376
  mm->tabs(m->tabs());
375
377
 
@@ -378,15 +380,15 @@ namespace Sass {
378
380
 
379
381
  bool Cssize::bubblable(Statement* s)
380
382
  {
381
- return Cast<Ruleset>(s) || s->bubbles();
383
+ return Cast<StyleRule>(s) || (s && s->bubbles());
382
384
  }
383
385
 
384
- Block* Cssize::flatten(Block* b)
386
+ Block* Cssize::flatten(const Block* b)
385
387
  {
386
388
  Block* result = SASS_MEMORY_NEW(Block, b->pstate(), 0, b->is_root());
387
389
  for (size_t i = 0, L = b->length(); i < L; ++i) {
388
390
  Statement* ss = b->at(i);
389
- if (Block* bb = Cast<Block>(ss)) {
391
+ if (const Block* bb = Cast<Block>(ss)) {
390
392
  Block_Obj bs = flatten(bb);
391
393
  for (size_t j = 0, K = bs->length(); j < K; ++j) {
392
394
  result->append(bs->at(j));
@@ -399,9 +401,9 @@ namespace Sass {
399
401
  return result;
400
402
  }
401
403
 
402
- std::vector<std::pair<bool, Block_Obj>> Cssize::slice_by_bubble(Block* b)
404
+ sass::vector<std::pair<bool, Block_Obj>> Cssize::slice_by_bubble(Block* b)
403
405
  {
404
- std::vector<std::pair<bool, Block_Obj>> results;
406
+ sass::vector<std::pair<bool, Block_Obj>> results;
405
407
 
406
408
  for (size_t i = 0, L = b->length(); i < L; ++i) {
407
409
  Statement_Obj value = b->at(i);
@@ -424,8 +426,8 @@ namespace Sass {
424
426
 
425
427
  Block* Cssize::debubble(Block* children, Statement* parent)
426
428
  {
427
- Has_Block_Obj previous_parent;
428
- std::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children);
429
+ ParentStatementObj previous_parent;
430
+ sass::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children);
429
431
  Block_Obj result = SASS_MEMORY_NEW(Block, children->pstate());
430
432
 
431
433
  for (size_t i = 0, L = baz.size(); i < L; ++i) {
@@ -440,7 +442,7 @@ namespace Sass {
440
442
  previous_parent->block()->concat(slice);
441
443
  }
442
444
  else {
443
- previous_parent = Cast<Has_Block>(SASS_MEMORY_COPY(parent));
445
+ previous_parent = SASS_MEMORY_COPY(parent);
444
446
  previous_parent->block(slice);
445
447
  previous_parent->tabs(parent->tabs());
446
448
 
@@ -451,36 +453,24 @@ namespace Sass {
451
453
 
452
454
  for (size_t j = 0, K = slice->length(); j < K; ++j)
453
455
  {
454
- Statement* ss;
456
+ Statement_Obj ss;
455
457
  Statement_Obj stm = slice->at(j);
456
458
  // this has to go now here (too bad)
457
459
  Bubble_Obj node = Cast<Bubble>(stm);
458
- Media_Block* m1 = NULL;
459
- Media_Block* m2 = NULL;
460
- if (parent) m1 = Cast<Media_Block>(parent);
461
- if (node) m2 = Cast<Media_Block>(node->node());
462
- if (!parent ||
463
- parent->statement_type() != Statement::MEDIA ||
464
- node->node()->statement_type() != Statement::MEDIA ||
465
- (m1 && m2 && *m1->media_queries() == *m2->media_queries())
466
- )
467
- {
468
- ss = node->node();
469
- }
470
- else
471
- {
472
- List_Obj mq = merge_media_queries(
473
- Cast<Media_Block>(node->node()),
474
- Cast<Media_Block>(parent)
475
- );
476
- if (!mq->length()) continue;
477
- if (Media_Block* b = Cast<Media_Block>(node->node())) {
478
- b->media_queries(mq);
479
- }
460
+
461
+ CssMediaRule* rule1 = NULL;
462
+ CssMediaRule* rule2 = NULL;
463
+ if (parent) rule1 = Cast<CssMediaRule>(parent);
464
+ if (node) rule2 = Cast<CssMediaRule>(node->node());
465
+ if (rule1 || rule2) {
480
466
  ss = node->node();
481
467
  }
482
468
 
483
- if (!ss) continue;
469
+ ss = node->node();
470
+
471
+ if (!ss) {
472
+ continue;
473
+ }
484
474
 
485
475
  ss->tabs(ss->tabs() + node->tabs());
486
476
  ss->group_end(node->group_end());
@@ -489,7 +479,8 @@ namespace Sass {
489
479
  children->pstate(),
490
480
  children->length(),
491
481
  children->is_root());
492
- bb->append(ss->perform(this));
482
+ auto evaled = ss->perform(this);
483
+ if (evaled) bb->append(evaled);
493
484
 
494
485
  Block_Obj wrapper_block = SASS_MEMORY_NEW(Block,
495
486
  children->pstate(),
@@ -516,7 +507,7 @@ namespace Sass {
516
507
  {
517
508
  for (size_t i = 0, L = b->length(); i < L; ++i) {
518
509
  Statement_Obj ith = b->at(i)->perform(this);
519
- if (Block* bb = Cast<Block>(ith)) {
510
+ if (Block_Obj bb = Cast<Block>(ith)) {
520
511
  for (size_t j = 0, K = bb->length(); j < K; ++j) {
521
512
  cur->append(bb->at(j));
522
513
  }
@@ -527,78 +518,4 @@ namespace Sass {
527
518
  }
528
519
  }
529
520
 
530
- List* Cssize::merge_media_queries(Media_Block* m1, Media_Block* m2)
531
- {
532
- List* qq = SASS_MEMORY_NEW(List,
533
- m1->media_queries()->pstate(),
534
- m1->media_queries()->length(),
535
- SASS_COMMA);
536
-
537
- for (size_t i = 0, L = m1->media_queries()->length(); i < L; i++) {
538
- for (size_t j = 0, K = m2->media_queries()->length(); j < K; j++) {
539
- Expression_Obj l1 = m1->media_queries()->at(i);
540
- Expression_Obj l2 = m2->media_queries()->at(j);
541
- Media_Query* mq1 = Cast<Media_Query>(l1);
542
- Media_Query* mq2 = Cast<Media_Query>(l2);
543
- Media_Query* mq = merge_media_query(mq1, mq2);
544
- if (mq) qq->append(mq);
545
- }
546
- }
547
-
548
- return qq;
549
- }
550
-
551
-
552
- Media_Query* Cssize::merge_media_query(Media_Query* mq1, Media_Query* mq2)
553
- {
554
-
555
- std::string type;
556
- std::string mod;
557
-
558
- std::string m1 = std::string(mq1->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
559
- std::string t1 = mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
560
- std::string m2 = std::string(mq2->is_restricted() ? "only" : mq2->is_negated() ? "not" : "");
561
- std::string t2 = mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
562
-
563
-
564
- if (t1.empty()) t1 = t2;
565
- if (t2.empty()) t2 = t1;
566
-
567
- if ((m1 == "not") ^ (m2 == "not")) {
568
- if (t1 == t2) {
569
- return 0;
570
- }
571
- type = m1 == "not" ? t2 : t1;
572
- mod = m1 == "not" ? m2 : m1;
573
- }
574
- else if (m1 == "not" && m2 == "not") {
575
- if (t1 != t2) {
576
- return 0;
577
- }
578
- type = t1;
579
- mod = "not";
580
- }
581
- else if (t1 != t2) {
582
- return 0;
583
- } else {
584
- type = t1;
585
- mod = m1.empty() ? m2 : m1;
586
- }
587
-
588
- Media_Query* mm = SASS_MEMORY_NEW(Media_Query,
589
- mq1->pstate(),
590
- {},
591
- mq1->length() + mq2->length(),
592
- mod == "not",
593
- mod == "only");
594
-
595
- if (!type.empty()) {
596
- mm->media_type(SASS_MEMORY_NEW(String_Quoted, mq1->pstate(), type));
597
- }
598
-
599
- mm->concat(mq2);
600
- mm->concat(mq1);
601
-
602
- return mm;
603
- }
604
521
  }
@@ -12,58 +12,52 @@ namespace Sass {
12
12
 
13
13
  class Cssize : public Operation_CRTP<Statement*, Cssize> {
14
14
 
15
- Context& ctx;
16
15
  Backtraces& traces;
17
16
  BlockStack block_stack;
18
- std::vector<Statement*> p_stack;
17
+ sass::vector<Statement*> p_stack;
19
18
 
20
19
  public:
21
20
  Cssize(Context&);
22
21
  ~Cssize() { }
23
22
 
24
- Selector_List* selector();
25
-
26
23
  Block* operator()(Block*);
27
- Statement* operator()(Ruleset*);
24
+ Statement* operator()(StyleRule*);
28
25
  // Statement* operator()(Bubble*);
29
- Statement* operator()(Media_Block*);
30
- Statement* operator()(Supports_Block*);
31
- Statement* operator()(At_Root_Block*);
32
- Statement* operator()(Directive*);
26
+ Statement* operator()(CssMediaRule*);
27
+ Statement* operator()(SupportsRule*);
28
+ Statement* operator()(AtRootRule*);
29
+ Statement* operator()(AtRule*);
33
30
  Statement* operator()(Keyframe_Rule*);
34
31
  Statement* operator()(Trace*);
35
32
  Statement* operator()(Declaration*);
36
33
  // Statement* operator()(Assignment*);
37
34
  // Statement* operator()(Import*);
38
35
  // Statement* operator()(Import_Stub*);
39
- // Statement* operator()(Warning*);
36
+ // Statement* operator()(WarningRule*);
40
37
  // Statement* operator()(Error*);
41
38
  // Statement* operator()(Comment*);
42
39
  // Statement* operator()(If*);
43
- // Statement* operator()(For*);
44
- // Statement* operator()(Each*);
45
- // Statement* operator()(While*);
40
+ // Statement* operator()(ForRule*);
41
+ // Statement* operator()(EachRule*);
42
+ // Statement* operator()(WhileRule*);
46
43
  // Statement* operator()(Return*);
47
- // Statement* operator()(Extension*);
44
+ // Statement* operator()(ExtendRule*);
48
45
  // Statement* operator()(Definition*);
49
46
  // Statement* operator()(Mixin_Call*);
50
47
  // Statement* operator()(Content*);
51
48
  Statement* operator()(Null*);
52
49
 
53
50
  Statement* parent();
54
- std::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block*);
55
- Statement* bubble(Directive*);
56
- Statement* bubble(At_Root_Block*);
57
- Statement* bubble(Media_Block*);
58
- Statement* bubble(Supports_Block*);
51
+ sass::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block*);
52
+ Statement* bubble(AtRule*);
53
+ Statement* bubble(AtRootRule*);
54
+ Statement* bubble(CssMediaRule*);
55
+ Statement* bubble(SupportsRule*);
59
56
 
60
57
  Block* debubble(Block* children, Statement* parent = 0);
61
- Block* flatten(Block*);
58
+ Block* flatten(const Block*);
62
59
  bool bubblable(Statement*);
63
60
 
64
- List* merge_media_queries(Media_Block*, Media_Block*);
65
- Media_Query* merge_media_query(Media_Query*, Media_Query*);
66
-
67
61
  // generic fallback
68
62
  template <typename U>
69
63
  Statement* fallback(U x)