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
@@ -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