sassc 1.11.1 → 1.11.2

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/README.md +3 -2
  4. data/ext/libsass/Makefile.conf +2 -1
  5. data/ext/libsass/appveyor.yml +10 -5
  6. data/ext/libsass/docs/dev-ast-memory.md +223 -0
  7. data/ext/libsass/include/sass/base.h +2 -0
  8. data/ext/libsass/script/bootstrap +7 -4
  9. data/ext/libsass/script/ci-build-libsass +3 -3
  10. data/ext/libsass/script/ci-install-compiler +2 -0
  11. data/ext/libsass/script/ci-report-coverage +2 -1
  12. data/ext/libsass/script/test-leaks.pl +103 -0
  13. data/ext/libsass/src/ast.cpp +621 -495
  14. data/ext/libsass/src/ast.hpp +801 -367
  15. data/ext/libsass/src/ast_def_macros.hpp +5 -5
  16. data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
  17. data/ext/libsass/src/bind.cpp +54 -51
  18. data/ext/libsass/src/bind.hpp +3 -7
  19. data/ext/libsass/src/check_nesting.cpp +117 -120
  20. data/ext/libsass/src/check_nesting.hpp +38 -34
  21. data/ext/libsass/src/color_maps.cpp +3 -3
  22. data/ext/libsass/src/color_maps.hpp +3 -3
  23. data/ext/libsass/src/context.cpp +33 -34
  24. data/ext/libsass/src/context.hpp +12 -14
  25. data/ext/libsass/src/cssize.cpp +200 -228
  26. data/ext/libsass/src/cssize.hpp +49 -49
  27. data/ext/libsass/src/debugger.hpp +260 -241
  28. data/ext/libsass/src/emitter.cpp +6 -6
  29. data/ext/libsass/src/emitter.hpp +7 -7
  30. data/ext/libsass/src/environment.cpp +2 -2
  31. data/ext/libsass/src/environment.hpp +0 -2
  32. data/ext/libsass/src/error_handling.cpp +5 -5
  33. data/ext/libsass/src/error_handling.hpp +12 -12
  34. data/ext/libsass/src/eval.cpp +412 -401
  35. data/ext/libsass/src/eval.hpp +61 -62
  36. data/ext/libsass/src/expand.cpp +223 -204
  37. data/ext/libsass/src/expand.hpp +42 -42
  38. data/ext/libsass/src/extend.cpp +198 -201
  39. data/ext/libsass/src/extend.hpp +12 -14
  40. data/ext/libsass/src/file.hpp +4 -5
  41. data/ext/libsass/src/functions.cpp +413 -418
  42. data/ext/libsass/src/functions.hpp +7 -10
  43. data/ext/libsass/src/inspect.cpp +115 -109
  44. data/ext/libsass/src/inspect.hpp +69 -69
  45. data/ext/libsass/src/listize.cpp +31 -33
  46. data/ext/libsass/src/listize.hpp +8 -10
  47. data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
  48. data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
  49. data/ext/libsass/src/node.cpp +45 -43
  50. data/ext/libsass/src/node.hpp +15 -15
  51. data/ext/libsass/src/operation.hpp +136 -136
  52. data/ext/libsass/src/output.cpp +48 -49
  53. data/ext/libsass/src/output.hpp +14 -14
  54. data/ext/libsass/src/parser.cpp +530 -554
  55. data/ext/libsass/src/parser.hpp +91 -96
  56. data/ext/libsass/src/prelexer.cpp +13 -10
  57. data/ext/libsass/src/remove_placeholders.cpp +25 -21
  58. data/ext/libsass/src/remove_placeholders.hpp +7 -7
  59. data/ext/libsass/src/sass2scss.cpp +2 -1
  60. data/ext/libsass/src/sass_context.cpp +125 -107
  61. data/ext/libsass/src/sass_context.hpp +1 -1
  62. data/ext/libsass/src/sass_util.hpp +5 -5
  63. data/ext/libsass/src/sass_values.cpp +27 -27
  64. data/ext/libsass/src/source_map.cpp +2 -2
  65. data/ext/libsass/src/source_map.hpp +2 -2
  66. data/ext/libsass/src/subset_map.cpp +57 -0
  67. data/ext/libsass/src/subset_map.hpp +8 -76
  68. data/ext/libsass/src/to_c.cpp +13 -13
  69. data/ext/libsass/src/to_c.hpp +14 -14
  70. data/ext/libsass/src/to_value.cpp +20 -20
  71. data/ext/libsass/src/to_value.hpp +20 -21
  72. data/ext/libsass/src/util.cpp +55 -88
  73. data/ext/libsass/src/util.hpp +9 -13
  74. data/ext/libsass/src/values.cpp +27 -26
  75. data/ext/libsass/src/values.hpp +2 -2
  76. data/ext/libsass/test/test_subset_map.cpp +69 -69
  77. data/ext/libsass/win/libsass.targets +3 -2
  78. data/ext/libsass/win/libsass.vcxproj.filters +9 -6
  79. data/lib/sassc/version.rb +1 -1
  80. data/sassc.gemspec +0 -1
  81. data/test/native_test.rb +1 -1
  82. metadata +7 -5
  83. data/ext/libsass/src/ast_factory.hpp +0 -92
  84. data/ext/libsass/src/memory_manager.cpp +0 -77
  85. data/ext/libsass/src/memory_manager.hpp +0 -48
@@ -8,69 +8,69 @@
8
8
 
9
9
  namespace Sass {
10
10
 
11
- typedef Environment<AST_Node*> Env;
11
+ typedef Environment<AST_Node_Obj> Env;
12
12
  struct Backtrace;
13
13
 
14
- class Cssize : public Operation_CRTP<Statement*, Cssize> {
14
+ class Cssize : public Operation_CRTP<Statement_Ptr, Cssize> {
15
15
 
16
16
  Context& ctx;
17
- std::vector<Block*> block_stack;
18
- std::vector<Statement*> p_stack;
17
+ std::vector<Block_Ptr> block_stack;
18
+ std::vector<Statement_Ptr> p_stack;
19
19
  Backtrace* backtrace;
20
20
 
21
- Statement* fallback_impl(AST_Node* n);
21
+ Statement_Ptr fallback_impl(AST_Node_Ptr n);
22
22
 
23
23
  public:
24
24
  Cssize(Context&, Backtrace*);
25
25
  ~Cssize() { }
26
26
 
27
- CommaSequence_Selector* selector();
28
-
29
- Statement* operator()(Block*);
30
- Statement* operator()(Ruleset*);
31
- // Statement* operator()(Bubble*);
32
- Statement* operator()(Media_Block*);
33
- Statement* operator()(Supports_Block*);
34
- Statement* operator()(At_Root_Block*);
35
- Statement* operator()(Directive*);
36
- Statement* operator()(Keyframe_Rule*);
37
- Statement* operator()(Trace*);
38
- Statement* operator()(Declaration*);
39
- // Statement* operator()(Assignment*);
40
- // Statement* operator()(Import*);
41
- // Statement* operator()(Import_Stub*);
42
- // Statement* operator()(Warning*);
43
- // Statement* operator()(Error*);
44
- // Statement* operator()(Comment*);
45
- // Statement* operator()(If*);
46
- // Statement* operator()(For*);
47
- // Statement* operator()(Each*);
48
- // Statement* operator()(While*);
49
- // Statement* operator()(Return*);
50
- // Statement* operator()(Extension*);
51
- // Statement* operator()(Definition*);
52
- // Statement* operator()(Mixin_Call*);
53
- // Statement* operator()(Content*);
54
- Statement* operator()(Null*);
55
-
56
- Statement* parent();
57
- std::vector<std::pair<bool, Block*>> slice_by_bubble(Statement*);
58
- Statement* bubble(Directive*);
59
- Statement* bubble(At_Root_Block*);
60
- Statement* bubble(Media_Block*);
61
- Statement* bubble(Supports_Block*);
62
- Statement* shallow_copy(Statement*);
63
- Statement* debubble(Block* children, Statement* parent = 0);
64
- Statement* flatten(Statement*);
65
- bool bubblable(Statement*);
66
-
67
- List* merge_media_queries(Media_Block*, Media_Block*);
68
- Media_Query* merge_media_query(Media_Query*, Media_Query*);
27
+ Selector_List_Ptr selector();
28
+
29
+ Block_Ptr operator()(Block_Ptr);
30
+ Statement_Ptr operator()(Ruleset_Ptr);
31
+ // Statement_Ptr operator()(Bubble_Ptr);
32
+ Statement_Ptr operator()(Media_Block_Ptr);
33
+ Statement_Ptr operator()(Supports_Block_Ptr);
34
+ Statement_Ptr operator()(At_Root_Block_Ptr);
35
+ Statement_Ptr operator()(Directive_Ptr);
36
+ Statement_Ptr operator()(Keyframe_Rule_Ptr);
37
+ Statement_Ptr operator()(Trace_Ptr);
38
+ Statement_Ptr operator()(Declaration_Ptr);
39
+ // Statement_Ptr operator()(Assignment_Ptr);
40
+ // Statement_Ptr operator()(Import_Ptr);
41
+ // Statement_Ptr operator()(Import_Stub_Ptr);
42
+ // Statement_Ptr operator()(Warning_Ptr);
43
+ // Statement_Ptr operator()(Error_Ptr);
44
+ // Statement_Ptr operator()(Comment_Ptr);
45
+ // Statement_Ptr operator()(If_Ptr);
46
+ // Statement_Ptr operator()(For_Ptr);
47
+ // Statement_Ptr operator()(Each_Ptr);
48
+ // Statement_Ptr operator()(While_Ptr);
49
+ // Statement_Ptr operator()(Return_Ptr);
50
+ // Statement_Ptr operator()(Extension_Ptr);
51
+ // Statement_Ptr operator()(Definition_Ptr);
52
+ // Statement_Ptr operator()(Mixin_Call_Ptr);
53
+ // Statement_Ptr operator()(Content_Ptr);
54
+ Statement_Ptr operator()(Null_Ptr);
55
+
56
+ Statement_Ptr parent();
57
+ std::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block_Ptr);
58
+ Statement_Ptr bubble(Directive_Ptr);
59
+ Statement_Ptr bubble(At_Root_Block_Ptr);
60
+ Statement_Ptr bubble(Media_Block_Ptr);
61
+ Statement_Ptr bubble(Supports_Block_Ptr);
62
+
63
+ Block_Ptr debubble(Block_Ptr children, Statement_Ptr parent = 0);
64
+ Block_Ptr flatten(Block_Ptr);
65
+ bool bubblable(Statement_Ptr);
66
+
67
+ List_Ptr merge_media_queries(Media_Block_Ptr, Media_Block_Ptr);
68
+ Media_Query_Ptr merge_media_query(Media_Query_Ptr, Media_Query_Ptr);
69
69
 
70
70
  template <typename U>
71
- Statement* fallback(U x) { return fallback_impl(x); }
71
+ Statement_Ptr fallback(U x) { return fallback_impl(x); }
72
72
 
73
- void append_block(Block*);
73
+ void append_block(Block_Ptr, Block_Ptr);
74
74
  };
75
75
 
76
76
  }
