sassc 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }