sassc 2.1.0.pre3 → 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 +24 -0
  4. data/Rakefile +2 -4
  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.hpp +12 -0
  81. data/ext/libsass/src/memory/allocator.cpp +48 -0
  82. data/ext/libsass/src/memory/allocator.hpp +138 -0
  83. data/ext/libsass/src/memory/config.hpp +20 -0
  84. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  85. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  86. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  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 +11 -13
  132. data/lib/sassc/native.rb +9 -7
  133. data/lib/sassc/script.rb +4 -6
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +38 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +31 -18
  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
@@ -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
- Selector_List_Obj 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,28 +130,29 @@ 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
- Compound_Selector_Obj 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
- Selector_List_Obj 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
- Complex_Selector_Obj first = sel_list->first();
150
- if (!first->tail()) return first->head();
151
- return first->tail()->head();
152
+ return sel_list->first()->first();
152
153
  }
153
154
 
155
+
154
156
  }
155
157
 
156
158
  }
@@ -1,5 +1,10 @@
1
1
  #ifndef SASS_FN_UTILS_H
2
2
  #define SASS_FN_UTILS_H
3
+
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
3
8
  #include "units.hpp"
4
9
  #include "backtrace.hpp"
5
10
  #include "environment.hpp"
@@ -13,9 +18,10 @@ namespace Sass {
13
18
  Env& d_env, \
14
19
  Context& ctx, \
15
20
  Signature sig, \
16
- ParserState pstate, \
21
+ SourceSpan pstate, \
17
22
  Backtraces& traces, \
18
- SelectorStack& selector_stack
23
+ SelectorStack selector_stack, \
24
+ SelectorStack original_stack \
19
25
 
20
26
  typedef const char* Signature;
21
27
  typedef PreValue* (*Native_Function)(FN_PROTOTYPE);
@@ -31,7 +37,7 @@ namespace Sass {
31
37
  namespace Functions {
32
38
 
33
39
  template <typename T>
34
- 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)
35
41
  {
36
42
  T* val = Cast<T>(env[argname]);
37
43
  if (!val) {
@@ -40,14 +46,14 @@ namespace Sass {
40
46
  return val;
41
47
  }
42
48
 
43
- Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // maps only
44
- Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // numbers only
45
- double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
46
- double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
47
- double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi); // colors only
48
- double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // shared
49
- Selector_List_Obj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
50
- Compound_Selector_Obj 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
51
57
 
52
58
  }
53
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);
@@ -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
  }