sassc 2.0.1 → 2.1.0.pre1

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -10,66 +10,66 @@ namespace Sass {
10
10
 
11
11
  struct Backtrace;
12
12
 
13
- class Cssize : public Operation_CRTP<Statement_Ptr, Cssize> {
13
+ class Cssize : public Operation_CRTP<Statement*, Cssize> {
14
14
 
15
15
  Context& ctx;
16
16
  Backtraces& traces;
17
- std::vector<Block_Ptr> block_stack;
18
- std::vector<Statement_Ptr> p_stack;
19
-
20
- Statement_Ptr fallback_impl(AST_Node_Ptr n);
17
+ BlockStack block_stack;
18
+ std::vector<Statement*> p_stack;
21
19
 
22
20
  public:
23
21
  Cssize(Context&);
24
22
  ~Cssize() { }
25
23
 
26
- Selector_List_Ptr selector();
27
-
28
- Block_Ptr operator()(Block_Ptr);
29
- Statement_Ptr operator()(Ruleset_Ptr);
30
- // Statement_Ptr operator()(Bubble_Ptr);
31
- Statement_Ptr operator()(Media_Block_Ptr);
32
- Statement_Ptr operator()(Supports_Block_Ptr);
33
- Statement_Ptr operator()(At_Root_Block_Ptr);
34
- Statement_Ptr operator()(Directive_Ptr);
35
- Statement_Ptr operator()(Keyframe_Rule_Ptr);
36
- Statement_Ptr operator()(Trace_Ptr);
37
- Statement_Ptr operator()(Declaration_Ptr);
38
- // Statement_Ptr operator()(Assignment_Ptr);
39
- // Statement_Ptr operator()(Import_Ptr);
40
- // Statement_Ptr operator()(Import_Stub_Ptr);
41
- // Statement_Ptr operator()(Warning_Ptr);
42
- // Statement_Ptr operator()(Error_Ptr);
43
- // Statement_Ptr operator()(Comment_Ptr);
44
- // Statement_Ptr operator()(If_Ptr);
45
- // Statement_Ptr operator()(For_Ptr);
46
- // Statement_Ptr operator()(Each_Ptr);
47
- // Statement_Ptr operator()(While_Ptr);
48
- // Statement_Ptr operator()(Return_Ptr);
49
- // Statement_Ptr operator()(Extension_Ptr);
50
- // Statement_Ptr operator()(Definition_Ptr);
51
- // Statement_Ptr operator()(Mixin_Call_Ptr);
52
- // Statement_Ptr operator()(Content_Ptr);
53
- Statement_Ptr operator()(Null_Ptr);
54
-
55
- Statement_Ptr parent();
56
- std::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block_Ptr);
57
- Statement_Ptr bubble(Directive_Ptr);
58
- Statement_Ptr bubble(At_Root_Block_Ptr);
59
- Statement_Ptr bubble(Media_Block_Ptr);
60
- Statement_Ptr bubble(Supports_Block_Ptr);
61
-
62
- Block_Ptr debubble(Block_Ptr children, Statement_Ptr parent = 0);
63
- Block_Ptr flatten(Block_Ptr);
64
- bool bubblable(Statement_Ptr);
65
-
66
- List_Ptr merge_media_queries(Media_Block_Ptr, Media_Block_Ptr);
67
- Media_Query_Ptr merge_media_query(Media_Query_Ptr, Media_Query_Ptr);
68
-
24
+ Selector_List* selector();
25
+
26
+ Block* operator()(Block*);
27
+ Statement* operator()(Ruleset*);
28
+ // Statement* operator()(Bubble*);
29
+ Statement* operator()(Media_Block*);
30
+ Statement* operator()(Supports_Block*);
31
+ Statement* operator()(At_Root_Block*);
32
+ Statement* operator()(Directive*);
33
+ Statement* operator()(Keyframe_Rule*);
34
+ Statement* operator()(Trace*);
35
+ Statement* operator()(Declaration*);
36
+ // Statement* operator()(Assignment*);
37
+ // Statement* operator()(Import*);
38
+ // Statement* operator()(Import_Stub*);
39
+ // Statement* operator()(Warning*);
40
+ // Statement* operator()(Error*);
41
+ // Statement* operator()(Comment*);
42
+ // Statement* operator()(If*);
43
+ // Statement* operator()(For*);
44
+ // Statement* operator()(Each*);
45
+ // Statement* operator()(While*);
46
+ // Statement* operator()(Return*);
47
+ // Statement* operator()(Extension*);
48
+ // Statement* operator()(Definition*);
49
+ // Statement* operator()(Mixin_Call*);
50
+ // Statement* operator()(Content*);
51
+ Statement* operator()(Null*);
52
+
53
+ Statement* parent();
54
+ std::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block*);
55
+ Statement* bubble(Directive*);
56
+ Statement* bubble(At_Root_Block*);
57
+ Statement* bubble(Media_Block*);
58
+ Statement* bubble(Supports_Block*);
59
+
60
+ Block* debubble(Block* children, Statement* parent = 0);
61
+ Block* flatten(Block*);
62
+ bool bubblable(Statement*);
63
+
64
+ List* merge_media_queries(Media_Block*, Media_Block*);
65
+ Media_Query* merge_media_query(Media_Query*, Media_Query*);
66
+
67
+ // generic fallback
69
68
  template <typename U>
70
- Statement_Ptr fallback(U x) { return fallback_impl(x); }
69
+ Statement* fallback(U x)
70
+ { return Cast<Statement>(x); }
71
71
 
72
- void append_block(Block_Ptr, Block_Ptr);
72
+ void append_block(Block*, Block*);
73
73
  };
74
74
 
75
75
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  using namespace Sass;
10
10
 
