sassc 2.3.0 → 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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/ext/libsass/VERSION +1 -1
  5. data/ext/libsass/include/sass/context.h +3 -0
  6. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  7. data/ext/libsass/src/ast.cpp +117 -117
  8. data/ext/libsass/src/ast.hpp +160 -162
  9. data/ext/libsass/src/ast_def_macros.hpp +10 -10
  10. data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
  11. data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
  12. data/ext/libsass/src/ast_helpers.hpp +5 -5
  13. data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
  14. data/ext/libsass/src/ast_sel_super.cpp +52 -52
  15. data/ext/libsass/src/ast_sel_unify.cpp +16 -16
  16. data/ext/libsass/src/ast_sel_weave.cpp +62 -62
  17. data/ext/libsass/src/ast_selectors.cpp +87 -77
  18. data/ext/libsass/src/ast_selectors.hpp +72 -62
  19. data/ext/libsass/src/ast_supports.cpp +35 -35
  20. data/ext/libsass/src/ast_supports.hpp +29 -29
  21. data/ext/libsass/src/ast_values.cpp +58 -58
  22. data/ext/libsass/src/ast_values.hpp +75 -75
  23. data/ext/libsass/src/backtrace.cpp +9 -9
  24. data/ext/libsass/src/backtrace.hpp +5 -5
  25. data/ext/libsass/src/base64vlq.cpp +2 -2
  26. data/ext/libsass/src/base64vlq.hpp +1 -1
  27. data/ext/libsass/src/bind.cpp +17 -17
  28. data/ext/libsass/src/bind.hpp +1 -1
  29. data/ext/libsass/src/c2ast.cpp +3 -3
  30. data/ext/libsass/src/c2ast.hpp +1 -1
  31. data/ext/libsass/src/check_nesting.cpp +36 -36
  32. data/ext/libsass/src/check_nesting.hpp +2 -2
  33. data/ext/libsass/src/color_maps.cpp +5 -5
  34. data/ext/libsass/src/color_maps.hpp +1 -1
  35. data/ext/libsass/src/context.cpp +63 -60
  36. data/ext/libsass/src/context.hpp +33 -33
  37. data/ext/libsass/src/cssize.cpp +30 -29
  38. data/ext/libsass/src/cssize.hpp +13 -13
  39. data/ext/libsass/src/dart_helpers.hpp +5 -5
  40. data/ext/libsass/src/debugger.hpp +127 -128
  41. data/ext/libsass/src/emitter.cpp +12 -12
  42. data/ext/libsass/src/emitter.hpp +10 -10
  43. data/ext/libsass/src/environment.cpp +27 -27
  44. data/ext/libsass/src/environment.hpp +24 -24
  45. data/ext/libsass/src/error_handling.cpp +42 -42
  46. data/ext/libsass/src/error_handling.hpp +38 -50
  47. data/ext/libsass/src/eval.cpp +138 -132
  48. data/ext/libsass/src/eval.hpp +17 -17
  49. data/ext/libsass/src/eval_selectors.cpp +3 -3
  50. data/ext/libsass/src/expand.cpp +70 -64
  51. data/ext/libsass/src/expand.hpp +12 -12
  52. data/ext/libsass/src/extender.cpp +55 -53
  53. data/ext/libsass/src/extender.hpp +14 -14
  54. data/ext/libsass/src/file.cpp +66 -58
  55. data/ext/libsass/src/file.hpp +23 -25
  56. data/ext/libsass/src/fn_colors.cpp +9 -9
  57. data/ext/libsass/src/fn_lists.cpp +18 -18
  58. data/ext/libsass/src/fn_maps.cpp +3 -3
  59. data/ext/libsass/src/fn_miscs.cpp +15 -15
  60. data/ext/libsass/src/fn_numbers.cpp +7 -7
  61. data/ext/libsass/src/fn_selectors.cpp +8 -8
  62. data/ext/libsass/src/fn_strings.cpp +34 -22
  63. data/ext/libsass/src/fn_utils.cpp +29 -26
  64. data/ext/libsass/src/fn_utils.hpp +10 -10
  65. data/ext/libsass/src/inspect.cpp +35 -34
  66. data/ext/libsass/src/inspect.hpp +21 -21
  67. data/ext/libsass/src/lexer.cpp +3 -1
  68. data/ext/libsass/src/listize.cpp +2 -2
  69. data/ext/libsass/src/mapping.hpp +1 -0
  70. data/ext/libsass/src/memory.hpp +12 -0
  71. data/ext/libsass/src/memory/allocator.cpp +48 -0
  72. data/ext/libsass/src/memory/allocator.hpp +138 -0
  73. data/ext/libsass/src/memory/config.hpp +20 -0
  74. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  75. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  76. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
  77. data/ext/libsass/src/operation.hpp +44 -44
  78. data/ext/libsass/src/operators.cpp +18 -18
  79. data/ext/libsass/src/operators.hpp +11 -11
  80. data/ext/libsass/src/ordered_map.hpp +18 -18
  81. data/ext/libsass/src/output.cpp +16 -16
  82. data/ext/libsass/src/output.hpp +5 -5
  83. data/ext/libsass/src/parser.cpp +327 -345
  84. data/ext/libsass/src/parser.hpp +77 -87
  85. data/ext/libsass/src/parser_selectors.cpp +6 -6
  86. data/ext/libsass/src/permutate.hpp +39 -15
  87. data/ext/libsass/src/plugins.cpp +7 -7
  88. data/ext/libsass/src/plugins.hpp +8 -8
  89. data/ext/libsass/src/position.cpp +7 -26
  90. data/ext/libsass/src/position.hpp +44 -21
  91. data/ext/libsass/src/remove_placeholders.cpp +4 -4
  92. data/ext/libsass/src/remove_placeholders.hpp +3 -3
  93. data/ext/libsass/src/sass.cpp +16 -15
  94. data/ext/libsass/src/sass.hpp +9 -5
  95. data/ext/libsass/src/sass_context.cpp +52 -34
  96. data/ext/libsass/src/sass_values.cpp +8 -10
  97. data/ext/libsass/src/settings.hpp +19 -0
  98. data/ext/libsass/src/source.cpp +69 -0
  99. data/ext/libsass/src/source.hpp +95 -0
  100. data/ext/libsass/src/source_data.hpp +32 -0
  101. data/ext/libsass/src/source_map.cpp +22 -18
  102. data/ext/libsass/src/source_map.hpp +12 -9
  103. data/ext/libsass/src/units.cpp +19 -19
  104. data/ext/libsass/src/units.hpp +8 -8
  105. data/ext/libsass/src/utf8_string.cpp +9 -10
  106. data/ext/libsass/src/utf8_string.hpp +7 -6
  107. data/ext/libsass/src/util.cpp +38 -38
  108. data/ext/libsass/src/util.hpp +18 -18
  109. data/ext/libsass/src/util_string.cpp +13 -13
  110. data/ext/libsass/src/util_string.hpp +9 -8
  111. data/ext/libsass/src/values.cpp +12 -12
  112. data/lib/sassc/native.rb +3 -5
  113. data/lib/sassc/version.rb +1 -1
  114. data/test/native_test.rb +4 -4
  115. metadata +14 -5
  116. data/lib/sassc/native/lib_c.rb +0 -21
