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
@@ -42,7 +42,7 @@ namespace Sass {
42
42
 
43
43
  }
44
44
 
45
- void Inspect::operator()(Ruleset* ruleset)
45
+ void Inspect::operator()(StyleRule* ruleset)
46
46
  {
47
47
  if (ruleset->selector()) {
48
48
  ruleset->selector()->perform(this);
@@ -67,18 +67,64 @@ namespace Sass {
67
67
  append_scope_closer();
68
68
  }
69
69
 
70
- void Inspect::operator()(Media_Block* media_block)
70
+ void Inspect::operator()(MediaRule* rule)
71
71
  {
72
72
  append_indentation();
73
- append_token("@media", media_block);
73
+ append_token("@media", rule);
74
+ append_mandatory_space();
75
+ if (rule->block()) {
76
+ rule->block()->perform(this);
77
+ }
78
+ }
79
+
80
+ void Inspect::operator()(CssMediaRule* rule)
81
+ {
82
+ if (output_style() == NESTED)
83
+ indentation += rule->tabs();
84
+ append_indentation();
85
+ append_token("@media", rule);
74
86
  append_mandatory_space();
75
87
  in_media_block = true;
76
- media_block->media_queries()->perform(this);
88
+ bool joinIt = false;
89
+ for (auto query : rule->elements()) {
90
+ if (joinIt) {
91
+ append_comma_separator();
92
+ append_optional_space();
93
+ }
94
+ operator()(query);
95
+ joinIt = true;
96
+ }
97
+ if (rule->block()) {
98
+ rule->block()->perform(this);
99
+ }
77
100
  in_media_block = false;
78
- media_block->block()->perform(this);
101
+ if (output_style() == NESTED)
102
+ indentation -= rule->tabs();
79
103
  }
80
104
 
81
- void Inspect::operator()(Supports_Block* feature_block)
105
+ void Inspect::operator()(CssMediaQuery* query)
106
+ {
107
+ bool joinIt = false;
108
+ if (!query->modifier().empty()) {
109
+ append_string(query->modifier());
110
+ append_mandatory_space();
111
+ }
112
+ if (!query->type().empty()) {
113
+ append_string(query->type());
114
+ joinIt = true;
115
+ }
116
+ for (auto feature : query->features()) {
117
+ if (joinIt) {
118
+ append_mandatory_space();
119
+ append_string("and");
120
+ append_mandatory_space();
121
+ }
122
+ append_string(feature);
123
+ joinIt = true;
124
+ }
125
+ }
126
+
127
+ void Inspect::operator()(SupportsRule* feature_block)
82
128
  {
83
129
  append_indentation();
84
130
  append_token("@supports", feature_block);
@@ -87,7 +133,7 @@ namespace Sass {
87
133
  feature_block->block()->perform(this);
88
134
  }
89
135
 
90
- void Inspect::operator()(At_Root_Block* at_root_block)
136
+ void Inspect::operator()(AtRootRule* at_root_block)
91
137
  {
92
138
  append_indentation();
93
139
  append_token("@at-root ", at_root_block);
@@ -96,7 +142,7 @@ namespace Sass {
96
142
  if(at_root_block->block()) at_root_block->block()->perform(this);
97
143
  }
98
144
 
99
- void Inspect::operator()(Directive* at_rule)
145
+ void Inspect::operator()(AtRule* at_rule)
100
146
  {
101
147
  append_indentation();
102
148
  append_token(at_rule->keyword(), at_rule);
@@ -134,8 +180,7 @@ namespace Sass {
134
180
  append_colon_separator();
135
181
 
136
182
  if (dec->value()->concrete_type() == Expression::SELECTOR) {
137
- Listize listize;
138
- Expression_Obj ls = dec->value()->perform(&listize);
183
+ ExpressionObj ls = Listize::perform(dec->value());
139
184
  ls->perform(this);
140
185
  } else {
141
186
  dec->value()->perform(this);
@@ -203,7 +248,7 @@ namespace Sass {
203
248
  append_delimiter();
204
249
  }
205
250
 
206
- void Inspect::operator()(Warning* warning)
251
+ void Inspect::operator()(WarningRule* warning)
207
252
  {
208
253
  append_indentation();
209
254
  append_token("@warn", warning);
@@ -212,7 +257,7 @@ namespace Sass {
212
257
  append_delimiter();
213
258
  }
214
259
 
215
- void Inspect::operator()(Error* error)
260
+ void Inspect::operator()(ErrorRule* error)
216
261
  {
217
262
  append_indentation();
218
263
  append_token("@error", error);
@@ -221,7 +266,7 @@ namespace Sass {
221
266
  append_delimiter();
222
267
  }
223
268
 
224
- void Inspect::operator()(Debug* debug)
269
+ void Inspect::operator()(DebugRule* debug)
225
270
  {
226
271
  append_indentation();
227
272
  append_token("@debug", debug);
@@ -252,7 +297,7 @@ namespace Sass {
252
297
  }
253
298
  }
254
299
 
255
- void Inspect::operator()(For* loop)
300
+ void Inspect::operator()(ForRule* loop)
256
301
  {
257
302
  append_indentation();
258
303
  append_token("@for", loop);
@@ -265,7 +310,7 @@ namespace Sass {
265
310
  loop->block()->perform(this);
266
311
  }
267
312
 
268
- void Inspect::operator()(Each* loop)
313
+ void Inspect::operator()(EachRule* loop)
269
314
  {
270
315
  append_indentation();
271
316
  append_token("@each", loop);
@@ -280,7 +325,7 @@ namespace Sass {
280
325
  loop->block()->perform(this);
281
326
  }
282
327
 
283
- void Inspect::operator()(While* loop)
328
+ void Inspect::operator()(WhileRule* loop)
284
329
  {
285
330
  append_indentation();
286
331
  append_token("@while", loop);
@@ -298,7 +343,7 @@ namespace Sass {
298
343
  append_delimiter();
299
344
  }
300
345
 
301
- void Inspect::operator()(Extension* extend)
346
+ void Inspect::operator()(ExtendRule* extend)
302
347
  {
303
348
  append_indentation();
304
349
  append_token("@extend", extend);
@@ -367,11 +412,11 @@ namespace Sass {
367
412
  append_string(")");
368
413
  }
369
414
 
370
- std::string Inspect::lbracket(List* list) {
415
+ sass::string Inspect::lbracket(List* list) {
371
416
  return list->is_bracketed() ? "[" : "(";
372
417
  }
373
418
 
374
- std::string Inspect::rbracket(List* list) {
419
+ sass::string Inspect::rbracket(List* list) {
375
420
  return list->is_bracketed() ? "]" : ")";
376
421
  }
377
422
 
@@ -382,7 +427,7 @@ namespace Sass {
382
427
  append_string(rbracket(list));
383
428
  return;
384
429
  }
385
- std::string sep(list->separator() == SASS_SPACE ? " " : ",");
430
+ sass::string sep(list->separator() == SASS_SPACE ? " " : ",");
386
431
  if ((output_style() != COMPRESSED) && sep == ",") sep += " ";
387
432
  else if (in_media_block && sep != " ") sep += " "; // verified
388
433
  if (list->empty()) return;
@@ -399,7 +444,7 @@ namespace Sass {
399
444
  list->length() == 1 &&
400
445
  !list->from_selector() &&
401
446
  !Cast<List>(list->at(0)) &&
402
- !Cast<Selector_List>(list->at(0))
447
+ !Cast<SelectorList>(list->at(0))
403
448
  ) {
404
449
  append_string(lbracket(list));
405
450
  }
@@ -416,7 +461,7 @@ namespace Sass {
416
461
  for (size_t i = 0, L = list->size(); i < L; ++i) {
417
462
  if (list->separator() == SASS_HASH)
418
463
  { sep[0] = i % 2 ? ':' : ','; }
419
- Expression_Obj list_item = list->at(i);
464
+ ExpressionObj list_item = list->at(i);
420
465
  if (output_style() != TO_SASS) {
421
466
  if (list_item->is_invisible()) {
422
467
  // this fixes an issue with "" in a list
@@ -449,7 +494,7 @@ namespace Sass {
449
494
  list->length() == 1 &&
450
495
  !list->from_selector() &&
451
496
  !Cast<List>(list->at(0)) &&
452
- !Cast<Selector_List>(list->at(0))
497
+ !Cast<SelectorList>(list->at(0))
453
498
  ) {
454
499
  append_string(",");
455
500
  append_string(rbracket(list));
@@ -525,12 +570,12 @@ namespace Sass {
525
570
  // reduce units
526
571
  n->reduce();
527
572
 
528
- std::stringstream ss;
573
+ sass::ostream ss;
529
574
  ss.precision(opt.precision);
530
575
  ss << std::fixed << n->value();
531
576
 
532
- std::string res = ss.str();
533
- int s = res.length();
577
+ sass::string res = ss.str();
578
+ size_t s = res.length();
534
579
 
535
580
  // delete trailing zeros
536
581
  for(s = s - 1; s > 0; --s)
@@ -562,6 +607,11 @@ namespace Sass {
562
607
  // add unit now
563
608
  res += n->unit();
564
609
 
610
+ if (opt.output_style == TO_CSS && !n->is_valid_css_unit()) {
611
+ // traces.push_back(Backtrace(nr->pstate()));
612
+ throw Exception::InvalidValue({}, *n);
613
+ }
614
+
565
615
  // output the final token
566
616
  append_token(res, n);
567
617
  }
@@ -577,14 +627,14 @@ namespace Sass {
577
627
  void Inspect::operator()(Color_RGBA* c)
578
628
  {
579
629
  // output the final token
580
- std::stringstream ss;
630
+ sass::ostream ss;
581
631
 
582
632
  // original color name
583
633
  // maybe an unknown token
584
- std::string name = c->disp();
634
+ sass::string name = c->disp();
585
635
 
586
636
  // resolved color
587
- std::string res_name = name;
637
+ sass::string res_name = name;
588
638
 
589
639
  double r = Sass::round(cap_channel<0xff>(c->r()), opt.precision);
590
640
  double g = Sass::round(cap_channel<0xff>(c->g()), opt.precision);
@@ -606,7 +656,7 @@ namespace Sass {
606
656
  res_name = color_to_name(numval);
607
657
  }
608
658
 
609
- std::stringstream hexlet;
659
+ sass::ostream hexlet;
610
660
  // dart sass compressed all colors in regular css always
611
661
  // ruby sass and libsass does it only when not delayed
612
662
  // since color math is going to be removed, this can go too
@@ -707,18 +757,18 @@ namespace Sass {
707
757
  append_token(w->message(), w);
708
758
  }
709
759
 
710
- void Inspect::operator()(Supports_Operator* so)
760
+ void Inspect::operator()(SupportsOperation* so)
711
761
  {
712
762
 
713
763
  if (so->needs_parens(so->left())) append_string("(");
714
764
  so->left()->perform(this);
715
765
  if (so->needs_parens(so->left())) append_string(")");
716
766
 
717
- if (so->operand() == Supports_Operator::AND) {
767
+ if (so->operand() == SupportsOperation::AND) {
718
768
  append_mandatory_space();
719
769
  append_token("and", so);
720
770
  append_mandatory_space();
721
- } else if (so->operand() == Supports_Operator::OR) {
771
+ } else if (so->operand() == SupportsOperation::OR) {
722
772
  append_mandatory_space();
723
773
  append_token("or", so);
724
774
  append_mandatory_space();
@@ -729,7 +779,7 @@ namespace Sass {
729
779
  if (so->needs_parens(so->right())) append_string(")");
730
780
  }
731
781
 
732
- void Inspect::operator()(Supports_Negation* sn)
782
+ void Inspect::operator()(SupportsNegation* sn)
733
783
  {
734
784
  append_token("not", sn);
735
785
  append_mandatory_space();
@@ -738,7 +788,7 @@ namespace Sass {
738
788
  if (sn->needs_parens(sn->condition())) append_string(")");
739
789
  }
740
790
 
741
- void Inspect::operator()(Supports_Declaration* sd)
791
+ void Inspect::operator()(SupportsDeclaration* sd)
742
792
  {
743
793
  append_string("(");
744
794
  sd->feature()->perform(this);
@@ -879,39 +929,33 @@ namespace Sass {
879
929
  s->contents()->perform(this);
880
930
  }
881
931
 
882
- void Inspect::operator()(Parent_Selector* p)
932
+ void Inspect::operator()(Parent_Reference* p)
883
933
  {
884
- if (p->real()) append_string("&");
934
+ append_string("&");
885
935
  }
886
936
 
887
- void Inspect::operator()(Placeholder_Selector* s)
937
+ void Inspect::operator()(PlaceholderSelector* s)
888
938
  {
889
939
  append_token(s->name(), s);
890
- if (s->has_line_break()) append_optional_linefeed();
891
- if (s->has_line_break()) append_indentation();
892
940
 
893
941
  }
894
942
 
895
- void Inspect::operator()(Type_Selector* s)
943
+ void Inspect::operator()(TypeSelector* s)
896
944
  {
897
945
  append_token(s->ns_name(), s);
898
946
  }
899
947
 
900
- void Inspect::operator()(Class_Selector* s)
948
+ void Inspect::operator()(ClassSelector* s)
901
949
  {
902
950
  append_token(s->ns_name(), s);
903
- if (s->has_line_break()) append_optional_linefeed();
904
- if (s->has_line_break()) append_indentation();
905
951
  }
906
952
 
907
- void Inspect::operator()(Id_Selector* s)
953
+ void Inspect::operator()(IDSelector* s)
908
954
  {
909
955
  append_token(s->ns_name(), s);
910
- if (s->has_line_break()) append_optional_linefeed();
911
- if (s->has_line_break()) append_indentation();
912
956
  }
913
957
 
914
- void Inspect::operator()(Attribute_Selector* s)
958
+ void Inspect::operator()(AttributeSelector* s)
915
959
  {
916
960
  append_string("[");
917
961
  add_open_mapping(s);
@@ -930,111 +974,38 @@ namespace Sass {
930
974
  append_string("]");
931
975
  }
932
976
 
933
- void Inspect::operator()(Pseudo_Selector* s)
977
+ void Inspect::operator()(PseudoSelector* s)
934
978
  {
935
- append_token(s->ns_name(), s);
936
- if (s->expression()) {
937
- append_string("(");
938
- s->expression()->perform(this);
939
- append_string(")");
940
- }
941
- }
942
-
943
- void Inspect::operator()(Wrapped_Selector* s)
944
- {
945
- if (s->name() == " ") {
946
- append_string("");
947
- } else {
948
- bool was = in_wrapped;
949
- in_wrapped = true;
950
- append_token(s->name(), s);
951
- append_string("(");
952
- bool was_comma_array = in_comma_array;
953
- in_comma_array = false;
954
- s->selector()->perform(this);
955
- in_comma_array = was_comma_array;
956
- append_string(")");
957
- in_wrapped = was;
958
- }
959
- }
960
-
961
- void Inspect::operator()(Compound_Selector* s)
962
- {
963
- for (size_t i = 0, L = s->length(); i < L; ++i) {
964
- (*s)[i]->perform(this);
965
- }
966
- if (s->has_line_break()) {
967
- if (output_style() != COMPACT) {
968
- append_optional_linefeed();
969
- }
970
- }
971
- }
972
-
973
- void Inspect::operator()(Complex_Selector* c)
974
- {
975
- Compound_Selector_Obj head = c->head();
976
- Complex_Selector_Obj tail = c->tail();
977
- Complex_Selector::Combinator comb = c->combinator();
978
-
979
- if (comb == Complex_Selector::ANCESTOR_OF && (!head || head->empty())) {
980
- if (tail) tail->perform(this);
981
- return;
982
- }
983
979
 
984
- if (c->has_line_feed()) {
985
- if (!(c->has_parent_ref())) {
986
- append_optional_linefeed();
987
- append_indentation();
980
+ if (s->name() != "") {
981
+ append_string(":");
982
+ if (s->isSyntacticElement()) {
983
+ append_string(":");
988
984
  }
989
- }
990
-
991
- if (head && head->length() != 0) head->perform(this);
992
- bool is_empty = !head || head->length() == 0 || head->is_empty_reference();
993
- bool is_tail = head && !head->is_empty_reference() && tail;
994
- if (output_style() == COMPRESSED && comb != Complex_Selector::ANCESTOR_OF) scheduled_space = 0;
995
-
996
- switch (comb) {
997
- case Complex_Selector::ANCESTOR_OF:
998
- if (is_tail) append_mandatory_space();
999
- break;
1000
- case Complex_Selector::PARENT_OF:
1001
- append_optional_space();
1002
- append_string(">");
1003
- append_optional_space();
1004
- break;
1005
- case Complex_Selector::ADJACENT_TO:
1006
- append_optional_space();
1007
- append_string("+");
1008
- append_optional_space();
1009
- break;
1010
- case Complex_Selector::REFERENCE:
1011
- append_mandatory_space();
1012
- append_string("/");
1013
- if (c->reference()) c->reference()->perform(this);
1014
- append_string("/");
1015
- append_mandatory_space();
1016
- break;
1017
- case Complex_Selector::PRECEDES:
1018
- if (is_empty) append_optional_space();
1019
- else append_mandatory_space();
1020
- append_string("~");
1021
- if (tail) append_mandatory_space();
1022
- else append_optional_space();
1023
- break;
1024
- default: break;
1025
- }
1026
- if (tail && comb != Complex_Selector::ANCESTOR_OF) {
1027
- if (c->has_line_break()) append_optional_linefeed();
1028
- }
1029
- if (tail) tail->perform(this);
1030
- if (!tail && c->has_line_break()) {
1031
- if (output_style() == COMPACT) {
1032
- append_mandatory_space();
985
+ append_token(s->ns_name(), s);
986
+ if (s->selector() || s->argument()) {
987
+ bool was = in_wrapped;
988
+ in_wrapped = true;
989
+ append_string("(");
990
+ if (s->argument()) {
991
+ s->argument()->perform(this);
992
+ }
993
+ if (s->selector() && s->argument()) {
994
+ append_mandatory_space();
995
+ }
996
+ bool was_comma_array = in_comma_array;
997
+ in_comma_array = false;
998
+ if (s->selector()) {
999
+ s->selector()->perform(this);
1000
+ }
1001
+ in_comma_array = was_comma_array;
1002
+ append_string(")");
1003
+ in_wrapped = was;
1033
1004
  }
1034
1005
  }
1035
1006
  }
1036
1007
 
1037
- void Inspect::operator()(Selector_List* g)
1008
+ void Inspect::operator()(SelectorList* g)
1038
1009
  {
1039
1010
 
1040
1011
  if (g->empty()) {
@@ -1049,7 +1020,7 @@ namespace Sass {
1049
1020
  // probably ruby sass eqivalent of element_needs_parens
1050
1021
  if (output_style() == TO_SASS && g->length() == 1 &&
1051
1022
  (!Cast<List>((*g)[0]) &&
1052
- !Cast<Selector_List>((*g)[0]))) {
1023
+ !Cast<SelectorList>((*g)[0]))) {
1053
1024
  append_string("(");
1054
1025
  }
1055
1026
  else if (!in_declaration && in_comma_array) {
@@ -1059,8 +1030,10 @@ namespace Sass {
1059
1030
  if (in_declaration) in_comma_array = true;
1060
1031
 
1061
1032
  for (size_t i = 0, L = g->length(); i < L; ++i) {
1033
+
1062
1034
  if (!in_wrapped && i == 0) append_indentation();
1063
1035
  if ((*g)[i] == nullptr) continue;
1036
+ if (g->at(i)->length() == 0) continue;
1064
1037
  schedule_mapping(g->at(i)->last());
1065
1038
  // add_open_mapping((*g)[i]->last());
1066
1039
  (*g)[i]->perform(this);
@@ -1075,7 +1048,7 @@ namespace Sass {
1075
1048
  // probably ruby sass eqivalent of element_needs_parens
1076
1049
  if (output_style() == TO_SASS && g->length() == 1 &&
1077
1050
  (!Cast<List>((*g)[0]) &&
1078
- !Cast<Selector_List>((*g)[0]))) {
1051
+ !Cast<SelectorList>((*g)[0]))) {
1079
1052
  append_string(",)");
1080
1053
  }
1081
1054
  else if (!in_declaration && in_comma_array) {
@@ -1083,5 +1056,70 @@ namespace Sass {
1083
1056
  }
1084
1057
 
1085
1058
  }
1059
+ void Inspect::operator()(ComplexSelector* sel)
1060
+ {
1061
+ if (sel->hasPreLineFeed()) {
1062
+ append_optional_linefeed();
1063
+ if (!in_wrapped && output_style() == NESTED) {
1064
+ append_indentation();
1065
+ }
1066
+ }
1067
+ const SelectorComponent* prev = nullptr;
1068
+ for (auto& item : sel->elements()) {
1069
+ if (prev != nullptr) {
1070
+ if (item->getCombinator() || prev->getCombinator()) {
1071
+ append_optional_space();
1072
+ } else {
1073
+ append_mandatory_space();
1074
+ }
1075
+ }
1076
+ item->perform(this);
1077
+ prev = item.ptr();
1078
+ }
1079
+ }
1080
+
1081
+ void Inspect::operator()(SelectorComponent* sel)
1082
+ {
1083
+ // You should probably never call this method directly
1084
+ // But in case anyone does, we will do the upcasting
1085
+ if (auto comp = Cast<CompoundSelector>(sel)) operator()(comp);
1086
+ if (auto comb = Cast<SelectorCombinator>(sel)) operator()(comb);
1087
+ }
1088
+
1089
+ void Inspect::operator()(CompoundSelector* sel)
1090
+ {
1091
+ if (sel->hasRealParent()) {
1092
+ append_string("&");
1093
+ }
1094
+ sel->sortChildren();
1095
+ for (auto& item : sel->elements()) {
1096
+ item->perform(this);
1097
+ }
1098
+ // Add the post line break (from ruby sass)
1099
+ // Dart sass uses another logic for newlines
1100
+ if (sel->hasPostLineBreak()) {
1101
+ if (output_style() != COMPACT) {
1102
+ append_optional_linefeed();
1103
+ }
1104
+ }
1105
+ }
1106
+
1107
+ void Inspect::operator()(SelectorCombinator* sel)
1108
+ {
1109
+ append_optional_space();
1110
+ switch (sel->combinator()) {
1111
+ case SelectorCombinator::Combinator::CHILD: append_string(">"); break;
1112
+ case SelectorCombinator::Combinator::GENERAL: append_string("~"); break;
1113
+ case SelectorCombinator::Combinator::ADJACENT: append_string("+"); break;
1114
+ }
1115
+ append_optional_space();
1116
+ // Add the post line break (from ruby sass)
1117
+ // Dart sass uses another logic for newlines
1118
+ if (sel->hasPostLineBreak()) {
1119
+ if (output_style() != COMPACT) {
1120
+ // append_optional_linefeed();
1121
+ }
1122
+ }
1123
+ }
1086
1124
 
1087
1125
  }
@@ -20,27 +20,26 @@ namespace Sass {
20
20
 
21
21
  // statements
22
22
  virtual void operator()(Block*);
23
- virtual void operator()(Ruleset*);
23
+ virtual void operator()(StyleRule*);
24
24
  virtual void operator()(Bubble*);
25
- virtual void operator()(Supports_Block*);
26
- virtual void operator()(Media_Block*);
27
- virtual void operator()(At_Root_Block*);
28
- virtual void operator()(Directive*);
25
+ virtual void operator()(SupportsRule*);
26
+ virtual void operator()(AtRootRule*);
27
+ virtual void operator()(AtRule*);
29
28
  virtual void operator()(Keyframe_Rule*);
30
29
  virtual void operator()(Declaration*);
31
30
  virtual void operator()(Assignment*);
32
31
  virtual void operator()(Import*);
33
32
  virtual void operator()(Import_Stub*);
34
- virtual void operator()(Warning*);
35
- virtual void operator()(Error*);
36
- virtual void operator()(Debug*);
33
+ virtual void operator()(WarningRule*);
34
+ virtual void operator()(ErrorRule*);
35
+ virtual void operator()(DebugRule*);
37
36
  virtual void operator()(Comment*);
38
37
  virtual void operator()(If*);
39
- virtual void operator()(For*);
40
- virtual void operator()(Each*);
41
- virtual void operator()(While*);
38
+ virtual void operator()(ForRule*);
39
+ virtual void operator()(EachRule*);
40
+ virtual void operator()(WhileRule*);
42
41
  virtual void operator()(Return*);
43
- virtual void operator()(Extension*);
42
+ virtual void operator()(ExtendRule*);
44
43
  virtual void operator()(Definition*);
45
44
  virtual void operator()(Mixin_Call*);
46
45
  virtual void operator()(Content*);
@@ -63,15 +62,18 @@ namespace Sass {
63
62
  virtual void operator()(String_Quoted*);
64
63
  virtual void operator()(Custom_Error*);
65
64
  virtual void operator()(Custom_Warning*);
66
- virtual void operator()(Supports_Operator*);
67
- virtual void operator()(Supports_Negation*);
68
- virtual void operator()(Supports_Declaration*);
65
+ virtual void operator()(SupportsOperation*);
66
+ virtual void operator()(SupportsNegation*);
67
+ virtual void operator()(SupportsDeclaration*);
69
68
  virtual void operator()(Supports_Interpolation*);
69
+ virtual void operator()(MediaRule*);
70
+ virtual void operator()(CssMediaRule*);
71
+ virtual void operator()(CssMediaQuery*);
70
72
  virtual void operator()(Media_Query*);
71
73
  virtual void operator()(Media_Query_Expression*);
72
74
  virtual void operator()(At_Root_Query*);
73
75
  virtual void operator()(Null*);
74
- virtual void operator()(Parent_Selector* p);
76
+ virtual void operator()(Parent_Reference* p);
75
77
  // parameters and arguments
76
78
  virtual void operator()(Parameter*);
77
79
  virtual void operator()(Parameters*);
@@ -79,19 +81,19 @@ namespace Sass {
79
81
  virtual void operator()(Arguments*);
80
82
  // selectors
81
83
  virtual void operator()(Selector_Schema*);
82
- virtual void operator()(Placeholder_Selector*);
83
- virtual void operator()(Type_Selector*);
84
- virtual void operator()(Class_Selector*);
85
- virtual void operator()(Id_Selector*);
86
- virtual void operator()(Attribute_Selector*);
87
- virtual void operator()(Pseudo_Selector*);
88
- virtual void operator()(Wrapped_Selector*);
89
- virtual void operator()(Compound_Selector*);
90
- virtual void operator()(Complex_Selector*);
91
- virtual void operator()(Selector_List*);
92
-
93
- virtual std::string lbracket(List*);
94
- virtual std::string rbracket(List*);
84
+ virtual void operator()(PlaceholderSelector*);
85
+ virtual void operator()(TypeSelector*);
86
+ virtual void operator()(ClassSelector*);
87
+ virtual void operator()(IDSelector*);
88
+ virtual void operator()(AttributeSelector*);
89
+ virtual void operator()(PseudoSelector*);
90
+ virtual void operator()(SelectorComponent*);
91
+ virtual void operator()(SelectorCombinator*);
92
+ virtual void operator()(CompoundSelector*);
93
+ virtual void operator()(ComplexSelector*);
94
+ virtual void operator()(SelectorList*);
95
+ virtual sass::string lbracket(List*);
96
+ virtual sass::string rbracket(List*);
95
97
 
96
98
  };
97
99