11
- inline void debug_ast(AST_Node_Ptr node, std::string ind = "", Env* env = 0);
11
+ inline void debug_ast(AST_Node* node, std::string ind = "", Env* env = 0);
12
12
 
13
13
  inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0) {
14
14
  debug_ast(const_cast<AST_Node*>(node), ind, env);
@@ -48,7 +48,7 @@ inline std::string longToHex(long long t) {
48
48
  return is.str();
49
49
  }
50
50
 
51
- inline std::string pstate_source_position(AST_Node_Ptr node)
51
+ inline std::string pstate_source_position(AST_Node* node)
52
52
  {
53
53
  std::stringstream str;
54
54
  Position start(node->pstate());
@@ -64,26 +64,26 @@ inline std::string pstate_source_position(AST_Node_Ptr node)
64
64
  return str.str();
65
65
  }
66
66
 
67
- inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
67
+ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
68
68
  {
69
69
  if (node == 0) return;
70
70
  if (ind == "") std::cerr << "####################################################################\n";
71
71
  if (Cast<Bubble>(node)) {
72
- Bubble_Ptr bubble = Cast<Bubble>(node);
72
+ Bubble* bubble = Cast<Bubble>(node);
73
73
  std::cerr << ind << "Bubble " << bubble;
74
74
  std::cerr << " (" << pstate_source_position(node) << ")";
75
75
  std::cerr << " " << bubble->tabs();
76
76
  std::cerr << std::endl;
77
77
  debug_ast(bubble->node(), ind + " ", env);
78
78
  } else if (Cast<Trace>(node)) {
79
- Trace_Ptr trace = Cast<Trace>(node);
79
+ Trace* trace = Cast<Trace>(node);
80
80
  std::cerr << ind << "Trace " << trace;
81
81
  std::cerr << " (" << pstate_source_position(node) << ")"
82
82
  << " [name:" << trace->name() << ", type: " << trace->type() << "]"
83
83
  << std::endl;
84
84
  debug_ast(trace->block(), ind + " ", env);
85
85
  } else if (Cast<At_Root_Block>(node)) {
86
- At_Root_Block_Ptr root_block = Cast<At_Root_Block>(node);
86
+ At_Root_Block* root_block = Cast<At_Root_Block>(node);
87
87
  std::cerr << ind << "At_Root_Block " << root_block;
88
88
  std::cerr << " (" << pstate_source_position(node) << ")";
89
89
  std::cerr << " " << root_block->tabs();
@@ -91,7 +91,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
91
91
  debug_ast(root_block->expression(), ind + ":", env);
92
92
  debug_ast(root_block->block(), ind + " ", env);
93
93
  } else if (Cast<Selector_List>(node)) {
94
- Selector_List_Ptr selector = Cast<Selector_List>(node);
94
+ Selector_List* selector = Cast<Selector_List>(node);
95
95
  std::cerr << ind << "Selector_List " << selector;
96
96
  std::cerr << " (" << pstate_source_position(node) << ")";
97
97
  std::cerr << " <" << selector->hash() << ">";
@@ -108,21 +108,30 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
108
108
  for(const Complex_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
109
109
 
110
110
  // } else if (Cast<Expression>(node)) {
111
- // Expression_Ptr expression = Cast<Expression>(node);
111
+ // Expression* expression = Cast<Expression>(node);
112
112
  // std::cerr << ind << "Expression " << expression << " " << expression->concrete_type() << std::endl;
113
113
 
114
+ } else if (Cast<Parent_Reference>(node)) {
115
+ Parent_Reference* selector = Cast<Parent_Reference>(node);
116
+ std::cerr << ind << "Parent_Reference " << selector;
117
+ // if (selector->not_selector()) cerr << " [in_declaration]";
118
+ std::cerr << " (" << pstate_source_position(node) << ")";
119
+ std::cerr << " <" << selector->hash() << ">";
120
+ std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
121
+ // debug_ast(selector->selector(), ind + "->", env);
122
+
114
123
  } else if (Cast<Parent_Selector>(node)) {
115
- Parent_Selector_Ptr selector = Cast<Parent_Selector>(node);
124
+ Parent_Selector* selector = Cast<Parent_Selector>(node);
116
125
  std::cerr << ind << "Parent_Selector " << selector;
117
126
  // if (selector->not_selector()) cerr << " [in_declaration]";
118
127
  std::cerr << " (" << pstate_source_position(node) << ")";
119
128
  std::cerr << " <" << selector->hash() << ">";
120
- std::cerr << " [" << (selector->is_real_parent_ref() ? "REAL" : "FAKE") << "]";
129
+ std::cerr << " [" << (selector->real() ? "REAL" : "FAKE") << "]";
121
130
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
122
131
  // debug_ast(selector->selector(), ind + "->", env);
123
132
 
124
133
  } else if (Cast<Complex_Selector>(node)) {
125
- Complex_Selector_Ptr selector = Cast<Complex_Selector>(node);
134
+ Complex_Selector* selector = Cast<Complex_Selector>(node);
126
135
  std::cerr << ind << "Complex_Selector " << selector
127
136
  << " (" << pstate_source_position(node) << ")"
128
137
  << " <" << selector->hash() << ">"
@@ -155,7 +164,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
155
164
  ComplexSelectorSet set = selector->sources();
156
165
  // debug_sources_set(set, ind + " @--> ");
157
166
  } else if (Cast<Compound_Selector>(node)) {
158
- Compound_Selector_Ptr selector = Cast<Compound_Selector>(node);
167
+ Compound_Selector* selector = Cast<Compound_Selector>(node);
159
168
  std::cerr << ind << "Compound_Selector " << selector;
160
169
  std::cerr << " (" << pstate_source_position(node) << ")";
161
170
  std::cerr << " <" << selector->hash() << ">";
@@ -169,7 +178,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
169
178
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
170
179
  for(const Simple_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
171
180
  } else if (Cast<Wrapped_Selector>(node)) {
172
- Wrapped_Selector_Ptr selector = Cast<Wrapped_Selector>(node);
181
+ Wrapped_Selector* selector = Cast<Wrapped_Selector>(node);
173
182
  std::cerr << ind << "Wrapped_Selector " << selector;
174
183
  std::cerr << " (" << pstate_source_position(node) << ")";
175
184
  std::cerr << " <" << selector->hash() << ">";
@@ -181,7 +190,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
181
190
  std::cerr << std::endl;
182
191
  debug_ast(selector->selector(), ind + " () ", env);
183
192
  } else if (Cast<Pseudo_Selector>(node)) {
184
- Pseudo_Selector_Ptr selector = Cast<Pseudo_Selector>(node);
193
+ Pseudo_Selector* selector = Cast<Pseudo_Selector>(node);
185
194
  std::cerr << ind << "Pseudo_Selector " << selector;
186
195
  std::cerr << " (" << pstate_source_position(node) << ")";
187
196
  std::cerr << " <" << selector->hash() << ">";
@@ -193,7 +202,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
193
202
  std::cerr << std::endl;
194
203
  debug_ast(selector->expression(), ind + " <= ", env);
195
204
  } else if (Cast<Attribute_Selector>(node)) {
196
- Attribute_Selector_Ptr selector = Cast<Attribute_Selector>(node);
205
+ Attribute_Selector* selector = Cast<Attribute_Selector>(node);
197
206
  std::cerr << ind << "Attribute_Selector " << selector;
198
207
  std::cerr << " (" << pstate_source_position(node) << ")";
199
208
  std::cerr << " <" << selector->hash() << ">";
@@ -205,7 +214,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
205
214
  std::cerr << std::endl;
206
215
  debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
207
216
  } else if (Cast<Class_Selector>(node)) {
208
- Class_Selector_Ptr selector = Cast<Class_Selector>(node);
217
+ Class_Selector* selector = Cast<Class_Selector>(node);
209
218
  std::cerr << ind << "Class_Selector " << selector;
210
219
  std::cerr << " (" << pstate_source_position(node) << ")";
211
220
  std::cerr << " <" << selector->hash() << ">";
@@ -216,7 +225,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
216
225
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
217
226
  std::cerr << std::endl;
218
227
  } else if (Cast<Id_Selector>(node)) {
219
- Id_Selector_Ptr selector = Cast<Id_Selector>(node);
228
+ Id_Selector* selector = Cast<Id_Selector>(node);
220
229
  std::cerr << ind << "Id_Selector " << selector;
221
230
  std::cerr << " (" << pstate_source_position(node) << ")";
222
231
  std::cerr << " <" << selector->hash() << ">";
@@ -226,9 +235,9 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
226
235
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
227
236
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
228
237
  std::cerr << std::endl;
229
- } else if (Cast<Element_Selector>(node)) {
230
- Element_Selector_Ptr selector = Cast<Element_Selector>(node);
231
- std::cerr << ind << "Element_Selector " << selector;
238
+ } else if (Cast<Type_Selector>(node)) {
239
+ Type_Selector* selector = Cast<Type_Selector>(node);
240
+ std::cerr << ind << "Type_Selector " << selector;
232
241
  std::cerr << " (" << pstate_source_position(node) << ")";
233
242
  std::cerr << " <" << selector->hash() << ">";
234
243
  std::cerr << " <<" << selector->ns_name() << ">>";
@@ -240,7 +249,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
240
249
  std::cerr << std::endl;
241
250
  } else if (Cast<Placeholder_Selector>(node)) {
242
251
 
243
- Placeholder_Selector_Ptr selector = Cast<Placeholder_Selector>(node);
252
+ Placeholder_Selector* selector = Cast<Placeholder_Selector>(node);
244
253
  std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector;
245
254
  std::cerr << " (" << pstate_source_position(selector) << ")"
246
255
  << " <" << selector->hash() << ">"
@@ -257,7 +266,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
257
266
  std::cerr << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << std::endl;
258
267
 
259
268
  } else if (Cast<Selector_Schema>(node)) {
260
- Selector_Schema_Ptr selector = Cast<Selector_Schema>(node);
269
+ Selector_Schema* selector = Cast<Selector_Schema>(node);
261
270
  std::cerr << ind << "Selector_Schema " << selector;
262
271
  std::cerr << " (" << pstate_source_position(node) << ")"
263
272
  << " [@media:" << selector->media_block() << "]"
@@ -268,7 +277,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
268
277
  // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
269
278
 
270
279
  } else if (Cast<Selector>(node)) {
271
- Selector_Ptr selector = Cast<Selector>(node);
280
+ Selector* selector = Cast<Selector>(node);
272
281
  std::cerr << ind << "Selector " << selector;
273
282
  std::cerr << " (" << pstate_source_position(node) << ")";
274
283
  std::cerr << (selector->has_line_break() ? " [line-break]": " -")
@@ -276,7 +285,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
276
285
  << std::endl;
277
286
 
278
287
  } else if (Cast<Media_Query_Expression>(node)) {
279
- Media_Query_Expression_Ptr block = Cast<Media_Query_Expression>(node);
288
+ Media_Query_Expression* block = Cast<Media_Query_Expression>(node);
280
289
  std::cerr << ind << "Media_Query_Expression " << block;
281
290
  std::cerr << " (" << pstate_source_position(node) << ")";
282
291
  std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
@@ -285,7 +294,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
285
294
  debug_ast(block->value(), ind + " value) ");
286
295
 
287
296
  } else if (Cast<Media_Query>(node)) {
288
- Media_Query_Ptr block = Cast<Media_Query>(node);
297
+ Media_Query* block = Cast<Media_Query>(node);
289
298
  std::cerr << ind << "Media_Query " << block;
290
299
  std::cerr << " (" << pstate_source_position(node) << ")";
291
300
  std::cerr << (block->is_negated() ? " [is_negated]": " -")
@@ -295,79 +304,79 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
295
304
  for(const auto& i : block->elements()) { debug_ast(i, ind + " ", env); }
296
305
 
297
306
  } else if (Cast<Media_Block>(node)) {
298
- Media_Block_Ptr block = Cast<Media_Block>(node);
307
+ Media_Block* block = Cast<Media_Block>(node);
299
308
  std::cerr << ind << "Media_Block " << block;
300
309
  std::cerr << " (" << pstate_source_position(node) << ")";
301
310
  std::cerr << " " << block->tabs() << std::endl;
302
311
  debug_ast(block->media_queries(), ind + " =@ ");
303
312
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
304
313
  } else if (Cast<Supports_Block>(node)) {
305
- Supports_Block_Ptr block = Cast<Supports_Block>(node);
314
+ Supports_Block* block = Cast<Supports_Block>(node);
306
315
  std::cerr << ind << "Supports_Block " << block;
307
316
  std::cerr << " (" << pstate_source_position(node) << ")";
308
317
  std::cerr << " " << block->tabs() << std::endl;
309
318
  debug_ast(block->condition(), ind + " =@ ");
310
319
  debug_ast(block->block(), ind + " <>");
311
320
  } else if (Cast<Supports_Operator>(node)) {
312
- Supports_Operator_Ptr block = Cast<Supports_Operator>(node);
321
+ Supports_Operator* block = Cast<Supports_Operator>(node);
313
322
  std::cerr << ind << "Supports_Operator " << block;
314
323
  std::cerr << " (" << pstate_source_position(node) << ")"
315
324
  << std::endl;
316
325
  debug_ast(block->left(), ind + " left) ");
317
326
  debug_ast(block->right(), ind + " right) ");
318
327
  } else if (Cast<Supports_Negation>(node)) {
319
- Supports_Negation_Ptr block = Cast<Supports_Negation>(node);
328
+ Supports_Negation* block = Cast<Supports_Negation>(node);
320
329
  std::cerr << ind << "Supports_Negation " << block;
321
330
  std::cerr << " (" << pstate_source_position(node) << ")"
322
331
  << std::endl;
323
332
  debug_ast(block->condition(), ind + " condition) ");
324
333
  } else if (Cast<At_Root_Query>(node)) {
325
- At_Root_Query_Ptr block = Cast<At_Root_Query>(node);
334
+ At_Root_Query* block = Cast<At_Root_Query>(node);
326
335
  std::cerr << ind << "At_Root_Query " << block;
327
336
  std::cerr << " (" << pstate_source_position(node) << ")"
328
337
  << std::endl;
329
338
  debug_ast(block->feature(), ind + " feature) ");
330
339
  debug_ast(block->value(), ind + " value) ");
331
340
  } else if (Cast<Supports_Declaration>(node)) {
332
- Supports_Declaration_Ptr block = Cast<Supports_Declaration>(node);
341
+ Supports_Declaration* block = Cast<Supports_Declaration>(node);
333
342
  std::cerr << ind << "Supports_Declaration " << block;
334
343
  std::cerr << " (" << pstate_source_position(node) << ")"
335
344
  << std::endl;
336
345
  debug_ast(block->feature(), ind + " feature) ");
337
346
  debug_ast(block->value(), ind + " value) ");
338
347
  } else if (Cast<Block>(node)) {
339
- Block_Ptr root_block = Cast<Block>(node);
348
+ Block* root_block = Cast<Block>(node);
340
349
  std::cerr << ind << "Block " << root_block;
341
350
  std::cerr << " (" << pstate_source_position(node) << ")";
342
351
  if (root_block->is_root()) std::cerr << " [root]";
343
352
  std::cerr << " " << root_block->tabs() << std::endl;
344
353
  for(const Statement_Obj& i : root_block->elements()) { debug_ast(i, ind + " ", env); }
345
354
  } else if (Cast<Warning>(node)) {
346
- Warning_Ptr block = Cast<Warning>(node);
355
+ Warning* block = Cast<Warning>(node);
347
356
  std::cerr << ind << "Warning " << block;
348
357
  std::cerr << " (" << pstate_source_position(node) << ")";
349
358
  std::cerr << " " << block->tabs() << std::endl;
350
359
  debug_ast(block->message(), ind + " : ");
351
360
  } else if (Cast<Error>(node)) {
352
- Error_Ptr block = Cast<Error>(node);
361
+ Error* block = Cast<Error>(node);
353
362
  std::cerr << ind << "Error " << block;
354
363
  std::cerr << " (" << pstate_source_position(node) << ")";
355
364
  std::cerr << " " << block->tabs() << std::endl;
356
365
  } else if (Cast<Debug>(node)) {
357
- Debug_Ptr block = Cast<Debug>(node);
366
+ Debug* block = Cast<Debug>(node);
358
367
  std::cerr << ind << "Debug " << block;
359
368
  std::cerr << " (" << pstate_source_position(node) << ")";
360
369
  std::cerr << " " << block->tabs() << std::endl;
361
370
  debug_ast(block->value(), ind + " ");
362
371
  } else if (Cast<Comment>(node)) {
363
- Comment_Ptr block = Cast<Comment>(node);
372
+ Comment* block = Cast<Comment>(node);
364
373
  std::cerr << ind << "Comment " << block;
365
374
  std::cerr << " (" << pstate_source_position(node) << ")";
366
375
  std::cerr << " " << block->tabs() <<
367
376
  " <" << prettyprint(block->pstate().token.ws_before()) << ">" << std::endl;
368
377
  debug_ast(block->text(), ind + "// ", env);
369
378
  } else if (Cast<If>(node)) {
370
- If_Ptr block = Cast<If>(node);
379
+ If* block = Cast<If>(node);
371
380
  std::cerr << ind << "If " << block;
372
381
  std::cerr << " (" << pstate_source_position(node) << ")";
373
382
  std::cerr << " " << block->tabs() << std::endl;
@@ -375,30 +384,30 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
375
384
  debug_ast(block->block(), ind + " <>");
376
385
  debug_ast(block->alternative(), ind + " ><");
377
386
  } else if (Cast<Return>(node)) {
378
- Return_Ptr block = Cast<Return>(node);
387
+ Return* block = Cast<Return>(node);
379
388
  std::cerr << ind << "Return " << block;
380
389
  std::cerr << " (" << pstate_source_position(node) << ")";
381
390
  std::cerr << " " << block->tabs() << std::endl;
382
391
  } else if (Cast<Extension>(node)) {
383
- Extension_Ptr block = Cast<Extension>(node);
392
+ Extension* block = Cast<Extension>(node);
384
393
  std::cerr << ind << "Extension " << block;
385
394
  std::cerr << " (" << pstate_source_position(node) << ")";
386
395
  std::cerr << " " << block->tabs() << std::endl;
387
396
  debug_ast(block->selector(), ind + "-> ", env);
388
397
  } else if (Cast<Content>(node)) {
389
- Content_Ptr block = Cast<Content>(node);
398
+ Content* block = Cast<Content>(node);
390
399
  std::cerr << ind << "Content " << block;
391
400
  std::cerr << " (" << pstate_source_position(node) << ")";
392
- std::cerr << " [@media:" << block->media_block() << "]";
393
401
  std::cerr << " " << block->tabs() << std::endl;
402
+ debug_ast(block->arguments(), ind + " args: ", env);
394
403
  } else if (Cast<Import_Stub>(node)) {
395
- Import_Stub_Ptr block = Cast<Import_Stub>(node);
404
+ Import_Stub* block = Cast<Import_Stub>(node);
396
405
  std::cerr << ind << "Import_Stub " << block;
397
406
  std::cerr << " (" << pstate_source_position(node) << ")";
398
407
  std::cerr << " [" << block->imp_path() << "] ";
399
408
  std::cerr << " " << block->tabs() << std::endl;
400
409
  } else if (Cast<Import>(node)) {
401
- Import_Ptr block = Cast<Import>(node);
410
+ Import* block = Cast<Import>(node);
402
411
  std::cerr << ind << "Import " << block;
403
412
  std::cerr << " (" << pstate_source_position(node) << ")";
404
413
  std::cerr << " " << block->tabs() << std::endl;
@@ -406,13 +415,13 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
406
415
  for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
407
416
  debug_ast(block->import_queries(), ind + "@@ ");
408
417
  } else if (Cast<Assignment>(node)) {
409
- Assignment_Ptr block = Cast<Assignment>(node);
418
+ Assignment* block = Cast<Assignment>(node);
410
419
  std::cerr << ind << "Assignment " << block;
411
420
  std::cerr << " (" << pstate_source_position(node) << ")";
412
421
  std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
413
422
  debug_ast(block->value(), ind + "=", env);
414
423
  } else if (Cast<Declaration>(node)) {
415
- Declaration_Ptr block = Cast<Declaration>(node);
424
+ Declaration* block = Cast<Declaration>(node);
416
425
  std::cerr << ind << "Declaration " << block;
417
426
  std::cerr << " (" << pstate_source_position(node) << ")";
418
427
  std::cerr << " [is_custom_property: " << block->is_custom_property() << "] ";
@@ -421,14 +430,14 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
421
430
  debug_ast(block->value(), ind + " value: ", env);
422
431
  debug_ast(block->block(), ind + " ", env);
423
432
  } else if (Cast<Keyframe_Rule>(node)) {
424
- Keyframe_Rule_Ptr has_block = Cast<Keyframe_Rule>(node);
433
+ Keyframe_Rule* has_block = Cast<Keyframe_Rule>(node);
425
434
  std::cerr << ind << "Keyframe_Rule " << has_block;
426
435
  std::cerr << " (" << pstate_source_position(node) << ")";
427
436
  std::cerr << " " << has_block->tabs() << std::endl;
428
437
  if (has_block->name()) debug_ast(has_block->name(), ind + "@");
429
438
  if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
430
439
  } else if (Cast<Directive>(node)) {
431
- Directive_Ptr block = Cast<Directive>(node);
440
+ Directive* block = Cast<Directive>(node);
432
441
  std::cerr << ind << "Directive " << block;
433
442
  std::cerr << " (" << pstate_source_position(node) << ")";
434
443
  std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
@@ -436,25 +445,25 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
436
445
  debug_ast(block->value(), ind + "+", env);
437
446
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
438
447
  } else if (Cast<Each>(node)) {
439
- Each_Ptr block = Cast<Each>(node);
448
+ Each* block = Cast<Each>(node);
440
449
  std::cerr << ind << "Each " << block;
441
450
  std::cerr << " (" << pstate_source_position(node) << ")";
442
451
  std::cerr << " " << block->tabs() << std::endl;
443
452
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
444
453
  } else if (Cast<For>(node)) {
445
- For_Ptr block = Cast<For>(node);
454
+ For* block = Cast<For>(node);
446
455
  std::cerr << ind << "For " << block;
447
456
  std::cerr << " (" << pstate_source_position(node) << ")";
448
457
  std::cerr << " " << block->tabs() << std::endl;
449
458
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
450
459
  } else if (Cast<While>(node)) {
451
- While_Ptr block = Cast<While>(node);
460
+ While* block = Cast<While>(node);
452
461
  std::cerr << ind << "While " << block;
453
462
  std::cerr << " (" << pstate_source_position(node) << ")";
454
463
  std::cerr << " " << block->tabs() << std::endl;
455
464
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
456
465
  } else if (Cast<Definition>(node)) {
457
- Definition_Ptr block = Cast<Definition>(node);
466
+ Definition* block = Cast<Definition>(node);
458
467
  std::cerr << ind << "Definition " << block;
459
468
  std::cerr << " (" << pstate_source_position(node) << ")";
460
469
  std::cerr << " [name: " << block->name() << "] ";
@@ -466,14 +475,15 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
466
475
  debug_ast(block->parameters(), ind + " params: ", env);
467
476
  if (block->block()) debug_ast(block->block(), ind + " ", env);
468
477
  } else if (Cast<Mixin_Call>(node)) {
469
- Mixin_Call_Ptr block = Cast<Mixin_Call>(node);
478
+ Mixin_Call* block = Cast<Mixin_Call>(node);
470
479
  std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
471
480
  std::cerr << " (" << pstate_source_position(block) << ")";
472
481
  std::cerr << " [" << block->name() << "]";
473
482
  std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
474
- debug_ast(block->arguments(), ind + " args: ");
483
+ debug_ast(block->arguments(), ind + " args: ", env);
484
+ debug_ast(block->block_parameters(), ind + " block_params: ", env);
475
485
  if (block->block()) debug_ast(block->block(), ind + " ", env);
476
- } else if (Ruleset_Ptr ruleset = Cast<Ruleset>(node)) {
486
+ } else if (Ruleset* ruleset = Cast<Ruleset>(node)) {
477
487
  std::cerr << ind << "Ruleset " << ruleset;
478
488
  std::cerr << " (" << pstate_source_position(node) << ")";
479
489
  std::cerr << " [indent: " << ruleset->tabs() << "]";
@@ -483,30 +493,22 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
483
493
  debug_ast(ruleset->selector(), ind + ">");
484
494
  debug_ast(ruleset->block(), ind + " ");
485
495
  } else if (Cast<Block>(node)) {
486
- Block_Ptr block = Cast<Block>(node);
496
+ Block* block = Cast<Block>(node);
487
497
  std::cerr << ind << "Block " << block;
488
498
  std::cerr << " (" << pstate_source_position(node) << ")";
489
499
  std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
490
500
  std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
491
501
  for(const Statement_Obj& i : block->elements()) { debug_ast(i, ind + " ", env); }
492
502
  } else if (Cast<Variable>(node)) {
493
- Variable_Ptr expression = Cast<Variable>(node);
503
+ Variable* expression = Cast<Variable>(node);
494
504
  std::cerr << ind << "Variable " << expression;
495
505
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
496
506
  std::cerr << " (" << pstate_source_position(node) << ")";
497
507
  std::cerr << " [" << expression->name() << "]" << std::endl;
498
508
  std::string name(expression->name());
499
509
  if (env && env->has(name)) debug_ast(Cast<Expression>((*env)[name]), ind + " -> ", env);
500
- } else if (Cast<Function_Call_Schema>(node)) {
501
- Function_Call_Schema_Ptr expression = Cast<Function_Call_Schema>(node);
502
- std::cerr << ind << "Function_Call_Schema " << expression;
503
- std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
504
- std::cerr << " (" << pstate_source_position(node) << ")";
505
- std::cerr << "" << std::endl;
506
- debug_ast(expression->name(), ind + "name: ", env);
507
- debug_ast(expression->arguments(), ind + " args: ", env);
508
510
  } else if (Cast<Function_Call>(node)) {
509
- Function_Call_Ptr expression = Cast<Function_Call>(node);
511
+ Function_Call* expression = Cast<Function_Call>(node);
510
512
  std::cerr << ind << "Function_Call " << expression;
511
513
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
512
514
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -518,14 +520,14 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
518
520
  debug_ast(expression->arguments(), ind + " args: ", env);
519
521
  debug_ast(expression->func(), ind + " func: ", env);
520
522
  } else if (Cast<Function>(node)) {
521
- Function_Ptr expression = Cast<Function>(node);
523
+ Function* expression = Cast<Function>(node);
522
524
  std::cerr << ind << "Function " << expression;
523
525
  std::cerr << " (" << pstate_source_position(node) << ")";
524
526
  if (expression->is_css()) std::cerr << " [css]";
525
527
  std::cerr << std::endl;
526
528
  debug_ast(expression->definition(), ind + " definition: ", env);
527
529
  } else if (Cast<Arguments>(node)) {
528
- Arguments_Ptr expression = Cast<Arguments>(node);
530
+ Arguments* expression = Cast<Arguments>(node);
529
531
  std::cerr << ind << "Arguments " << expression;
530
532
  if (expression->is_delayed()) std::cerr << " [delayed]";
531
533
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -535,7 +537,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
535
537
  std::cerr << std::endl;
536
538
  for(const Argument_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
537
539
  } else if (Cast<Argument>(node)) {
538
- Argument_Ptr expression = Cast<Argument>(node);
540
+ Argument* expression = Cast<Argument>(node);
539
541
  std::cerr << ind << "Argument " << expression;
540
542
  std::cerr << " (" << pstate_source_position(node) << ")";
541
543
  std::cerr << " [" << expression->value().ptr() << "]";
@@ -544,7 +546,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
544
546
  std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
545
547
  debug_ast(expression->value(), ind + " value: ", env);
546
548
  } else if (Cast<Parameters>(node)) {
547
- Parameters_Ptr expression = Cast<Parameters>(node);
549
+ Parameters* expression = Cast<Parameters>(node);
548
550
  std::cerr << ind << "Parameters " << expression;
549
551
  std::cerr << " (" << pstate_source_position(node) << ")";
550
552
  std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
@@ -552,14 +554,14 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
552
554
  std::cerr << std::endl;
553
555
  for(const Parameter_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
554
556
  } else if (Cast<Parameter>(node)) {
555
- Parameter_Ptr expression = Cast<Parameter>(node);
557
+ Parameter* expression = Cast<Parameter>(node);
556
558
  std::cerr << ind << "Parameter " << expression;
557
559
  std::cerr << " (" << pstate_source_position(node) << ")";
558
560
  std::cerr << " [name: " << expression->name() << "] ";
559
561
  std::cerr << " [default: " << expression->default_value().ptr() << "] ";
560
562
  std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
561
563
  } else if (Cast<Unary_Expression>(node)) {
562
- Unary_Expression_Ptr expression = Cast<Unary_Expression>(node);
564
+ Unary_Expression* expression = Cast<Unary_Expression>(node);
563
565
  std::cerr << ind << "Unary_Expression " << expression;
564
566
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
565
567
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
@@ -567,7 +569,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
567
569
  std::cerr << " [" << expression->type() << "]" << std::endl;
568
570
  debug_ast(expression->operand(), ind + " operand: ", env);
569
571
  } else if (Cast<Binary_Expression>(node)) {
570
- Binary_Expression_Ptr expression = Cast<Binary_Expression>(node);
572
+ Binary_Expression* expression = Cast<Binary_Expression>(node);
571
573
  std::cerr << ind << "Binary_Expression " << expression;
572
574
  if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
573
575
  if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
@@ -580,7 +582,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
580
582
  debug_ast(expression->left(), ind + " left: ", env);
581
583
  debug_ast(expression->right(), ind + " right: ", env);
582
584
  } else if (Cast<Map>(node)) {
583
- Map_Ptr expression = Cast<Map>(node);
585
+ Map* expression = Cast<Map>(node);
584
586
  std::cerr << ind << "Map " << expression;
585
587
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
586
588
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -590,7 +592,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
590
592
  debug_ast(i.second, ind + " val: ");
591
593
  }
592
594
  } else if (Cast<List>(node)) {
593
- List_Ptr expression = Cast<List>(node);
595
+ List* expression = Cast<List>(node);
594
596
  std::cerr << ind << "List " << expression;
595
597
  std::cerr << " (" << pstate_source_position(node) << ")";
596
598
  std::cerr << " (" << expression->length() << ") " <<
@@ -604,42 +606,46 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
604
606
  " [hash: " << expression->hash() << "] " <<
605
607
  std::endl;
606
608
  for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
607
- } else if (Cast<Content>(node)) {
608
- Content_Ptr expression = Cast<Content>(node);
609
- std::cerr << ind << "Content " << expression;
610
- std::cerr << " (" << pstate_source_position(node) << ")";
611
- std::cerr << " [@media:" << expression->media_block() << "]";
612
- std::cerr << " [Statement]" << std::endl;
613
609
  } else if (Cast<Boolean>(node)) {
614
- Boolean_Ptr expression = Cast<Boolean>(node);
610
+ Boolean* expression = Cast<Boolean>(node);
615
611
  std::cerr << ind << "Boolean " << expression;
616
612
  std::cerr << " (" << pstate_source_position(node) << ")";
617
613
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
618
614
  std::cerr << " [" << expression->value() << "]" << std::endl;
619
- } else if (Cast<Color>(node)) {
620
- Color_Ptr expression = Cast<Color>(node);
615
+ } else if (Cast<Color_RGBA>(node)) {
616
+ Color_RGBA* expression = Cast<Color_RGBA>(node);
617
+ std::cerr << ind << "Color " << expression;
618
+ std::cerr << " (" << pstate_source_position(node) << ")";
619
+ std::cerr << " [name: " << expression->disp() << "] ";
620
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
621
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
622
+ std::cerr << " rgba[" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
623
+ } else if (Cast<Color_HSLA>(node)) {
624
+ Color_HSLA* expression = Cast<Color_HSLA>(node);
621
625
  std::cerr << ind << "Color " << expression;
622
626
  std::cerr << " (" << pstate_source_position(node) << ")";
627
+ std::cerr << " [name: " << expression->disp() << "] ";
623
628
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
624
629
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
625
- std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
630
+ std::cerr << " hsla[" << expression->h() << ":" << expression->s() << ":" << expression->l() << "@" << expression->a() << "]" << std::endl;
626
631
  } else if (Cast<Number>(node)) {
627
- Number_Ptr expression = Cast<Number>(node);
632
+ Number* expression = Cast<Number>(node);
628
633
  std::cerr << ind << "Number " << expression;
629
634
  std::cerr << " (" << pstate_source_position(node) << ")";
635
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
630
636
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
631
637
  std::cerr << " [" << expression->value() << expression->unit() << "]" <<
632
638
  " [hash: " << expression->hash() << "] " <<
633
639
  std::endl;
634
640
  } else if (Cast<Null>(node)) {
635
- Null_Ptr expression = Cast<Null>(node);
641
+ Null* expression = Cast<Null>(node);
636
642
  std::cerr << ind << "Null " << expression;
637
643
  std::cerr << " (" << pstate_source_position(node) << ")";
638
644
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] "
639
645
  // " [hash: " << expression->hash() << "] "
640
646
  << std::endl;
641
647
  } else if (Cast<String_Quoted>(node)) {
642
- String_Quoted_Ptr expression = Cast<String_Quoted>(node);
648
+ String_Quoted* expression = Cast<String_Quoted>(node);
643
649
  std::cerr << ind << "String_Quoted " << expression;
644
650
  std::cerr << " (" << pstate_source_position(node) << ")";
645
651
  std::cerr << " [" << prettyprint(expression->value()) << "]";
@@ -648,7 +654,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
648
654
  if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
649
655
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
650
656
  } else if (Cast<String_Constant>(node)) {
651
- String_Constant_Ptr expression = Cast<String_Constant>(node);
657
+ String_Constant* expression = Cast<String_Constant>(node);
652
658
  std::cerr << ind << "String_Constant " << expression;
653
659
  if (expression->concrete_type()) {
654
660
  std::cerr << " " << expression->concrete_type();
@@ -659,7 +665,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
659
665
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
660
666
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
661
667
  } else if (Cast<String_Schema>(node)) {
662
- String_Schema_Ptr expression = Cast<String_Schema>(node);
668
+ String_Schema* expression = Cast<String_Schema>(node);
663
669
  std::cerr << ind << "String_Schema " << expression;
664
670
  std::cerr << " (" << pstate_source_position(expression) << ")";
665
671
  std::cerr << " " << expression->concrete_type();
@@ -673,42 +679,43 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
673
679
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
674
680
  for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
675
681
  } else if (Cast<String>(node)) {
676
- String_Ptr expression = Cast<String>(node);
682
+ String* expression = Cast<String>(node);
677
683
  std::cerr << ind << "String " << expression;
678
684
  std::cerr << " " << expression->concrete_type();
679
685
  std::cerr << " (" << pstate_source_position(node) << ")";
680
686
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
681
687
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
682
688
  } else if (Cast<Expression>(node)) {
683
- Expression_Ptr expression = Cast<Expression>(node);
689
+ Expression* expression = Cast<Expression>(node);
684
690
  std::cerr << ind << "Expression " << expression;
685
691
  std::cerr << " (" << pstate_source_position(node) << ")";
686
692
  switch (expression->concrete_type()) {
687
- case Expression::Concrete_Type::NONE: std::cerr << " [NONE]"; break;
688
- case Expression::Concrete_Type::BOOLEAN: std::cerr << " [BOOLEAN]"; break;
689
- case Expression::Concrete_Type::NUMBER: std::cerr << " [NUMBER]"; break;
690
- case Expression::Concrete_Type::COLOR: std::cerr << " [COLOR]"; break;
691
- case Expression::Concrete_Type::STRING: std::cerr << " [STRING]"; break;
692
- case Expression::Concrete_Type::LIST: std::cerr << " [LIST]"; break;
693
- case Expression::Concrete_Type::MAP: std::cerr << " [MAP]"; break;
694
- case Expression::Concrete_Type::SELECTOR: std::cerr << " [SELECTOR]"; break;
695
- case Expression::Concrete_Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
696
- case Expression::Concrete_Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
697
- case Expression::Concrete_Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
698
- case Expression::Concrete_Type::FUNCTION: std::cerr << " [FUNCTION]"; break;
699
- case Expression::Concrete_Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
700
- case Expression::Concrete_Type::VARIABLE: std::cerr << " [VARIABLE]"; break;
701
- case Expression::Concrete_Type::FUNCTION_VAL: std::cerr << " [FUNCTION_VAL]"; break;
693
+ case Expression::Type::NONE: std::cerr << " [NONE]"; break;
694
+ case Expression::Type::BOOLEAN: std::cerr << " [BOOLEAN]"; break;
695
+ case Expression::Type::NUMBER: std::cerr << " [NUMBER]"; break;
696
+ case Expression::Type::COLOR: std::cerr << " [COLOR]"; break;
697
+ case Expression::Type::STRING: std::cerr << " [STRING]"; break;
698
+ case Expression::Type::LIST: std::cerr << " [LIST]"; break;
699
+ case Expression::Type::MAP: std::cerr << " [MAP]"; break;
700
+ case Expression::Type::SELECTOR: std::cerr << " [SELECTOR]"; break;
701
+ case Expression::Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
702
+ case Expression::Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
703
+ case Expression::Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
704
+ case Expression::Type::FUNCTION: std::cerr << " [FUNCTION]"; break;
705
+ case Expression::Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
706
+ case Expression::Type::VARIABLE: std::cerr << " [VARIABLE]"; break;
707
+ case Expression::Type::FUNCTION_VAL: std::cerr << " [FUNCTION_VAL]"; break;
708
+ case Expression::Type::PARENT: std::cerr << " [PARENT]"; break;
702
709
  }
703
710
  std::cerr << std::endl;
704
711
  } else if (Cast<Has_Block>(node)) {
705
- Has_Block_Ptr has_block = Cast<Has_Block>(node);
712
+ Has_Block* has_block = Cast<Has_Block>(node);
706
713
  std::cerr << ind << "Has_Block " << has_block;
707
714
  std::cerr << " (" << pstate_source_position(node) << ")";
708
715
  std::cerr << " " << has_block->tabs() << std::endl;
709
716
  if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
710
717
  } else if (Cast<Statement>(node)) {
711
- Statement_Ptr statement = Cast<Statement>(node);
718
+ Statement* statement = Cast<Statement>(node);
712
719
  std::cerr << ind << "Statement " << statement;
713
720
  std::cerr << " (" << pstate_source_position(node) << ")";
714
721
  std::cerr << " " << statement->tabs() << std::endl;
@@ -767,9 +774,9 @@ inline void debug_node(Node* node, std::string ind = "")
767
774
  }
768
775
 
769
776
  /*
770
- inline void debug_ast(const AST_Node_Ptr node, std::string ind = "", Env* env = 0)
777
+ inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0)
771
778
  {
772
- debug_ast(const_cast<AST_Node_Ptr>(node), ind, env);
779
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
773
780
  }
774
781
  */
775
782
  inline void debug_node(const Node* node, std::string ind = "")