@@ -8,13 +8,13 @@
8
8
 
9
9
  using namespace Sass;
10
10
 
11
- inline void debug_ast(AST_Node* node, std::string ind = "", Env* env = 0);
11
+ inline void debug_ast(AST_Node_Ptr node, std::string ind = "", Env* env = 0);
12
12
 
13
13
  inline void debug_sources_set(SourcesSet& set, std::string ind = "")
14
14
  {
15
15
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
16
16
  for(auto const &pair : set) {
17
- debug_ast(pair, ind + "");
17
+ debug_ast(&pair, ind + "");
18
18
  // debug_ast(set[pair], ind + "first: ");
19
19
  }
20
20
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
@@ -44,7 +44,7 @@ inline std::string longToHex(long long t) {
44
44
  return is.str();
45
45
  }
46
46
 
47
- inline std::string pstate_source_position(AST_Node* node)
47
+ inline std::string pstate_source_position(AST_Node_Ptr node)
48
48
  {
49
49
  std::stringstream str;
50
50
  Position start(node->pstate());
@@ -52,38 +52,43 @@ inline std::string pstate_source_position(AST_Node* node)
52
52
  str << (start.file == std::string::npos ? -1 : start.file)
53
53
  << "@[" << start.line << ":" << start.column << "]"
54
54
  << "-[" << end.line << ":" << end.column << "]";
55
+ #ifdef DEBUG_SHARED_PTR
56
+ str << "x" << node->getRefCount() << ""
57
+ << " " << node->getDbgFile()
58
+ << "@" << node->getDbgLine();
59
+ #endif
55
60
  return str.str();
56
61
  }
57
62
 
58
- inline void debug_ast(AST_Node* node, std::string ind, Env* env)
63
+ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
59
64
  {
60
65
  if (node == 0) return;
61
66
  if (ind == "") std::cerr << "####################################################################\n";
62
- if (dynamic_cast<Bubble*>(node)) {
63
- Bubble* bubble = dynamic_cast<Bubble*>(node);
67
+ if (dynamic_cast<Bubble_Ptr>(node)) {
68
+ Bubble_Ptr bubble = dynamic_cast<Bubble_Ptr>(node);
64
69
  std::cerr << ind << "Bubble " << bubble;
65
70
  std::cerr << " (" << pstate_source_position(node) << ")";
66
71
  std::cerr << " " << bubble->tabs();
67
72
  std::cerr << std::endl;
68
- debug_ast(bubble->node(), ind + " ", env);
69
- } else if (dynamic_cast<Trace*>(node)) {
70
- Trace* trace = dynamic_cast<Trace*>(node);
73
+ debug_ast(&bubble->node(), ind + " ", env);
74
+ } else if (dynamic_cast<Trace_Ptr>(node)) {
75
+ Trace_Ptr trace = dynamic_cast<Trace_Ptr>(node);
71
76
  std::cerr << ind << "Trace " << trace;
72
77
  std::cerr << " (" << pstate_source_position(node) << ")"
73
78
  << " [name:" << trace->name() << "]"
74
79
  << std::endl;
75
- debug_ast(trace->block(), ind + " ", env);
76
- } else if (dynamic_cast<At_Root_Block*>(node)) {
77
- At_Root_Block* root_block = dynamic_cast<At_Root_Block*>(node);
80
+ debug_ast(&trace->block(), ind + " ", env);
81
+ } else if (dynamic_cast<At_Root_Block_Ptr>(node)) {
82
+ At_Root_Block_Ptr root_block = dynamic_cast<At_Root_Block_Ptr>(node);
78
83
  std::cerr << ind << "At_Root_Block " << root_block;
79
84
  std::cerr << " (" << pstate_source_position(node) << ")";
80
85
  std::cerr << " " << root_block->tabs();
81
86
  std::cerr << std::endl;
82
- debug_ast(root_block->expression(), ind + ":", env);
83
- debug_ast(root_block->block(), ind + " ", env);
84
- } else if (dynamic_cast<CommaSequence_Selector*>(node)) {
85
- CommaSequence_Selector* selector = dynamic_cast<CommaSequence_Selector*>(node);
86
- std::cerr << ind << "CommaSequence_Selector " << selector;
87
+ debug_ast(&root_block->expression(), ind + ":", env);
88
+ debug_ast(&root_block->block(), ind + " ", env);
89
+ } else if (dynamic_cast<Selector_List_Ptr>(node)) {
90
+ Selector_List_Ptr selector = dynamic_cast<Selector_List_Ptr>(node);
91
+ std::cerr << ind << "Selector_List " << selector;
87
92
  std::cerr << " (" << pstate_source_position(node) << ")";
88
93
  std::cerr << " <" << selector->hash() << ">";
89
94
  std::cerr << " [@media:" << selector->media_block() << "]";
@@ -95,14 +100,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
95
100
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
96
101
  std::cerr << std::endl;
97
102
 
98
- for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
103
+ for(const Complex_Selector_Obj& i : selector->elements()) { debug_ast(&i, ind + " ", env); }
99
104
 
100
- // } else if (dynamic_cast<Expression*>(node)) {
101
- // Expression* expression = dynamic_cast<Expression*>(node);
105
+ // } else if (dynamic_cast<Expression_Ptr>(node)) {
106
+ // Expression_Ptr expression = dynamic_cast<Expression_Ptr>(node);
102
107
  // std::cerr << ind << "Expression " << expression << " " << expression->concrete_type() << std::endl;
103
108
 
104
- } else if (dynamic_cast<Parent_Selector*>(node)) {
105
- Parent_Selector* selector = dynamic_cast<Parent_Selector*>(node);
109
+ } else if (dynamic_cast<Parent_Selector_Ptr>(node)) {
110
+ Parent_Selector_Ptr selector = dynamic_cast<Parent_Selector_Ptr>(node);
106
111
  std::cerr << ind << "Parent_Selector " << selector;
107
112
  // if (selector->not_selector()) cerr << " [in_declaration]";
108
113
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -111,9 +116,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
111
116
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
112
117
  // debug_ast(selector->selector(), ind + "->", env);
113
118
 
114
- } else if (dynamic_cast<Sequence_Selector*>(node)) {
115
- Sequence_Selector* selector = dynamic_cast<Sequence_Selector*>(node);
116
- std::cerr << ind << "Sequence_Selector " << selector
119
+ } else if (dynamic_cast<Complex_Selector_Ptr>(node)) {
120
+ Complex_Selector_Ptr selector = dynamic_cast<Complex_Selector_Ptr>(node);
121
+ std::cerr << ind << "Complex_Selector " << selector
117
122
  << " (" << pstate_source_position(node) << ")"
118
123
  << " <" << selector->hash() << ">"
119
124
  << " [length:" << longToHex(selector->length()) << "]"
@@ -128,25 +133,25 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
128
133
  << " -- ";
129
134
  std::string del;
130
135
  switch (selector->combinator()) {
131
- case Sequence_Selector::PARENT_OF: del = ">"; break;
132
- case Sequence_Selector::PRECEDES: del = "~"; break;
133
- case Sequence_Selector::ADJACENT_TO: del = "+"; break;
134
- case Sequence_Selector::ANCESTOR_OF: del = " "; break;
135
- case Sequence_Selector::REFERENCE: del = "//"; break;
136
+ case Complex_Selector::PARENT_OF: del = ">"; break;
137
+ case Complex_Selector::PRECEDES: del = "~"; break;
138
+ case Complex_Selector::ADJACENT_TO: del = "+"; break;
139
+ case Complex_Selector::ANCESTOR_OF: del = " "; break;
140
+ case Complex_Selector::REFERENCE: del = "//"; break;
136
141
  }
137
142
  // if (del = "/") del += selector->reference()->perform(&to_string) + "/";
138
143
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
139
- debug_ast(selector->head(), ind + " " /* + "[" + del + "]" */, env);
144
+ debug_ast(&selector->head(), ind + " " /* + "[" + del + "]" */, env);
140
145
  if (selector->tail()) {
141
- debug_ast(selector->tail(), ind + "{" + del + "}", env);
146
+ debug_ast(&selector->tail(), ind + "{" + del + "}", env);
142
147
  } else if(del != " ") {
143
148
  std::cerr << ind << " |" << del << "| {trailing op}" << std::endl;
144
149
  }
145
150
  SourcesSet set = selector->sources();
146
151
  // debug_sources_set(set, ind + " @--> ");
147
- } else if (dynamic_cast<SimpleSequence_Selector*>(node)) {
148
- SimpleSequence_Selector* selector = dynamic_cast<SimpleSequence_Selector*>(node);
149
- std::cerr << ind << "SimpleSequence_Selector " << selector;
152
+ } else if (dynamic_cast<Compound_Selector_Ptr>(node)) {
153
+ Compound_Selector_Ptr selector = dynamic_cast<Compound_Selector_Ptr>(node);
154
+ std::cerr << ind << "Compound_Selector " << selector;
150
155
  std::cerr << " (" << pstate_source_position(node) << ")";
151
156
  std::cerr << " <" << selector->hash() << ">";
152
157
  std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
@@ -157,9 +162,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
157
162
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
158
163
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
159
164
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
160
- for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
161
- } else if (dynamic_cast<Wrapped_Selector*>(node)) {
162
- Wrapped_Selector* selector = dynamic_cast<Wrapped_Selector*>(node);
165
+ for(const Simple_Selector_Obj& i : selector->elements()) { debug_ast(&i, ind + " ", env); }
166
+ } else if (dynamic_cast<Wrapped_Selector_Ptr>(node)) {
167
+ Wrapped_Selector_Ptr selector = dynamic_cast<Wrapped_Selector_Ptr>(node);
163
168
  std::cerr << ind << "Wrapped_Selector " << selector;
164
169
  std::cerr << " (" << pstate_source_position(node) << ")";
165
170
  std::cerr << " <" << selector->hash() << ">";
@@ -169,9 +174,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
169
174
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
170
175
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
171
176
  std::cerr << std::endl;
172
- debug_ast(selector->selector(), ind + " () ", env);
173
- } else if (dynamic_cast<Pseudo_Selector*>(node)) {
174
- Pseudo_Selector* selector = dynamic_cast<Pseudo_Selector*>(node);
177
+ debug_ast(&selector->selector(), ind + " () ", env);
178
+ } else if (dynamic_cast<Pseudo_Selector_Ptr>(node)) {
179
+ Pseudo_Selector_Ptr selector = dynamic_cast<Pseudo_Selector_Ptr>(node);
175
180
  std::cerr << ind << "Pseudo_Selector " << selector;
176
181
  std::cerr << " (" << pstate_source_position(node) << ")";
177
182
  std::cerr << " <" << selector->hash() << ">";
@@ -181,9 +186,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
181
186
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
182
187
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
183
188
  std::cerr << std::endl;
184
- debug_ast(selector->expression(), ind + " <= ", env);
185
- } else if (dynamic_cast<Attribute_Selector*>(node)) {
186
- Attribute_Selector* selector = dynamic_cast<Attribute_Selector*>(node);
189
+ debug_ast(&selector->expression(), ind + " <= ", env);
190
+ } else if (dynamic_cast<Attribute_Selector_Ptr>(node)) {
191
+ Attribute_Selector_Ptr selector = dynamic_cast<Attribute_Selector_Ptr>(node);
187
192
  std::cerr << ind << "Attribute_Selector " << selector;
188
193
  std::cerr << " (" << pstate_source_position(node) << ")";
189
194
  std::cerr << " <" << selector->hash() << ">";
@@ -193,9 +198,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
193
198
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
194
199
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
195
200
  std::cerr << std::endl;
196
- debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
197
- } else if (dynamic_cast<Class_Selector*>(node)) {
198
- Class_Selector* selector = dynamic_cast<Class_Selector*>(node);
201
+ debug_ast(&selector->value(), ind + "[" + selector->matcher() + "] ", env);
202
+ } else if (dynamic_cast<Class_Selector_Ptr>(node)) {
203
+ Class_Selector_Ptr selector = dynamic_cast<Class_Selector_Ptr>(node);
199
204
  std::cerr << ind << "Class_Selector " << selector;
200
205
  std::cerr << " (" << pstate_source_position(node) << ")";
201
206
  std::cerr << " <" << selector->hash() << ">";
@@ -205,8 +210,8 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
205
210
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
206
211
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
207
212
  std::cerr << std::endl;
208
- } else if (dynamic_cast<Id_Selector*>(node)) {
209
- Id_Selector* selector = dynamic_cast<Id_Selector*>(node);
213
+ } else if (dynamic_cast<Id_Selector_Ptr>(node)) {
214
+ Id_Selector_Ptr selector = dynamic_cast<Id_Selector_Ptr>(node);
210
215
  std::cerr << ind << "Id_Selector " << selector;
211
216
  std::cerr << " (" << pstate_source_position(node) << ")";
212
217
  std::cerr << " <" << selector->hash() << ">";
@@ -216,8 +221,8 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
216
221
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
217
222
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
218
223
  std::cerr << std::endl;
219
- } else if (dynamic_cast<Element_Selector*>(node)) {
220
- Element_Selector* selector = dynamic_cast<Element_Selector*>(node);
224
+ } else if (dynamic_cast<Element_Selector_Ptr>(node)) {
225
+ Element_Selector_Ptr selector = dynamic_cast<Element_Selector_Ptr>(node);
221
226
  std::cerr << ind << "Element_Selector " << selector;
222
227
  std::cerr << " (" << pstate_source_position(node) << ")";
223
228
  std::cerr << " <" << selector->hash() << ">";
@@ -228,10 +233,11 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
228
233
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
229
234
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
230
235
  std::cerr << std::endl;
231
- } else if (dynamic_cast<Placeholder_Selector*>(node)) {
236
+ } else if (dynamic_cast<Placeholder_Selector_Ptr>(node)) {
232
237
 
233
- Placeholder_Selector* selector = dynamic_cast<Placeholder_Selector*>(node);
234
- std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector
238
+ Placeholder_Selector_Ptr selector = dynamic_cast<Placeholder_Selector_Ptr>(node);
239
+ std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector;
240
+ std::cerr << " (" << pstate_source_position(selector) << ")"
235
241
  << " <" << selector->hash() << ">"
236
242
  << " [@media:" << selector->media_block() << "]"
237
243
  << (selector->is_optional() ? " [is_optional]": " -")
@@ -245,8 +251,8 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
245
251
  std::cerr << " (" << pstate_source_position(node) << ")";
246
252
  std::cerr << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << std::endl;
247
253
 
248
- } else if (dynamic_cast<Selector_Schema*>(node)) {
249
- Selector_Schema* selector = dynamic_cast<Selector_Schema*>(node);
254
+ } else if (dynamic_cast<Selector_Schema_Ptr>(node)) {
255
+ Selector_Schema_Ptr selector = dynamic_cast<Selector_Schema_Ptr>(node);
250
256
  std::cerr << ind << "Selector_Schema " << selector;
251
257
  std::cerr << " (" << pstate_source_position(node) << ")"
252
258
  << (selector->at_root() && selector->at_root() ? " [@ROOT]" : "")
@@ -255,196 +261,196 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
255
261
  << (selector->has_line_feed() ? " [line-feed]": " -")
256
262
  << std::endl;
257
263
 
258
- debug_ast(selector->contents(), ind + " ");
264
+ debug_ast(&selector->contents(), ind + " ");
259
265
  // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
260
266
 
261
- } else if (dynamic_cast<Selector*>(node)) {
262
- Selector* selector = dynamic_cast<Selector*>(node);
267
+ } else if (dynamic_cast<Selector_Ptr>(node)) {
268
+ Selector_Ptr selector = dynamic_cast<Selector_Ptr>(node);
263
269
  std::cerr << ind << "Selector " << selector;
264
270
  std::cerr << " (" << pstate_source_position(node) << ")";
265
271
  std::cerr << (selector->has_line_break() ? " [line-break]": " -")
266
272
  << (selector->has_line_feed() ? " [line-feed]": " -")
267
273
  << std::endl;
268
274
 
269
- } else if (dynamic_cast<Media_Query_Expression*>(node)) {
270
- Media_Query_Expression* block = dynamic_cast<Media_Query_Expression*>(node);
275
+ } else if (dynamic_cast<Media_Query_Expression_Ptr>(node)) {
276
+ Media_Query_Expression_Ptr block = dynamic_cast<Media_Query_Expression_Ptr>(node);
271
277
  std::cerr << ind << "Media_Query_Expression " << block;
272
278
  std::cerr << " (" << pstate_source_position(node) << ")";
273
279
  std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
274
280
  << std::endl;
275
- debug_ast(block->feature(), ind + " feature) ");
276
- debug_ast(block->value(), ind + " value) ");
281
+ debug_ast(&block->feature(), ind + " feature) ");
282
+ debug_ast(&block->value(), ind + " value) ");
277
283
 
278
- } else if (dynamic_cast<Media_Query*>(node)) {
279
- Media_Query* block = dynamic_cast<Media_Query*>(node);
284
+ } else if (dynamic_cast<Media_Query_Ptr>(node)) {
285
+ Media_Query_Ptr block = dynamic_cast<Media_Query_Ptr>(node);
280
286
  std::cerr << ind << "Media_Query " << block;
281
287
  std::cerr << " (" << pstate_source_position(node) << ")";
282
288
  std::cerr << (block->is_negated() ? " [is_negated]": " -")
283
289
  << (block->is_restricted() ? " [is_restricted]": " -")
284
290
  << std::endl;
285
- debug_ast(block->media_type(), ind + " ");
286
- for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
291
+ debug_ast(&block->media_type(), ind + " ");
292
+ for(const auto& i : block->elements()) { debug_ast(&i, ind + " ", env); }
287
293
 
288
- } else if (dynamic_cast<Media_Block*>(node)) {
289
- Media_Block* block = dynamic_cast<Media_Block*>(node);
294
+ } else if (dynamic_cast<Media_Block_Ptr>(node)) {
295
+ Media_Block_Ptr block = dynamic_cast<Media_Block_Ptr>(node);
290
296
  std::cerr << ind << "Media_Block " << block;
291
297
  std::cerr << " (" << pstate_source_position(node) << ")";
292
298
  std::cerr << " " << block->tabs() << std::endl;
293
- debug_ast(block->media_queries(), ind + " =@ ");
294
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
295
- } else if (dynamic_cast<Supports_Block*>(node)) {
296
- Supports_Block* block = dynamic_cast<Supports_Block*>(node);
299
+ debug_ast(&block->media_queries(), ind + " =@ ");
300
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(&i, ind + " ", env); }
301
+ } else if (dynamic_cast<Supports_Block_Ptr>(node)) {
302
+ Supports_Block_Ptr block = dynamic_cast<Supports_Block_Ptr>(node);
297
303
  std::cerr << ind << "Supports_Block " << block;
298
304
  std::cerr << " (" << pstate_source_position(node) << ")";
299
305
  std::cerr << " " << block->tabs() << std::endl;
300
- debug_ast(block->condition(), ind + " =@ ");
301
- debug_ast(block->block(), ind + " <>");
302
- } else if (dynamic_cast<Supports_Operator*>(node)) {
303
- Supports_Operator* block = dynamic_cast<Supports_Operator*>(node);
306
+ debug_ast(&block->condition(), ind + " =@ ");
307
+ debug_ast(&block->block(), ind + " <>");
308
+ } else if (dynamic_cast<Supports_Operator_Ptr>(node)) {
309
+ Supports_Operator_Ptr block = dynamic_cast<Supports_Operator_Ptr>(node);
304
310
  std::cerr << ind << "Supports_Operator " << block;
305
311
  std::cerr << " (" << pstate_source_position(node) << ")"
306
312
  << std::endl;
307
- debug_ast(block->left(), ind + " left) ");
308
- debug_ast(block->right(), ind + " right) ");
309
- } else if (dynamic_cast<Supports_Negation*>(node)) {
310
- Supports_Negation* block = dynamic_cast<Supports_Negation*>(node);
313
+ debug_ast(&block->left(), ind + " left) ");
314
+ debug_ast(&block->right(), ind + " right) ");
315
+ } else if (dynamic_cast<Supports_Negation_Ptr>(node)) {
316
+ Supports_Negation_Ptr block = dynamic_cast<Supports_Negation_Ptr>(node);
311
317
  std::cerr << ind << "Supports_Negation " << block;
312
318
  std::cerr << " (" << pstate_source_position(node) << ")"
313
319
  << std::endl;
314
- debug_ast(block->condition(), ind + " condition) ");
315
- } else if (dynamic_cast<At_Root_Query*>(node)) {
316
- At_Root_Query* block = dynamic_cast<At_Root_Query*>(node);
320
+ debug_ast(&block->condition(), ind + " condition) ");
321
+ } else if (dynamic_cast<At_Root_Query_Ptr>(node)) {
322
+ At_Root_Query_Ptr block = dynamic_cast<At_Root_Query_Ptr>(node);
317
323
  std::cerr << ind << "At_Root_Query " << block;
318
324
  std::cerr << " (" << pstate_source_position(node) << ")"
319
325
  << std::endl;
320
- debug_ast(block->feature(), ind + " feature) ");
321
- debug_ast(block->value(), ind + " value) ");
322
- } else if (dynamic_cast<Supports_Declaration*>(node)) {
323
- Supports_Declaration* block = dynamic_cast<Supports_Declaration*>(node);
326
+ debug_ast(&block->feature(), ind + " feature) ");
327
+ debug_ast(&block->value(), ind + " value) ");
328
+ } else if (dynamic_cast<Supports_Declaration_Ptr>(node)) {
329
+ Supports_Declaration_Ptr block = dynamic_cast<Supports_Declaration_Ptr>(node);
324
330
  std::cerr << ind << "Supports_Declaration " << block;
325
331
  std::cerr << " (" << pstate_source_position(node) << ")"
326
332
  << std::endl;
327
- debug_ast(block->feature(), ind + " feature) ");
328
- debug_ast(block->value(), ind + " value) ");
329
- } else if (dynamic_cast<Block*>(node)) {
330
- Block* root_block = dynamic_cast<Block*>(node);
333
+ debug_ast(&block->feature(), ind + " feature) ");
334
+ debug_ast(&block->value(), ind + " value) ");
335
+ } else if (dynamic_cast<Block_Ptr>(node)) {
336
+ Block_Ptr root_block = dynamic_cast<Block_Ptr>(node);
331
337
  std::cerr << ind << "Block " << root_block;
332
338
  std::cerr << " (" << pstate_source_position(node) << ")";
333
339
  if (root_block->is_root()) std::cerr << " [root]";
334
340
  std::cerr << " " << root_block->tabs() << std::endl;
335
- if (root_block->block()) for(auto i : root_block->block()->elements()) { debug_ast(i, ind + " ", env); }
336
- } else if (dynamic_cast<Warning*>(node)) {
337
- Warning* block = dynamic_cast<Warning*>(node);
341
+ for(const Statement_Obj& i : root_block->elements()) { debug_ast(&i, ind + " ", env); }
342
+ } else if (dynamic_cast<Warning_Ptr>(node)) {
343
+ Warning_Ptr block = dynamic_cast<Warning_Ptr>(node);
338
344
  std::cerr << ind << "Warning " << block;
339
345
  std::cerr << " (" << pstate_source_position(node) << ")";
340
346
  std::cerr << " " << block->tabs() << std::endl;
341
- debug_ast(block->message(), ind + " : ");
342
- } else if (dynamic_cast<Error*>(node)) {
343
- Error* block = dynamic_cast<Error*>(node);
347
+ debug_ast(&block->message(), ind + " : ");
348
+ } else if (dynamic_cast<Error_Ptr>(node)) {
349
+ Error_Ptr block = dynamic_cast<Error_Ptr>(node);
344
350
  std::cerr << ind << "Error " << block;
345
351
  std::cerr << " (" << pstate_source_position(node) << ")";
346
352
  std::cerr << " " << block->tabs() << std::endl;
347
- } else if (dynamic_cast<Debug*>(node)) {
348
- Debug* block = dynamic_cast<Debug*>(node);
353
+ } else if (dynamic_cast<Debug_Ptr>(node)) {
354
+ Debug_Ptr block = dynamic_cast<Debug_Ptr>(node);
349
355
  std::cerr << ind << "Debug " << block;
350
356
  std::cerr << " (" << pstate_source_position(node) << ")";
351
357
  std::cerr << " " << block->tabs() << std::endl;
352
- debug_ast(block->value(), ind + " ");
353
- } else if (dynamic_cast<Comment*>(node)) {
354
- Comment* block = dynamic_cast<Comment*>(node);
358
+ debug_ast(&block->value(), ind + " ");
359
+ } else if (dynamic_cast<Comment_Ptr>(node)) {
360
+ Comment_Ptr block = dynamic_cast<Comment_Ptr>(node);
355
361
  std::cerr << ind << "Comment " << block;
356
362
  std::cerr << " (" << pstate_source_position(node) << ")";
357
363
  std::cerr << " " << block->tabs() <<
358
364
  " <" << prettyprint(block->pstate().token.ws_before()) << ">" << std::endl;
359
- debug_ast(block->text(), ind + "// ", env);
360
- } else if (dynamic_cast<If*>(node)) {
361
- If* block = dynamic_cast<If*>(node);
365
+ debug_ast(&block->text(), ind + "// ", env);
366
+ } else if (dynamic_cast<If_Ptr>(node)) {
367
+ If_Ptr block = dynamic_cast<If_Ptr>(node);
362
368
  std::cerr << ind << "If " << block;
363
369
  std::cerr << " (" << pstate_source_position(node) << ")";
364
370
  std::cerr << " " << block->tabs() << std::endl;
365
- debug_ast(block->predicate(), ind + " = ");
366
- debug_ast(block->block(), ind + " <>");
367
- debug_ast(block->alternative(), ind + " ><");
368
- } else if (dynamic_cast<Return*>(node)) {
369
- Return* block = dynamic_cast<Return*>(node);
371
+ debug_ast(&block->predicate(), ind + " = ");
372
+ debug_ast(&block->block(), ind + " <>");
373
+ debug_ast(&block->alternative(), ind + " ><");
374
+ } else if (dynamic_cast<Return_Ptr>(node)) {
375
+ Return_Ptr block = dynamic_cast<Return_Ptr>(node);
370
376
  std::cerr << ind << "Return " << block;
371
377
  std::cerr << " (" << pstate_source_position(node) << ")";
372
378
  std::cerr << " " << block->tabs() << std::endl;
373
- } else if (dynamic_cast<Extension*>(node)) {
374
- Extension* block = dynamic_cast<Extension*>(node);
379
+ } else if (dynamic_cast<Extension_Ptr>(node)) {
380
+ Extension_Ptr block = dynamic_cast<Extension_Ptr>(node);
375
381
  std::cerr << ind << "Extension " << block;
376
382
  std::cerr << " (" << pstate_source_position(node) << ")";
377
383
  std::cerr << " " << block->tabs() << std::endl;
378
- debug_ast(block->selector(), ind + "-> ", env);
379
- } else if (dynamic_cast<Content*>(node)) {
380
- Content* block = dynamic_cast<Content*>(node);
384
+ debug_ast(&block->selector(), ind + "-> ", env);
385
+ } else if (dynamic_cast<Content_Ptr>(node)) {
386
+ Content_Ptr block = dynamic_cast<Content_Ptr>(node);
381
387
  std::cerr << ind << "Content " << block;
382
388
  std::cerr << " (" << pstate_source_position(node) << ")";
383
389
  std::cerr << " [@media:" << block->media_block() << "]";
384
390
  std::cerr << " " << block->tabs() << std::endl;
385
- } else if (dynamic_cast<Import_Stub*>(node)) {
386
- Import_Stub* block = dynamic_cast<Import_Stub*>(node);
391
+ } else if (dynamic_cast<Import_Stub_Ptr>(node)) {
392
+ Import_Stub_Ptr block = dynamic_cast<Import_Stub_Ptr>(node);
387
393
  std::cerr << ind << "Import_Stub " << block;
388
394
  std::cerr << " (" << pstate_source_position(node) << ")";
389
395
  std::cerr << " [" << block->imp_path() << "] ";
390
396
  std::cerr << " " << block->tabs() << std::endl;
391
- } else if (dynamic_cast<Import*>(node)) {
392
- Import* block = dynamic_cast<Import*>(node);
397
+ } else if (dynamic_cast<Import_Ptr>(node)) {
398
+ Import_Ptr block = dynamic_cast<Import_Ptr>(node);
393
399
  std::cerr << ind << "Import " << block;
394
400
  std::cerr << " (" << pstate_source_position(node) << ")";
395
401
  std::cerr << " " << block->tabs() << std::endl;
396
402
  // std::vector<std::string> files_;
397
- for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
398
- debug_ast(block->media_queries(), ind + "@@ ");
399
- } else if (dynamic_cast<Assignment*>(node)) {
400
- Assignment* block = dynamic_cast<Assignment*>(node);
403
+ for (auto imp : block->urls()) debug_ast(&imp, ind + "@: ", env);
404
+ debug_ast(&block->import_queries(), ind + "@@ ");
405
+ } else if (dynamic_cast<Assignment_Ptr>(node)) {
406
+ Assignment_Ptr block = dynamic_cast<Assignment_Ptr>(node);
401
407
  std::cerr << ind << "Assignment " << block;
402
408
  std::cerr << " (" << pstate_source_position(node) << ")";
403
409
  std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
404
- debug_ast(block->value(), ind + "=", env);
405
- } else if (dynamic_cast<Declaration*>(node)) {
406
- Declaration* block = dynamic_cast<Declaration*>(node);
410
+ debug_ast(&block->value(), ind + "=", env);
411
+ } else if (dynamic_cast<Declaration_Ptr>(node)) {
412
+ Declaration_Ptr block = dynamic_cast<Declaration_Ptr>(node);
407
413
  std::cerr << ind << "Declaration " << block;
408
414
  std::cerr << " (" << pstate_source_position(node) << ")";
409
415
  std::cerr << " " << block->tabs() << std::endl;
410
- debug_ast(block->property(), ind + " prop: ", env);
411
- debug_ast(block->value(), ind + " value: ", env);
412
- debug_ast(block->block(), ind + " ", env);
413
- } else if (dynamic_cast<Keyframe_Rule*>(node)) {
414
- Keyframe_Rule* has_block = dynamic_cast<Keyframe_Rule*>(node);
416
+ debug_ast(&block->property(), ind + " prop: ", env);
417
+ debug_ast(&block->value(), ind + " value: ", env);
418
+ debug_ast(&block->block(), ind + " ", env);
419
+ } else if (dynamic_cast<Keyframe_Rule_Ptr>(node)) {
420
+ Keyframe_Rule_Ptr has_block = dynamic_cast<Keyframe_Rule_Ptr>(node);
415
421
  std::cerr << ind << "Keyframe_Rule " << has_block;
416
422
  std::cerr << " (" << pstate_source_position(node) << ")";
417
423
  std::cerr << " " << has_block->tabs() << std::endl;
418
- if (has_block->selector()) debug_ast(has_block->selector(), ind + "@");
419
- if (has_block->block()) for(auto i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
420
- } else if (dynamic_cast<Directive*>(node)) {
421
- Directive* block = dynamic_cast<Directive*>(node);
424
+ if (has_block->name()) debug_ast(&has_block->name(), ind + "@");
425
+ if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(&i, ind + " ", env); }
426
+ } else if (dynamic_cast<Directive_Ptr>(node)) {
427
+ Directive_Ptr block = dynamic_cast<Directive_Ptr>(node);
422
428
  std::cerr << ind << "Directive " << block;
423
429
  std::cerr << " (" << pstate_source_position(node) << ")";
424
430
  std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
425
- debug_ast(block->selector(), ind + "~", env);
426
- debug_ast(block->value(), ind + "+", env);
427
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
428
- } else if (dynamic_cast<Each*>(node)) {
429
- Each* block = dynamic_cast<Each*>(node);
431
+ debug_ast(&block->selector(), ind + "~", env);
432
+ debug_ast(&block->value(), ind + "+", env);
433
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(&i, ind + " ", env); }
434
+ } else if (dynamic_cast<Each_Ptr>(node)) {
435
+ Each_Ptr block = dynamic_cast<Each_Ptr>(node);
430
436
  std::cerr << ind << "Each " << block;
431
437
  std::cerr << " (" << pstate_source_position(node) << ")";
432
438
  std::cerr << " " << block->tabs() << std::endl;
433
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
434
- } else if (dynamic_cast<For*>(node)) {
435
- For* block = dynamic_cast<For*>(node);
439
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(&i, ind + " ", env); }
440
+ } else if (dynamic_cast<For_Ptr>(node)) {
441
+ For_Ptr block = dynamic_cast<For_Ptr>(node);
436
442
  std::cerr << ind << "For " << block;
437
443
  std::cerr << " (" << pstate_source_position(node) << ")";
438
444
  std::cerr << " " << block->tabs() << std::endl;
439
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
440
- } else if (dynamic_cast<While*>(node)) {
441
- While* block = dynamic_cast<While*>(node);
445
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(&i, ind + " ", env); }
446
+ } else if (dynamic_cast<While_Ptr>(node)) {
447
+ While_Ptr block = dynamic_cast<While_Ptr>(node);
442
448
  std::cerr << ind << "While " << block;
443
449
  std::cerr << " (" << pstate_source_position(node) << ")";
444
450
  std::cerr << " " << block->tabs() << std::endl;
445
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
446
- } else if (dynamic_cast<Definition*>(node)) {
447
- Definition* block = dynamic_cast<Definition*>(node);
451
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(&i, ind + " ", env); }
452
+ } else if (dynamic_cast<Definition_Ptr>(node)) {
453
+ Definition_Ptr block = dynamic_cast<Definition_Ptr>(node);
448
454
  std::cerr << ind << "Definition " << block;
449
455
  std::cerr << " (" << pstate_source_position(node) << ")";
450
456
  std::cerr << " [name: " << block->name() << "] ";
@@ -453,16 +459,17 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
453
459
  // std::cerr << " [signature: " << block->signature() << "] ";
454
460
  std::cerr << " [native: " << block->native_function() << "] ";
455
461
  std::cerr << " " << block->tabs() << std::endl;
456
- debug_ast(block->parameters(), ind + " params: ", env);
457
- if (block->block()) debug_ast(block->block(), ind + " ", env);
458
- } else if (dynamic_cast<Mixin_Call*>(node)) {
459
- Mixin_Call* block = dynamic_cast<Mixin_Call*>(node);
462
+ debug_ast(&block->parameters(), ind + " params: ", env);
463
+ if (block->block()) debug_ast(&block->block(), ind + " ", env);
464
+ } else if (dynamic_cast<Mixin_Call_Ptr>(node)) {
465
+ Mixin_Call_Ptr block = dynamic_cast<Mixin_Call_Ptr>(node);
460
466
  std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
467
+ std::cerr << " (" << pstate_source_position(block) << ")";
461
468
  std::cerr << " [" << block->name() << "]";
462
469
  std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
463
- debug_ast(block->arguments(), ind + " args: ");
464
- if (block->block()) debug_ast(block->block(), ind + " ", env);
465
- } else if (Ruleset* ruleset = dynamic_cast<Ruleset*>(node)) {
470
+ debug_ast(&block->arguments(), ind + " args: ");
471
+ if (block->block()) debug_ast(&block->block(), ind + " ", env);
472
+ } else if (Ruleset_Ptr ruleset = dynamic_cast<Ruleset_Ptr>(node)) {
466
473
  std::cerr << ind << "Ruleset " << ruleset;
467
474
  std::cerr << " (" << pstate_source_position(node) << ")";
468
475
  std::cerr << " [indent: " << ruleset->tabs() << "]";
@@ -470,44 +477,45 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
470
477
  std::cerr << (ruleset->at_root() ? " [@ROOT]" : "");
471
478
  std::cerr << (ruleset->is_root() ? " [root]" : "");
472
479
  std::cerr << std::endl;
473
- debug_ast(ruleset->selector(), ind + ">");
474
- debug_ast(ruleset->block(), ind + " ");
475
- } else if (dynamic_cast<Block*>(node)) {
476
- Block* block = dynamic_cast<Block*>(node);
480
+ debug_ast(&ruleset->selector(), ind + ">");
481
+ debug_ast(&ruleset->block(), ind + " ");
482
+ } else if (dynamic_cast<Block_Ptr>(node)) {
483
+ Block_Ptr block = dynamic_cast<Block_Ptr>(node);
477
484
  std::cerr << ind << "Block " << block;
478
485
  std::cerr << " (" << pstate_source_position(node) << ")";
479
486
  std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
480
487
  std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
481
- for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
482
- } else if (dynamic_cast<Textual*>(node)) {
483
- Textual* expression = dynamic_cast<Textual*>(node);
484
- std::cerr << ind << "Textual ";
488
+ for(const Statement_Obj& i : block->elements()) { debug_ast(&i, ind + " ", env); }
489
+ } else if (dynamic_cast<Textual_Ptr>(node)) {
490
+ Textual_Ptr expression = dynamic_cast<Textual_Ptr>(node);
491
+ std::cerr << ind << "Textual " << expression;
492
+ std::cerr << " (" << pstate_source_position(node) << ")";
485
493
  if (expression->type() == Textual::NUMBER) std::cerr << " [NUMBER]";
486
494
  else if (expression->type() == Textual::PERCENTAGE) std::cerr << " [PERCENTAGE]";
487
495
  else if (expression->type() == Textual::DIMENSION) std::cerr << " [DIMENSION]";
488
496
  else if (expression->type() == Textual::HEX) std::cerr << " [HEX]";
489
- std::cerr << expression << " [" << expression->value() << "]";
497
+ std::cerr << " [" << expression->value() << "]";
490
498
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
491
499
  if (expression->is_delayed()) std::cerr << " [delayed]";
492
500
  std::cerr << std::endl;
493
- } else if (dynamic_cast<Variable*>(node)) {
494
- Variable* expression = dynamic_cast<Variable*>(node);
501
+ } else if (dynamic_cast<Variable_Ptr>(node)) {
502
+ Variable_Ptr expression = dynamic_cast<Variable_Ptr>(node);
495
503
  std::cerr << ind << "Variable " << expression;
496
504
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
497
505
  std::cerr << " (" << pstate_source_position(node) << ")";
498
506
  std::cerr << " [" << expression->name() << "]" << std::endl;
499
507
  std::string name(expression->name());
500
- if (env && env->has(name)) debug_ast(static_cast<Expression*>((*env)[name]), ind + " -> ", env);
501
- } else if (dynamic_cast<Function_Call_Schema*>(node)) {
502
- Function_Call_Schema* expression = dynamic_cast<Function_Call_Schema*>(node);
508
+ if (env && env->has(name)) debug_ast(SASS_MEMORY_CAST(Expression, (*env)[name]), ind + " -> ", env);
509
+ } else if (dynamic_cast<Function_Call_Schema_Ptr>(node)) {
510
+ Function_Call_Schema_Ptr expression = dynamic_cast<Function_Call_Schema_Ptr>(node);
503
511
  std::cerr << ind << "Function_Call_Schema " << expression;
504
512
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
505
513
  std::cerr << " (" << pstate_source_position(node) << ")";
506
514
  std::cerr << "" << std::endl;
507
- debug_ast(expression->name(), ind + "name: ", env);
508
- debug_ast(expression->arguments(), ind + " args: ", env);
509
- } else if (dynamic_cast<Function_Call*>(node)) {
510
- Function_Call* expression = dynamic_cast<Function_Call*>(node);
515
+ debug_ast(&expression->name(), ind + "name: ", env);
516
+ debug_ast(&expression->arguments(), ind + " args: ", env);
517
+ } else if (dynamic_cast<Function_Call_Ptr>(node)) {
518
+ Function_Call_Ptr expression = dynamic_cast<Function_Call_Ptr>(node);
511
519
  std::cerr << ind << "Function_Call " << expression;
512
520
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
513
521
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -515,9 +523,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
515
523
  if (expression->is_delayed()) std::cerr << " [delayed]";
516
524
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
517
525
  std::cerr << std::endl;
518
- debug_ast(expression->arguments(), ind + " args: ", env);
519
- } else if (dynamic_cast<Arguments*>(node)) {
520
- Arguments* expression = dynamic_cast<Arguments*>(node);
526
+ debug_ast(&expression->arguments(), ind + " args: ", env);
527
+ } else if (dynamic_cast<Arguments_Ptr>(node)) {
528
+ Arguments_Ptr expression = dynamic_cast<Arguments_Ptr>(node);
521
529
  std::cerr << ind << "Arguments " << expression;
522
530
  if (expression->is_delayed()) std::cerr << " [delayed]";
523
531
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -525,41 +533,41 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
525
533
  if (expression->has_rest_argument()) std::cerr << " [has_rest_argument]";
526
534
  if (expression->has_keyword_argument()) std::cerr << " [has_keyword_argument]";
527
535
  std::cerr << std::endl;
528
- for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
529
- } else if (dynamic_cast<Argument*>(node)) {
530
- Argument* expression = dynamic_cast<Argument*>(node);
536
+ for(const Argument_Obj& i : expression->elements()) { debug_ast(&i, ind + " ", env); }
537
+ } else if (dynamic_cast<Argument_Ptr>(node)) {
538
+ Argument_Ptr expression = dynamic_cast<Argument_Ptr>(node);
531
539
  std::cerr << ind << "Argument " << expression;
532
540
  std::cerr << " (" << pstate_source_position(node) << ")";
533
541
  std::cerr << " [" << expression->value() << "]";
534
542
  std::cerr << " [name: " << expression->name() << "] ";
535
543
  std::cerr << " [rest: " << expression->is_rest_argument() << "] ";
536
544
  std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
537
- debug_ast(expression->value(), ind + " value: ", env);
538
- } else if (dynamic_cast<Parameters*>(node)) {
539
- Parameters* expression = dynamic_cast<Parameters*>(node);
545
+ debug_ast(&expression->value(), ind + " value: ", env);
546
+ } else if (dynamic_cast<Parameters_Ptr>(node)) {
547
+ Parameters_Ptr expression = dynamic_cast<Parameters_Ptr>(node);
540
548
  std::cerr << ind << "Parameters " << expression;
541
549
  std::cerr << " (" << pstate_source_position(node) << ")";
542
550
  std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
543
551
  std::cerr << " [has_rest: " << expression->has_rest_parameter() << "] ";
544
552
  std::cerr << std::endl;
545
- for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
546
- } else if (dynamic_cast<Parameter*>(node)) {
547
- Parameter* expression = dynamic_cast<Parameter*>(node);
553
+ for(const Parameter_Obj& i : expression->elements()) { debug_ast(&i, ind + " ", env); }
554
+ } else if (dynamic_cast<Parameter_Ptr>(node)) {
555
+ Parameter_Ptr expression = dynamic_cast<Parameter_Ptr>(node);
548
556
  std::cerr << ind << "Parameter " << expression;
549
557
  std::cerr << " (" << pstate_source_position(node) << ")";
550
558
  std::cerr << " [name: " << expression->name() << "] ";
551
559
  std::cerr << " [default: " << expression->default_value() << "] ";
552
560
  std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
553
- } else if (dynamic_cast<Unary_Expression*>(node)) {
554
- Unary_Expression* expression = dynamic_cast<Unary_Expression*>(node);
561
+ } else if (dynamic_cast<Unary_Expression_Ptr>(node)) {
562
+ Unary_Expression_Ptr expression = dynamic_cast<Unary_Expression_Ptr>(node);
555
563
  std::cerr << ind << "Unary_Expression " << expression;
556
564
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
557
565
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
558
566
  std::cerr << " (" << pstate_source_position(node) << ")";
559
567
  std::cerr << " [" << expression->type() << "]" << std::endl;
560
- debug_ast(expression->operand(), ind + " operand: ", env);
561
- } else if (dynamic_cast<Binary_Expression*>(node)) {
562
- Binary_Expression* expression = dynamic_cast<Binary_Expression*>(node);
568
+ debug_ast(&expression->operand(), ind + " operand: ", env);
569
+ } else if (dynamic_cast<Binary_Expression_Ptr>(node)) {
570
+ Binary_Expression_Ptr expression = dynamic_cast<Binary_Expression_Ptr>(node);
563
571
  std::cerr << ind << "Binary_Expression " << expression;
564
572
  if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
565
573
  if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
@@ -569,20 +577,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
569
577
  std::cerr << " [ws_after: " << expression->op().ws_after << "] ";
570
578
  std::cerr << " (" << pstate_source_position(node) << ")";
571
579
  std::cerr << " [" << expression->type_name() << "]" << std::endl;
572
- debug_ast(expression->left(), ind + " left: ", env);
573
- debug_ast(expression->right(), ind + " right: ", env);
574
- } else if (dynamic_cast<Map*>(node)) {
575
- Map* expression = dynamic_cast<Map*>(node);
580
+ debug_ast(&expression->left(), ind + " left: ", env);
581
+ debug_ast(&expression->right(), ind + " right: ", env);
582
+ } else if (dynamic_cast<Map_Ptr>(node)) {
583
+ Map_Ptr expression = dynamic_cast<Map_Ptr>(node);
576
584
  std::cerr << ind << "Map " << expression;
577
585
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
578
586
  std::cerr << " (" << pstate_source_position(node) << ")";
579
587
  std::cerr << " [Hashed]" << std::endl;
580
- for (auto i : expression->elements()) {
581
- debug_ast(i.first, ind + " key: ");
582
- debug_ast(i.second, ind + " val: ");
588
+ for (const auto& i : expression->elements()) {
589
+ debug_ast(&i.first, ind + " key: ");
590
+ debug_ast(&i.second, ind + " val: ");
583
591
  }
584
- } else if (dynamic_cast<List*>(node)) {
585
- List* expression = dynamic_cast<List*>(node);
592
+ } else if (dynamic_cast<List_Ptr>(node)) {
593
+ List_Ptr expression = dynamic_cast<List_Ptr>(node);
586
594
  std::cerr << ind << "List " << expression;
587
595
  std::cerr << " (" << pstate_source_position(node) << ")";
588
596
  std::cerr << " (" << expression->length() << ") " <<
@@ -593,36 +601,43 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
593
601
  " [arglist: " << expression->is_arglist() << "] " <<
594
602
  " [hash: " << expression->hash() << "] " <<
595
603
  std::endl;
596
- for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
597
- } else if (dynamic_cast<Content*>(node)) {
598
- Content* expression = dynamic_cast<Content*>(node);
604
+ for(const auto& i : expression->elements()) { debug_ast(&i, ind + " ", env); }
605
+ } else if (dynamic_cast<Content_Ptr>(node)) {
606
+ Content_Ptr expression = dynamic_cast<Content_Ptr>(node);
599
607
  std::cerr << ind << "Content " << expression;
600
608
  std::cerr << " (" << pstate_source_position(node) << ")";
601
609
  std::cerr << " [@media:" << expression->media_block() << "]";
602
610
  std::cerr << " [Statement]" << std::endl;
603
- } else if (dynamic_cast<Boolean*>(node)) {
604
- Boolean* expression = dynamic_cast<Boolean*>(node);
611
+ } else if (dynamic_cast<Boolean_Ptr>(node)) {
612
+ Boolean_Ptr expression = dynamic_cast<Boolean_Ptr>(node);
605
613
  std::cerr << ind << "Boolean " << expression;
606
614
  std::cerr << " (" << pstate_source_position(node) << ")";
607
615
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
608
616
  std::cerr << " [" << expression->value() << "]" << std::endl;
609
- } else if (dynamic_cast<Color*>(node)) {
610
- Color* expression = dynamic_cast<Color*>(node);
617
+ } else if (dynamic_cast<Color_Ptr>(node)) {
618
+ Color_Ptr expression = dynamic_cast<Color_Ptr>(node);
611
619
  std::cerr << ind << "Color " << expression;
612
620
  std::cerr << " (" << pstate_source_position(node) << ")";
613
621
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
614
622
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
615
623
  std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
616
- } else if (dynamic_cast<Number*>(node)) {
617
- Number* expression = dynamic_cast<Number*>(node);
624
+ } else if (dynamic_cast<Number_Ptr>(node)) {
625
+ Number_Ptr expression = dynamic_cast<Number_Ptr>(node);
618
626
  std::cerr << ind << "Number " << expression;
619
627
  std::cerr << " (" << pstate_source_position(node) << ")";
620
628
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
621
629
  std::cerr << " [" << expression->value() << expression->unit() << "]" <<
622
630
  " [hash: " << expression->hash() << "] " <<
623
631
  std::endl;
624
- } else if (dynamic_cast<String_Quoted*>(node)) {
625
- String_Quoted* expression = dynamic_cast<String_Quoted*>(node);
632
+ } else if (dynamic_cast<Null_Ptr>(node)) {
633
+ Null_Ptr expression = dynamic_cast<Null_Ptr>(node);
634
+ std::cerr << ind << "Null " << expression;
635
+ std::cerr << " (" << pstate_source_position(node) << ")";
636
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] "
637
+ // " [hash: " << expression->hash() << "] "
638
+ << std::endl;
639
+ } else if (dynamic_cast<String_Quoted_Ptr>(node)) {
640
+ String_Quoted_Ptr expression = dynamic_cast<String_Quoted_Ptr>(node);
626
641
  std::cerr << ind << "String_Quoted " << expression;
627
642
  std::cerr << " (" << pstate_source_position(node) << ")";
628
643
  std::cerr << " [" << prettyprint(expression->value()) << "]";
@@ -630,8 +645,8 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
630
645
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
631
646
  if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
632
647
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
633
- } else if (dynamic_cast<String_Constant*>(node)) {
634
- String_Constant* expression = dynamic_cast<String_Constant*>(node);
648
+ } else if (dynamic_cast<String_Constant_Ptr>(node)) {
649
+ String_Constant_Ptr expression = dynamic_cast<String_Constant_Ptr>(node);
635
650
  std::cerr << ind << "String_Constant " << expression;
636
651
  if (expression->concrete_type()) {
637
652
  std::cerr << " " << expression->concrete_type();
@@ -641,26 +656,28 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
641
656
  if (expression->is_delayed()) std::cerr << " [delayed]";
642
657
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
643
658
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
644
- } else if (dynamic_cast<String_Schema*>(node)) {
645
- String_Schema* expression = dynamic_cast<String_Schema*>(node);
659
+ } else if (dynamic_cast<String_Schema_Ptr>(node)) {
660
+ String_Schema_Ptr expression = dynamic_cast<String_Schema_Ptr>(node);
646
661
  std::cerr << ind << "String_Schema " << expression;
662
+ std::cerr << " (" << pstate_source_position(expression) << ")";
647
663
  std::cerr << " " << expression->concrete_type();
664
+ std::cerr << " (" << pstate_source_position(node) << ")";
648
665
  if (expression->is_delayed()) std::cerr << " [delayed]";
649
666
  if (expression->is_interpolant()) std::cerr << " [is interpolant]";
650
667
  if (expression->has_interpolant()) std::cerr << " [has interpolant]";
651
668
  if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
652
669
  if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
653
670
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
654
- for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
655
- } else if (dynamic_cast<String*>(node)) {
656
- String* expression = dynamic_cast<String*>(node);
671
+ for(const auto& i : expression->elements()) { debug_ast(&i, ind + " ", env); }
672
+ } else if (dynamic_cast<String_Ptr>(node)) {
673
+ String_Ptr expression = dynamic_cast<String_Ptr>(node);
657
674
  std::cerr << ind << "String " << expression;
658
675
  std::cerr << " " << expression->concrete_type();
659
676
  std::cerr << " (" << pstate_source_position(node) << ")";
660
677
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
661
678
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
662
- } else if (dynamic_cast<Expression*>(node)) {
663
- Expression* expression = dynamic_cast<Expression*>(node);
679
+ } else if (dynamic_cast<Expression_Ptr>(node)) {
680
+ Expression_Ptr expression = dynamic_cast<Expression_Ptr>(node);
664
681
  std::cerr << ind << "Expression " << expression;
665
682
  std::cerr << " (" << pstate_source_position(node) << ")";
666
683
  switch (expression->concrete_type()) {
@@ -675,17 +692,18 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
675
692
  case Expression::Concrete_Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
676
693
  case Expression::Concrete_Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
677
694
  case Expression::Concrete_Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
695
+ case Expression::Concrete_Type::FUNCTION: std::cerr << " [FUNCTION]"; break;
678
696
  case Expression::Concrete_Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
679
697
  }
680
698
  std::cerr << std::endl;
681
- } else if (dynamic_cast<Has_Block*>(node)) {
682
- Has_Block* has_block = dynamic_cast<Has_Block*>(node);
699
+ } else if (dynamic_cast<Has_Block_Ptr>(node)) {
700
+ Has_Block_Ptr has_block = dynamic_cast<Has_Block_Ptr>(node);
683
701
  std::cerr << ind << "Has_Block " << has_block;
684
702
  std::cerr << " (" << pstate_source_position(node) << ")";
685
703
  std::cerr << " " << has_block->tabs() << std::endl;
686
- if (has_block->block()) for(auto i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
687
- } else if (dynamic_cast<Statement*>(node)) {
688
- Statement* statement = dynamic_cast<Statement*>(node);
704
+ if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(&i, ind + " ", env); }
705
+ } else if (dynamic_cast<Statement_Ptr>(node)) {
706
+ Statement_Ptr statement = dynamic_cast<Statement_Ptr>(node);
689
707
  std::cerr << ind << "Statement " << statement;
690
708
  std::cerr << " (" << pstate_source_position(node) << ")";
691
709
  std::cerr << " " << statement->tabs() << std::endl;
@@ -703,11 +721,11 @@ inline void debug_node(Node* node, std::string ind = "")
703
721
  std::cerr << node << " ";
704
722
  if (node->got_line_feed) std::cerr << "[LF] ";
705
723
  switch (node->combinator()) {
706
- case Sequence_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
707
- case Sequence_Selector::PARENT_OF: std::cerr << "{>} "; break;
708
- case Sequence_Selector::PRECEDES: std::cerr << "{~} "; break;
709
- case Sequence_Selector::REFERENCE: std::cerr << "{@} "; break;
710
- case Sequence_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
724
+ case Complex_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
725
+ case Complex_Selector::PARENT_OF: std::cerr << "{>} "; break;
726
+ case Complex_Selector::PRECEDES: std::cerr << "{~} "; break;
727
+ case Complex_Selector::REFERENCE: std::cerr << "{@} "; break;
728
+ case Complex_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
711
729
  }
712
730
  std::cerr << std::endl;
713
731
  // debug_ast(node->combinator(), ind + " ");
@@ -717,7 +735,7 @@ inline void debug_node(Node* node, std::string ind = "")
717
735
  std::cerr << node << " ";
718
736
  if (node->got_line_feed) std::cerr << "[LF] ";
719
737
  std::cerr << std::endl;
720
- debug_ast(node->selector(), ind + " ");
738
+ debug_ast(&node->selector(), ind + " ");
721
739
  } else if (node->isCollection()) {
722
740
  std::cerr << ind;
723
741
  std::cerr << "Collection ";
@@ -743,35 +761,36 @@ inline void debug_node(Node* node, std::string ind = "")
743
761
  if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
744
762
  }
745
763
 
746
- inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0)
764
+ /*
765
+ inline void debug_ast(const AST_Node_Ptr node, std::string ind = "", Env* env = 0)
747
766
  {
748
- debug_ast(const_cast<AST_Node*>(node), ind, env);
767
+ debug_ast(const_cast<AST_Node_Ptr>(node), ind, env);
749
768
  }
750
-
769
+ */
751
770
  inline void debug_node(const Node* node, std::string ind = "")