@@ -10,12 +10,13 @@ namespace Sass {
10
10
 
11
11
  Definition* make_native_function(Signature sig, Native_Function func, Context& ctx)
12
12
  {
13
- Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[built-in function]"));
13
+ SourceFile* source = SASS_MEMORY_NEW(SourceFile, "[built-in function]", sig, std::string::npos);
14
+ Parser sig_parser(source, ctx, ctx.traces);
14
15
  sig_parser.lex<Prelexer::identifier>();
15
- std::string name(Util::normalize_underscores(sig_parser.lexed));
16
+ sass::string name(Util::normalize_underscores(sig_parser.lexed));
16
17
  Parameters_Obj params = sig_parser.parse_parameters();
17
18
  return SASS_MEMORY_NEW(Definition,
18
- ParserState("[built-in function]"),
19
+ SourceSpan(source),
19
20
  sig,
20
21
  name,
21
22
  params,
@@ -26,19 +27,19 @@ namespace Sass {
26
27
  Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx)
27
28
  {
28
29
  using namespace Prelexer;
29
-
30
30
  const char* sig = sass_function_get_signature(c_func);
31
- Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[c function]"));
31
+ SourceFile* source = SASS_MEMORY_NEW(SourceFile, "[c function]", sig, std::string::npos);
32
+ Parser sig_parser(source, ctx, ctx.traces);
32
33
  // allow to overload generic callback plus @warn, @error and @debug with custom functions
33
34
  sig_parser.lex < alternatives < identifier, exactly <'*'>,
34
35
  exactly < Constants::warn_kwd >,
35
36
  exactly < Constants::error_kwd >,
36
37
  exactly < Constants::debug_kwd >
37
38
  > >();
38
- std::string name(Util::normalize_underscores(sig_parser.lexed));
39
+ sass::string name(Util::normalize_underscores(sig_parser.lexed));
39
40
  Parameters_Obj params = sig_parser.parse_parameters();
40
41
  return SASS_MEMORY_NEW(Definition,
41
- ParserState("[c function]"),
42
+ SourceSpan(source),
42
43
  sig,
43
44
  name,
44
45
  params,
@@ -47,13 +48,13 @@ namespace Sass {
47
48
 
48
49
  namespace Functions {
49
50
 
50
- std::string function_name(Signature sig)
51
+ sass::string function_name(Signature sig)
51
52
  {
52
- std::string str(sig);
53
+ sass::string str(sig);
53
54
  return str.substr(0, str.find('('));
54
55
  }
55
56
 
56
- Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
57
+ Map* get_arg_m(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
57
58
  {
58
59
  AST_Node* value = env[argname];
59
60
  if (Map* map = Cast<Map>(value)) return map;
@@ -64,14 +65,14 @@ namespace Sass {
64
65
  return get_arg<Map>(argname, env, sig, pstate, traces);
65
66
  }
66
67
 
67
- double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi)
68
+ double get_arg_r(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, double lo, double hi)
68
69
  {
69
70
  Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
70
71
  Number tmpnr(val);
71
72
  tmpnr.reduce();
72
73
  double v = tmpnr.value();
73
74
  if (!(lo <= v && v <= hi)) {
74
- std::stringstream msg;
75
+ sass::ostream msg;
75
76
  msg << "argument `" << argname << "` of `" << sig << "` must be between ";
76
77
  msg << lo << " and " << hi;
77
78
  error(msg.str(), pstate, traces);
@@ -79,7 +80,7 @@ namespace Sass {
79
80
  return v;
80
81
  }
81
82
 
82
- Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
83
+ Number* get_arg_n(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
83
84
  {
84
85
  Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
85
86
  val = SASS_MEMORY_COPY(val);
@@ -87,7 +88,7 @@ namespace Sass {
87
88
  return val;
88
89
  }
89
90
 
90
- double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
91
+ double get_arg_val(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
91
92
  {
92
93
  Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
93
94
  Number tmpnr(val);
@@ -95,7 +96,7 @@ namespace Sass {
95
96
  return tmpnr.value();
96
97
  }
97
98
 
98
- double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
99
+ double color_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
99
100
  {
100
101
  Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
101
102
  Number tmpnr(val);
@@ -107,7 +108,7 @@ namespace Sass {
107
108
  }
108
109
  }
109
110
 
110
- double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces) {
111
+ double alpha_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces) {
111
112
  Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
112
113
  Number tmpnr(val);
113
114
  tmpnr.reduce();
@@ -118,10 +119,10 @@ namespace Sass {
118
119
  }
119
120
  }
120
121
 
121
- SelectorListObj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
122
- Expression_Obj exp = ARG(argname, Expression);
122
+ SelectorListObj get_arg_sels(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx) {
123
+ ExpressionObj exp = ARG(argname, Expression);
123
124
  if (exp->concrete_type() == Expression::NULL_VAL) {
124
- std::stringstream msg;
125
+ sass::ostream msg;
125
126
  msg << argname << ": null is not a valid selector: it must be a string,\n";
126
127
  msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
127
128
  error(msg.str(), exp->pstate(), traces);
@@ -129,22 +130,24 @@ namespace Sass {
129
130
  if (String_Constant* str = Cast<String_Constant>(exp)) {
130
131
  str->quote_mark(0);
131
132
  }
132
- std::string exp_src = exp->to_string(ctx.c_options);
133
- return Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
133
+ sass::string exp_src = exp->to_string(ctx.c_options);
134
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
135
+ return Parser::parse_selector(source, ctx, traces, false);
134
136
  }
135
137
 
136
- CompoundSelectorObj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
137
- Expression_Obj exp = ARG(argname, Expression);
138
+ CompoundSelectorObj get_arg_sel(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx) {
139
+ ExpressionObj exp = ARG(argname, Expression);
138
140
  if (exp->concrete_type() == Expression::NULL_VAL) {
139
- std::stringstream msg;
141
+ sass::ostream msg;
140
142
  msg << argname << ": null is not a string for `" << function_name(sig) << "'";
141
143
  error(msg.str(), exp->pstate(), traces);
142
144
  }
143
145
  if (String_Constant* str = Cast<String_Constant>(exp)) {
144
146
  str->quote_mark(0);
145
147
  }
146
- std::string exp_src = exp->to_string(ctx.c_options);
147
- SelectorListObj sel_list = Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
148
+ sass::string exp_src = exp->to_string(ctx.c_options);
149
+ ItplFile* source = SASS_MEMORY_NEW(ItplFile, exp_src.c_str(), exp->pstate());
150
+ SelectorListObj sel_list = Parser::parse_selector(source, ctx, traces, false);
148
151
  if (sel_list->length() == 0) return {};
149
152
  return sel_list->first()->first();
150
153
  }
@@ -18,7 +18,7 @@ namespace Sass {
18
18
  Env& d_env, \
19
19
  Context& ctx, \
20
20
  Signature sig, \
21
- ParserState pstate, \
21
+ SourceSpan pstate, \
22
22
  Backtraces& traces, \
23
23
  SelectorStack selector_stack, \
24
24
  SelectorStack original_stack \
@@ -37,7 +37,7 @@ namespace Sass {
37
37
  namespace Functions {
38
38
 
39
39
  template <typename T>
40
- T* get_arg(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
40
+ T* get_arg(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces)
41
41
  {
42
42
  T* val = Cast<T>(env[argname]);
43
43
  if (!val) {
@@ -46,14 +46,14 @@ namespace Sass {
46
46
  return val;
47
47
  }
48
48
 
49
- Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // maps only
50
- Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // numbers only
51
- double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
52
- double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
53
- double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi); // colors only
54
- double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // shared
55
- SelectorListObj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
56
- CompoundSelectorObj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
49
+ Map* get_arg_m(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // maps only
50
+ Number* get_arg_n(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // numbers only
51
+ double alpha_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // colors only
52
+ double color_num(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // colors only
53
+ double get_arg_r(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, double lo, double hi); // colors only
54
+ double get_arg_val(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces); // shared
55
+ SelectorListObj get_arg_sels(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx); // selectors only
56
+ CompoundSelectorObj get_arg_sel(const sass::string& argname, Env& env, Signature sig, SourceSpan pstate, Backtraces traces, Context& ctx); // selectors only
57
57
 
58
58
  }
59
59
 
@@ -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);
@@ -124,7 +124,7 @@ namespace Sass {
124
124
  }
125
125
  }
126
126
 
127
- void Inspect::operator()(Supports_Block* feature_block)
127
+ void Inspect::operator()(SupportsRule* feature_block)
128
128
  {
129
129
  append_indentation();
130
130
  append_token("@supports", feature_block);
@@ -133,7 +133,7 @@ namespace Sass {
133
133
  feature_block->block()->perform(this);
134
134
  }
135
135
 
136
- void Inspect::operator()(At_Root_Block* at_root_block)
136
+ void Inspect::operator()(AtRootRule* at_root_block)
137
137
  {
138
138
  append_indentation();
139
139
  append_token("@at-root ", at_root_block);
@@ -142,7 +142,7 @@ namespace Sass {
142
142
  if(at_root_block->block()) at_root_block->block()->perform(this);
143
143
  }
144
144
 
145
- void Inspect::operator()(Directive* at_rule)
145
+ void Inspect::operator()(AtRule* at_rule)
146
146
  {
147
147
  append_indentation();
148
148
  append_token(at_rule->keyword(), at_rule);
@@ -180,7 +180,7 @@ namespace Sass {
180
180
  append_colon_separator();
181
181
 
182
182
  if (dec->value()->concrete_type() == Expression::SELECTOR) {
183
- Expression_Obj ls = Listize::perform(dec->value());
183
+ ExpressionObj ls = Listize::perform(dec->value());
184
184
  ls->perform(this);
185
185
  } else {
186
186
  dec->value()->perform(this);
@@ -248,7 +248,7 @@ namespace Sass {
248
248
  append_delimiter();
249
249
  }
250
250
 
251
- void Inspect::operator()(Warning* warning)
251
+ void Inspect::operator()(WarningRule* warning)
252
252
  {
253
253
  append_indentation();
254
254
  append_token("@warn", warning);
@@ -257,7 +257,7 @@ namespace Sass {
257
257
  append_delimiter();
258
258
  }
259
259
 
260
- void Inspect::operator()(Error* error)
260
+ void Inspect::operator()(ErrorRule* error)
261
261
  {
262
262
  append_indentation();
263
263
  append_token("@error", error);
@@ -266,7 +266,7 @@ namespace Sass {
266
266
  append_delimiter();
267
267
  }
268
268
 
269
- void Inspect::operator()(Debug* debug)
269
+ void Inspect::operator()(DebugRule* debug)
270
270
  {
271
271
  append_indentation();
272
272
  append_token("@debug", debug);
@@ -297,7 +297,7 @@ namespace Sass {
297
297
  }
298
298
  }
299
299
 
300
- void Inspect::operator()(For* loop)
300
+ void Inspect::operator()(ForRule* loop)
301
301
  {
302
302
  append_indentation();
303
303
  append_token("@for", loop);
@@ -310,7 +310,7 @@ namespace Sass {
310
310
  loop->block()->perform(this);
311
311
  }
312
312
 
313
- void Inspect::operator()(Each* loop)
313
+ void Inspect::operator()(EachRule* loop)
314
314
  {
315
315
  append_indentation();
316
316
  append_token("@each", loop);
@@ -325,7 +325,7 @@ namespace Sass {
325
325
  loop->block()->perform(this);
326
326
  }
327
327
 
328
- void Inspect::operator()(While* loop)
328
+ void Inspect::operator()(WhileRule* loop)
329
329
  {
330
330
  append_indentation();
331
331
  append_token("@while", loop);
@@ -412,11 +412,11 @@ namespace Sass {
412
412
  append_string(")");
413
413
  }
414
414
 
415
- std::string Inspect::lbracket(List* list) {
415
+ sass::string Inspect::lbracket(List* list) {
416
416
  return list->is_bracketed() ? "[" : "(";
417
417
  }
418
418
 
419
- std::string Inspect::rbracket(List* list) {
419
+ sass::string Inspect::rbracket(List* list) {
420
420
  return list->is_bracketed() ? "]" : ")";
421
421
  }
422
422
 
@@ -427,7 +427,7 @@ namespace Sass {
427
427
  append_string(rbracket(list));
428
428
  return;
429
429
  }
430
- std::string sep(list->separator() == SASS_SPACE ? " " : ",");
430
+ sass::string sep(list->separator() == SASS_SPACE ? " " : ",");
431
431
  if ((output_style() != COMPRESSED) && sep == ",") sep += " ";
432
432
  else if (in_media_block && sep != " ") sep += " "; // verified
433
433
  if (list->empty()) return;
@@ -461,7 +461,7 @@ namespace Sass {
461
461
  for (size_t i = 0, L = list->size(); i < L; ++i) {
462
462
  if (list->separator() == SASS_HASH)
463
463
  { sep[0] = i % 2 ? ':' : ','; }
464
- Expression_Obj list_item = list->at(i);
464
+ ExpressionObj list_item = list->at(i);
465
465
  if (output_style() != TO_SASS) {
466
466
  if (list_item->is_invisible()) {
467
467
  // this fixes an issue with "" in a list
@@ -570,11 +570,11 @@ namespace Sass {
570
570
  // reduce units
571
571
  n->reduce();
572
572
 
573
- std::stringstream ss;
573
+ sass::ostream ss;
574
574
  ss.precision(opt.precision);
575
575
  ss << std::fixed << n->value();
576
576
 
577
- std::string res = ss.str();
577
+ sass::string res = ss.str();
578
578
  size_t s = res.length();
579
579
 
580
580
  // delete trailing zeros
@@ -627,14 +627,14 @@ namespace Sass {
627
627
  void Inspect::operator()(Color_RGBA* c)
628
628
  {
629
629
  // output the final token
630
- std::stringstream ss;
630
+ sass::ostream ss;
631
631
 
632
632
  // original color name
633
633
  // maybe an unknown token
634
- std::string name = c->disp();
634
+ sass::string name = c->disp();
635
635
 
636
636
  // resolved color
637
- std::string res_name = name;
637
+ sass::string res_name = name;
638
638
 
639
639
  double r = Sass::round(cap_channel<0xff>(c->r()), opt.precision);
640
640
  double g = Sass::round(cap_channel<0xff>(c->g()), opt.precision);
@@ -656,7 +656,7 @@ namespace Sass {
656
656
  res_name = color_to_name(numval);
657
657
  }
658
658
 
659
- std::stringstream hexlet;
659
+ sass::ostream hexlet;
660
660
  // dart sass compressed all colors in regular css always
661
661
  // ruby sass and libsass does it only when not delayed
662
662
  // since color math is going to be removed, this can go too
@@ -757,18 +757,18 @@ namespace Sass {
757
757
  append_token(w->message(), w);
758
758
  }
759
759
 
760
- void Inspect::operator()(Supports_Operator* so)
760
+ void Inspect::operator()(SupportsOperation* so)
761
761
  {
762
762
 
763
763
  if (so->needs_parens(so->left())) append_string("(");
764
764
  so->left()->perform(this);
765
765
  if (so->needs_parens(so->left())) append_string(")");
766
766
 
767
- if (so->operand() == Supports_Operator::AND) {
767
+ if (so->operand() == SupportsOperation::AND) {
768
768
  append_mandatory_space();
769
769
  append_token("and", so);
770
770
  append_mandatory_space();
771
- } else if (so->operand() == Supports_Operator::OR) {
771
+ } else if (so->operand() == SupportsOperation::OR) {
772
772
  append_mandatory_space();
773
773
  append_token("or", so);
774
774
  append_mandatory_space();
@@ -779,7 +779,7 @@ namespace Sass {
779
779
  if (so->needs_parens(so->right())) append_string(")");
780
780
  }
781
781
 
782
- void Inspect::operator()(Supports_Negation* sn)
782
+ void Inspect::operator()(SupportsNegation* sn)
783
783
  {
784
784
  append_token("not", sn);
785
785
  append_mandatory_space();
@@ -788,7 +788,7 @@ namespace Sass {
788
788
  if (sn->needs_parens(sn->condition())) append_string(")");
789
789
  }
790
790
 
791
- void Inspect::operator()(Supports_Declaration* sd)
791
+ void Inspect::operator()(SupportsDeclaration* sd)
792
792
  {
793
793
  append_string("(");
794
794
  sd->feature()->perform(this);
@@ -934,28 +934,28 @@ namespace Sass {
934
934
  append_string("&");
935
935
  }
936
936
 
937
- void Inspect::operator()(Placeholder_Selector* s)
937
+ void Inspect::operator()(PlaceholderSelector* s)
938
938
  {
939
939
  append_token(s->name(), s);
940
940
 
941
941
  }
942
942
 
943
- void Inspect::operator()(Type_Selector* s)
943
+ void Inspect::operator()(TypeSelector* s)
944
944
  {
945
945
  append_token(s->ns_name(), s);
946
946
  }
947
947
 
948
- void Inspect::operator()(Class_Selector* s)
948
+ void Inspect::operator()(ClassSelector* s)
949
949
  {
950
950
  append_token(s->ns_name(), s);
951
951
  }
952
952
 
953
- void Inspect::operator()(Id_Selector* s)
953
+ void Inspect::operator()(IDSelector* s)
954
954
  {
955
955
  append_token(s->ns_name(), s);
956
956
  }
957
957
 
958
- void Inspect::operator()(Attribute_Selector* s)
958
+ void Inspect::operator()(AttributeSelector* s)
959
959
  {
960
960
  append_string("[");
961
961
  add_open_mapping(s);
@@ -974,7 +974,7 @@ namespace Sass {
974
974
  append_string("]");
975
975
  }
976
976
 
977
- void Inspect::operator()(Pseudo_Selector* s)
977
+ void Inspect::operator()(PseudoSelector* s)
978
978
  {
979
979
 
980
980
  if (s->name() != "") {
@@ -1033,6 +1033,7 @@ namespace Sass {
1033
1033
 
1034
1034
  if (!in_wrapped && i == 0) append_indentation();
1035
1035
  if ((*g)[i] == nullptr) continue;
1036
+ if (g->at(i)->length() == 0) continue;
1036
1037
  schedule_mapping(g->at(i)->last());
1037
1038
  // add_open_mapping((*g)[i]->last());
1038
1039
  (*g)[i]->perform(this);
@@ -1066,8 +1067,7 @@ namespace Sass {
1066
1067
  const SelectorComponent* prev = nullptr;
1067
1068
  for (auto& item : sel->elements()) {
1068
1069
  if (prev != nullptr) {
1069
- if (typeid(*item) == typeid(SelectorCombinator) ||
1070
- typeid(*prev) == typeid(SelectorCombinator)) {
1070
+ if (item->getCombinator() || prev->getCombinator()) {
1071
1071
  append_optional_space();
1072
1072
  } else {
1073
1073
  append_mandatory_space();
@@ -1091,6 +1091,7 @@ namespace Sass {
1091
1091
  if (sel->hasRealParent()) {
1092
1092
  append_string("&");
1093
1093
  }
1094
+ sel->sortChildren();
1094
1095
  for (auto& item : sel->elements()) {
1095
1096
  item->perform(this);
1096
1097
  }