752
771
  {
753
772
  debug_node(const_cast<Node*>(node), ind);
754
773
  }
755
774
 
756
- inline void debug_subset_map(Sass::ExtensionSubsetMap& map, std::string ind = "")
775
+ inline void debug_subset_map(Sass::Subset_Map& map, std::string ind = "")
757
776
  {
758
777
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
759
778
  for(auto const &it : map.values()) {
760
- debug_ast(it.first, ind + "first: ");
761
- debug_ast(it.second, ind + "second: ");
779
+ debug_ast(&it.first, ind + "first: ");
780
+ debug_ast(&it.second, ind + "second: ");
762
781
  }
763
782
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
764
783
  }
765
784
 
766
- typedef std::pair<Sequence_Selector*, SimpleSequence_Selector*> ExtensionPair;
785
+ typedef std::pair<Complex_Selector_Obj, Compound_Selector_Obj> ExtensionPair;
767
786
  typedef std::vector<ExtensionPair> SubsetMapEntries;
768
787
 
769
788
  inline void debug_subset_entries(SubsetMapEntries* entries, std::string ind = "")
770
789
  {
771
790
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
772
791
  for(auto const &pair : *entries) {
773
- debug_ast(pair.first, ind + "first: ");
774
- debug_ast(pair.second, ind + "second: ");
792
+ debug_ast(&pair.first, ind + "first: ");
793
+ debug_ast(&pair.second, ind + "second: ");
775
794
  }
776
795
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
777
796
  }