sassc 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -10,66 +10,60 @@ 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
- Context& ctx;
16
15
  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);
16
+ BlockStack block_stack;
17
+ sass::vector<Statement*> p_stack;
21
18
 
22
19
  public:
23
20
  Cssize(Context&);
24
21
  ~Cssize() { }
25
22
 
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
-
23
+ Block* operator()(Block*);
24
+ Statement* operator()(StyleRule*);
25
+ // Statement* operator()(Bubble*);
26
+ Statement* operator()(CssMediaRule*);
27
+ Statement* operator()(SupportsRule*);
28
+ Statement* operator()(AtRootRule*);
29
+ Statement* operator()(AtRule*);
30
+ Statement* operator()(Keyframe_Rule*);
31
+ Statement* operator()(Trace*);
32
+ Statement* operator()(Declaration*);
33
+ // Statement* operator()(Assignment*);
34
+ // Statement* operator()(Import*);
35
+ // Statement* operator()(Import_Stub*);
36
+ // Statement* operator()(WarningRule*);
37
+ // Statement* operator()(Error*);
38
+ // Statement* operator()(Comment*);
39
+ // Statement* operator()(If*);
40
+ // Statement* operator()(ForRule*);
41
+ // Statement* operator()(EachRule*);
42
+ // Statement* operator()(WhileRule*);
43
+ // Statement* operator()(Return*);
44
+ // Statement* operator()(ExtendRule*);
45
+ // Statement* operator()(Definition*);
46
+ // Statement* operator()(Mixin_Call*);
47
+ // Statement* operator()(Content*);
48
+ Statement* operator()(Null*);
49
+
50
+ Statement* parent();
51
+ sass::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block*);
52
+ Statement* bubble(AtRule*);
53
+ Statement* bubble(AtRootRule*);
54
+ Statement* bubble(CssMediaRule*);
55
+ Statement* bubble(SupportsRule*);
56
+
57
+ Block* debubble(Block* children, Statement* parent = 0);
58
+ Block* flatten(const Block*);
59
+ bool bubblable(Statement*);
60
+
61
+ // generic fallback
69
62
  template <typename U>
70
- Statement_Ptr fallback(U x) { return fallback_impl(x); }
63
+ Statement* fallback(U x)
64
+ { return Cast<Statement>(x); }
71
65
 
72
- void append_block(Block_Ptr, Block_Ptr);
66
+ void append_block(Block*, Block*);
73
67
  };
74
68
 
75
69
  }
@@ -0,0 +1,199 @@
1
+ #ifndef SASS_DART_HELPERS_H
2
+ #define SASS_DART_HELPERS_H
3
+
4
+ #include <vector>
5
+ #include <utility>
6
+ #include <iterator>
7
+ #include <functional>
8
+
9
+ namespace Sass {
10
+
11
+ // ##########################################################################
12
+ // Flatten `vector<vector<T>>` to `vector<T>`
13
+ // ##########################################################################
14
+ template <class T>
15
+ T flatten(const sass::vector<T>& all)
16
+ {
17
+ T flattened;
18
+ for (const auto& sub : all) {
19
+ std::copy(std::begin(sub), std::end(sub),
20
+ std::back_inserter(flattened));
21
+ }
22
+ return flattened;
23
+ }
24
+
25
+ // ##########################################################################
26
+ // Expands each element of this Iterable into zero or more elements.
27
+ // Calls a function on every element and ads all results to flat array
28
+ // ##########################################################################
29
+ // Equivalent to dart `cnt.any`
30
+ // Pass additional closure variables to `fn`
31
+ template <class T, class U, typename ...Args>
32
+ T expand(const T& cnt, U fn, Args... args) {
33
+ T flattened;
34
+ for (const auto& sub : cnt) {
35
+ auto rv = fn(sub, args...);
36
+ flattened.insert(flattened.end(),
37
+ rv.begin(), rv.end());
38
+ }
39
+ return flattened;
40
+ }
41
+
42
+ // ##########################################################################
43
+ // ##########################################################################
44
+ template <class T>
45
+ T flattenInner(const sass::vector<T>& vec)
46
+ {
47
+ T outer;
48
+ for (const auto& sub : vec) {
49
+ outer.emplace_back(std::move(flatten(sub)));
50
+ }
51
+ return outer;
52
+ }
53
+ // EO flattenInner
54
+
55
+ // ##########################################################################
56
+ // Equivalent to dart `cnt.any`
57
+ // Pass additional closure variables to `fn`
58
+ // ##########################################################################
59
+ template <class T, class U, typename ...Args>
60
+ bool hasAny(const T& cnt, U fn, Args... args) {
61
+ for (const auto& sub : cnt) {
62
+ if (fn(sub, args...)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ // EO hasAny
69
+
70
+ // ##########################################################################
71
+ // Equivalent to dart `cnt.take(len).any`
72
+ // Pass additional closure variables to `fn`
73
+ // ##########################################################################
74
+ template <class T, class U, typename ...Args>
75
+ bool hasSubAny(const T& cnt, size_t len, U fn, Args... args) {
76
+ for (size_t i = 0; i < len; i++) {
77
+ if (fn(cnt[i], args...)) {
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+
84
+ // ##########################################################################
85
+ // Default predicate for lcs algorithm
86
+ // ##########################################################################
87
+ template <class T>
88
+ inline bool lcsIdentityCmp(const T& X, const T& Y, T& result)
89
+ {
90
+ // Assert equality
91
+ if (!ObjEqualityFn(X, Y)) {
92
+ return false;
93
+ }
94
+ // Store in reference
95
+ result = X;
96
+ // Return success
97
+ return true;
98
+ }
99
+ // EO lcsIdentityCmp
100
+
101
+ // ##########################################################################
102
+ // Longest common subsequence with predicate
103
+ // ##########################################################################
104
+ template <class T>
105
+ sass::vector<T> lcs(
106
+ const sass::vector<T>& X, const sass::vector<T>& Y,
107
+ bool(*select)(const T&, const T&, T&) = lcsIdentityCmp<T>)
108
+ {
109
+
110
+ std::size_t m = X.size(), mm = X.size() + 1;
111
+ std::size_t n = Y.size(), nn = Y.size() + 1;
112
+
113
+ if (m == 0) return {};
114
+ if (n == 0) return {};
115
+
116
+ // MSVC does not support variable-length arrays
117
+ // To circumvent, allocate one array on the heap
118
+ // Then use a macro to access via double index
119
+ // e.g. `size_t L[m][n]` is supported by gcc
120
+ size_t* len = new size_t[mm * nn + 1];
121
+ bool* acc = new bool[mm * nn + 1];
122
+ T* res = new T[mm * nn + 1];
123
+
124
+ #define LEN(x, y) len[(x) * nn + (y)]
125
+ #define ACC(x, y) acc[(x) * nn + (y)]
126
+ #define RES(x, y) res[(x) * nn + (y)]
127
+
128
+ /* Following steps build L[m+1][n+1] in bottom up fashion. Note
129
+ that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */
130
+ for (size_t i = 0; i <= m; i++) {
131
+ for (size_t j = 0; j <= n; j++) {
132
+ if (i == 0 || j == 0)
133
+ LEN(i, j) = 0;
134
+ else {
135
+ ACC(i - 1, j - 1) = select(X[i - 1], Y[j - 1], RES(i - 1, j - 1));
136
+ if (ACC(i - 1, j - 1))
137
+ LEN(i, j) = LEN(i - 1, j - 1) + 1;
138
+ else
139
+ LEN(i, j) = std::max(LEN(i - 1, j), LEN(i, j - 1));
140
+ }
141
+ }
142
+ }
143
+
144
+ // Following code is used to print LCS
145
+ sass::vector<T> lcs;
146
+ std::size_t index = LEN(m, n);
147
+ lcs.reserve(index);
148
+
149
+ // Start from the right-most-bottom-most corner
150
+ // and one by one store objects in lcs[]
151
+ std::size_t i = m, j = n;
152
+ while (i > 0 && j > 0) {
153
+
154
+ // If current objects in X[] and Y are same,
155
+ // then current object is part of LCS
156
+ if (ACC(i - 1, j - 1))
157
+ {
158
+ // Put the stored object in result
159
+ // Note: we push instead of unshift
160
+ // Note: reverse the vector later
161
+ // ToDo: is deque more performant?
162
+ lcs.push_back(RES(i - 1, j - 1));
163
+ // reduce values of i, j and index
164
+ i -= 1; j -= 1; index -= 1;
165
+ }
166
+
167
+ // If not same, then find the larger of two and
168
+ // go in the direction of larger value
169
+ else if (LEN(i - 1, j) > LEN(i, j - 1)) {
170
+ i--;
171
+ }
172
+ else {
173
+ j--;
174
+ }
175
+
176
+ }
177
+
178
+ // reverse now as we used push_back
179
+ std::reverse(lcs.begin(), lcs.end());
180
+
181
+ // Delete temp memory on heap
182
+ delete[] len;
183
+ delete[] acc;
184
+ delete[] res;
185
+
186
+ #undef LEN
187
+ #undef ACC
188
+ #undef RES
189
+
190
+ return lcs;
191
+ }
192
+ // EO lcs
193
+
194
+ // ##########################################################################
195
+ // ##########################################################################
196
+
197
+ }
198
+
199
+ #endif
@@ -1,33 +1,292 @@
1
1
  #ifndef SASS_DEBUGGER_H
2
2
  #define SASS_DEBUGGER_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
8
+ #include <queue>
9
+ #include <vector>
4
10
  #include <string>
5
11
  #include <sstream>
6
- #include "node.hpp"
12
+ #include "ast.hpp"
7
13
  #include "ast_fwd_decl.hpp"
14
+ #include "extension.hpp"
15
+
16
+ #include "ordered_map.hpp"
8
17
 
9
18
  using namespace Sass;
10
19
 
11
- inline void debug_ast(AST_Node_Ptr node, std::string ind = "", Env* env = 0);
20
+ inline void debug_ast(AST_Node* node, sass::string ind = "", Env* env = 0);
12
21
 
13
- inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0) {
14
- debug_ast(const_cast<AST_Node*>(node), ind, env);
22
+ inline sass::string debug_vec(const AST_Node* node) {
23
+ if (node == NULL) return "null";
24
+ else return node->to_string();
15
25
  }
16
26
 
17
- inline void debug_sources_set(ComplexSelectorSet& set, std::string ind = "")
18
- {
19
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
20
- for(auto const &pair : set) {
21
- debug_ast(pair, ind + "");
22
- // debug_ast(set[pair], ind + "first: ");
27
+ inline sass::string debug_dude(sass::vector<sass::vector<int>> vec) {
28
+ sass::sstream out;
29
+ out << "{";
30
+ bool joinOut = false;
31
+ for (auto ct : vec) {
32
+ if (joinOut) out << ", ";
33
+ joinOut = true;
34
+ out << "{";
35
+ bool joinIn = false;
36
+ for (auto nr : ct) {
37
+ if (joinIn) out << ", ";
38
+ joinIn = true;
39
+ out << nr;
40
+ }
41
+ out << "}";
42
+ }
43
+ out << "}";
44
+ return out.str();
45
+ }
46
+
47
+ inline sass::string debug_vec(sass::string& str) {
48
+ return str;
49
+ }
50
+
51
+ inline sass::string debug_vec(Extension& ext) {
52
+ sass::sstream out;
53
+ out << debug_vec(ext.extender);
54
+ out << " {@extend ";
55
+ out << debug_vec(ext.target);
56
+ if (ext.isOptional) {
57
+ out << " !optional";
58
+ }
59
+ out << "}";
60
+ return out.str();
61
+ }
62
+
63
+ template <class T>
64
+ inline sass::string debug_vec(sass::vector<T> vec) {
65
+ sass::sstream out;
66
+ out << "[";
67
+ for (size_t i = 0; i < vec.size(); i += 1) {
68
+ if (i > 0) out << ", ";
69
+ out << debug_vec(vec[i]);
70
+ }
71
+ out << "]";
72
+ return out.str();
73
+ }
74
+
75
+ template <class T>
76
+ inline sass::string debug_vec(std::queue<T> vec) {
77
+ sass::sstream out;
78
+ out << "{";
79
+ for (size_t i = 0; i < vec.size(); i += 1) {
80
+ if (i > 0) out << ", ";
81
+ out << debug_vec(vec[i]);
23
82
  }
24
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
83
+ out << "}";
84
+ return out.str();
85
+ }
86
+
87
+ template <class T, class U, class O>
88
+ inline sass::string debug_vec(std::map<T, U, O> vec) {
89
+ sass::sstream out;
90
+ out << "{";
91
+ bool joinit = false;
92
+ for (auto it = vec.begin(); it != vec.end(); it++)
93
+ {
94
+ if (joinit) out << ", ";
95
+ out << debug_vec(it->first) // string (key)
96
+ << ": "
97
+ << debug_vec(it->second); // string's value
98
+ joinit = true;
99
+ }
100
+ out << "}";
101
+ return out.str();
102
+ }
103
+
104
+ template <class T, class U, class O, class V>
105
+ inline sass::string debug_vec(const ordered_map<T, U, O, V>& vec) {
106
+ sass::sstream out;
107
+ out << "{";
108
+ bool joinit = false;
109
+ for (auto it = vec.begin(); it != vec.end(); it++)
110
+ {
111
+ if (joinit) out << ", ";
112
+ out << debug_vec(*it); // string (key)
113
+ // << debug_vec(it->second); // string's value
114
+ joinit = true;
115
+ }
116
+ out << "}";
117
+ return out.str();
118
+ }
119
+
120
+ template <class T, class U, class O, class V>
121
+ inline sass::string debug_vec(std::unordered_map<T, U, O, V> vec) {
122
+ sass::sstream out;
123
+ out << "{";
124
+ bool joinit = false;
125
+ for (auto it = vec.begin(); it != vec.end(); it++)
126
+ {
127
+ if (joinit) out << ", ";
128
+ out << debug_vec(it->first) // string (key)
129
+ << ": "
130
+ << debug_vec(it->second); // string's value
131
+ joinit = true;
132
+ }
133
+ out << "}";
134
+ return out.str();
135
+ }
136
+
137
+ template <class T, class U, class O, class V>
138
+ inline sass::string debug_keys(std::unordered_map<T, U, O, V> vec) {
139
+ sass::sstream out;
140
+ out << "{";
141
+ bool joinit = false;
142
+ for (auto it = vec.begin(); it != vec.end(); it++)
143
+ {
144
+ if (joinit) out << ", ";
145
+ out << debug_vec(it->first); // string (key)
146
+ joinit = true;
147
+ }
148
+ out << "}";
149
+ return out.str();
150
+ }
151
+
152
+ inline sass::string debug_vec(ExtListSelSet& vec) {
153
+ sass::sstream out;
154
+ out << "{";
155
+ bool joinit = false;
156
+ for (auto it = vec.begin(); it != vec.end(); it++)
157
+ {
158
+ if (joinit) out << ", ";
159
+ out << debug_vec(*it); // string (key)
160
+ joinit = true;
161
+ }
162
+ out << "}";
163
+ return out.str();
164
+ }
165
+
166
+ /*
167
+ template <class T, class U, class O, class V>
168
+ inline sass::string debug_values(tsl::ordered_map<T, U, O, V> vec) {
169
+ sass::sstream out;
170
+ out << "{";
171
+ bool joinit = false;
172
+ for (auto it = vec.begin(); it != vec.end(); it++)
173
+ {
174
+ if (joinit) out << ", ";
175
+ out << debug_vec(const_cast<U&>(it->second)); // string's value
176
+ joinit = true;
177
+ }
178
+ out << "}";
179
+ return out.str();
180
+ }
181
+
182
+ template <class T, class U, class O, class V>
183
+ inline sass::string debug_vec(tsl::ordered_map<T, U, O, V> vec) {
184
+ sass::sstream out;
185
+ out << "{";
186
+ bool joinit = false;
187
+ for (auto it = vec.begin(); it != vec.end(); it++)
188
+ {
189
+ if (joinit) out << ", ";
190
+ out << debug_vec(it->first) // string (key)
191
+ << ": "
192
+ << debug_vec(const_cast<U&>(it->second)); // string's value
193
+ joinit = true;
194
+ }
195
+ out << "}";
196
+ return out.str();
197
+ }
198
+
199
+ template <class T, class U, class O, class V>
200
+ inline sass::string debug_vals(tsl::ordered_map<T, U, O, V> vec) {
201
+ sass::sstream out;
202
+ out << "{";
203
+ bool joinit = false;
204
+ for (auto it = vec.begin(); it != vec.end(); it++)
205
+ {
206
+ if (joinit) out << ", ";
207
+ out << debug_vec(const_cast<U&>(it->second)); // string's value
208
+ joinit = true;
209
+ }
210
+ out << "}";
211
+ return out.str();
212
+ }
213
+
214
+ template <class T, class U, class O, class V>
215
+ inline sass::string debug_keys(tsl::ordered_map<T, U, O, V> vec) {
216
+ sass::sstream out;
217
+ out << "{";
218
+ bool joinit = false;
219
+ for (auto it = vec.begin(); it != vec.end(); it++)
220
+ {
221
+ if (joinit) out << ", ";
222
+ out << debug_vec(it->first);
223
+ joinit = true;
224
+ }
225
+ out << "}";
226
+ return out.str();
227
+ }
228
+ */
229
+
230
+ template <class T, class U>
231
+ inline sass::string debug_vec(std::set<T, U> vec) {
232
+ sass::sstream out;
233
+ out << "{";
234
+ bool joinit = false;
235
+ for (auto item : vec) {
236
+ if (joinit) out << ", ";
237
+ out << debug_vec(item);
238
+ joinit = true;
239
+ }
240
+ out << "}";
241
+ return out.str();
242
+ }
243
+
244
+ /*
245
+ template <class T, class U, class O, class V>
246
+ inline sass::string debug_vec(tsl::ordered_set<T, U, O, V> vec) {
247
+ sass::sstream out;
248
+ out << "{";
249
+ bool joinit = false;
250
+ for (auto item : vec) {
251
+ if (joinit) out << ", ";
252
+ out << debug_vec(item);
253
+ joinit = true;
254
+ }
255
+ out << "}";
256
+ return out.str();
257
+ }
258
+ */
259
+
260
+ template <class T, class U, class O, class V>
261
+ inline sass::string debug_vec(std::unordered_set<T, U, O, V> vec) {
262
+ sass::sstream out;
263
+ out << "{";
264
+ bool joinit = false;
265
+ for (auto item : vec) {
266
+ if (joinit) out << ", ";
267
+ out << debug_vec(item);
268
+ joinit = true;
269
+ }
270
+ out << "}";
271
+ return out.str();
272
+ }
273
+
274
+ inline sass::string debug_bool(bool val) {
275
+ return val ? "true" : "false";
276
+ }
277
+ inline sass::string debug_vec(ExtSmplSelSet* node) {
278
+ if (node == NULL) return "null";
279
+ else return debug_vec(*node);
25
280
  }
26
281
 
27
- inline std::string str_replace(std::string str, const std::string& oldStr, const std::string& newStr)
282
+ inline void debug_ast(const AST_Node* node, sass::string ind = "", Env* env = 0) {
283
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
284
+ }
285
+
286
+ inline sass::string str_replace(sass::string str, const sass::string& oldStr, const sass::string& newStr)
28
287
  {
29
288
  size_t pos = 0;
30
- while((pos = str.find(oldStr, pos)) != std::string::npos)
289
+ while((pos = str.find(oldStr, pos)) != sass::string::npos)
31
290
  {
32
291
  str.replace(pos, oldStr.length(), newStr);
33
292
  pos += newStr.length();
@@ -35,25 +294,26 @@ inline std::string str_replace(std::string str, const std::string& oldStr, const
35
294
  return str;
36
295
  }
37
296
 
38
- inline std::string prettyprint(const std::string& str) {
39
- std::string clean = str_replace(str, "\n", "\\n");
297
+ inline sass::string prettyprint(const sass::string& str) {
298
+ sass::string clean = str_replace(str, "\n", "\\n");
40
299
  clean = str_replace(clean, " ", "\\t");
41
300
  clean = str_replace(clean, "\r", "\\r");
42
301
  return clean;
43
302
  }
44
303
 
45
- inline std::string longToHex(long long t) {
46
- std::stringstream is;
304
+ inline sass::string longToHex(long long t) {
305
+ sass::sstream is;
47
306
  is << std::hex << t;
48
307
  return is.str();
49
308
  }
50
309
 
51
- inline std::string pstate_source_position(AST_Node_Ptr node)
310
+ inline sass::string pstate_source_position(AST_Node* node)
52
311
  {
53
- std::stringstream str;
54
- Position start(node->pstate());
55
- Position end(start + node->pstate().offset);
56
- str << (start.file == std::string::npos ? -1 : start.file)
312
+ sass::sstream str;
313
+ Offset start(node->pstate().position);
314
+ Offset end(start + node->pstate().offset);
315
+ size_t file = node->pstate().getSrcId();
316
+ str << (file == sass::string::npos ? 99999999 : file)
57
317
  << "@[" << start.line << ":" << start.column << "]"
58
318
  << "-[" << end.line << ":" << end.column << "]";
59
319
  #ifdef DEBUG_SHARED_PTR
@@ -64,203 +324,162 @@ inline std::string pstate_source_position(AST_Node_Ptr node)
64
324
  return str.str();
65
325
  }
66
326
 
67
- inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
327
+ inline void debug_ast(AST_Node* node, sass::string ind, Env* env)
68
328
  {
69
329
  if (node == 0) return;
70
330
  if (ind == "") std::cerr << "####################################################################\n";
71
331
  if (Cast<Bubble>(node)) {
72
- Bubble_Ptr bubble = Cast<Bubble>(node);
332
+ Bubble* bubble = Cast<Bubble>(node);
73
333
  std::cerr << ind << "Bubble " << bubble;
74
334
  std::cerr << " (" << pstate_source_position(node) << ")";
75
335
  std::cerr << " " << bubble->tabs();
76
336
  std::cerr << std::endl;
77
337
  debug_ast(bubble->node(), ind + " ", env);
78
338
  } else if (Cast<Trace>(node)) {
79
- Trace_Ptr trace = Cast<Trace>(node);
339
+ Trace* trace = Cast<Trace>(node);
80
340
  std::cerr << ind << "Trace " << trace;
81
341
  std::cerr << " (" << pstate_source_position(node) << ")"
82
342
  << " [name:" << trace->name() << ", type: " << trace->type() << "]"
83
343
  << std::endl;
84
344
  debug_ast(trace->block(), ind + " ", env);
85
- } else if (Cast<At_Root_Block>(node)) {
86
- At_Root_Block_Ptr root_block = Cast<At_Root_Block>(node);
87
- std::cerr << ind << "At_Root_Block " << root_block;
345
+ } else if (Cast<AtRootRule>(node)) {
346
+ AtRootRule* root_block = Cast<AtRootRule>(node);
347
+ std::cerr << ind << "AtRootRule " << root_block;
88
348
  std::cerr << " (" << pstate_source_position(node) << ")";
89
349
  std::cerr << " " << root_block->tabs();
90
350
  std::cerr << std::endl;
91
351
  debug_ast(root_block->expression(), ind + ":", env);
92
352
  debug_ast(root_block->block(), ind + " ", env);
93
- } else if (Cast<Selector_List>(node)) {
94
- Selector_List_Ptr selector = Cast<Selector_List>(node);
95
- std::cerr << ind << "Selector_List " << selector;
353
+ } else if (Cast<SelectorList>(node)) {
354
+ SelectorList* selector = Cast<SelectorList>(node);
355
+ std::cerr << ind << "SelectorList " << selector;
96
356
  std::cerr << " (" << pstate_source_position(node) << ")";
97
357
  std::cerr << " <" << selector->hash() << ">";
98
- std::cerr << " [@media:" << selector->media_block() << "]";
99
- std::cerr << (selector->is_invisible() ? " [INVISIBLE]": " -");
100
- std::cerr << (selector->has_placeholder() ? " [PLACEHOLDER]": " -");
101
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
102
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
103
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
104
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
358
+ std::cerr << (selector->is_invisible() ? " [is_invisible]" : " -");
359
+ std::cerr << (selector->isInvisible() ? " [isInvisible]" : " -");
360
+ std::cerr << (selector->has_real_parent_ref() ? " [real-parent]": " -");
105
361
  std::cerr << std::endl;
106
- debug_ast(selector->schema(), ind + "#{} ");
107
362
 
108
- for(const Complex_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
363
+ for(const ComplexSelector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
109
364
 
110
- // } else if (Cast<Expression>(node)) {
111
- // Expression_Ptr expression = Cast<Expression>(node);
112
- // std::cerr << ind << "Expression " << expression << " " << expression->concrete_type() << std::endl;
365
+ } else if (Cast<ComplexSelector>(node)) {
366
+ ComplexSelector* selector = Cast<ComplexSelector>(node);
367
+ std::cerr << ind << "ComplexSelector " << selector
368
+ << " (" << pstate_source_position(node) << ")"
369
+ << " <" << selector->hash() << ">"
370
+ << " [" << (selector->chroots() ? "CHROOT" : "CONNECT") << "]"
371
+ << " [length:" << longToHex(selector->length()) << "]"
372
+ << " [weight:" << longToHex(selector->specificity()) << "]"
373
+ << (selector->is_invisible() ? " [is_invisible]" : " -")
374
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
375
+ << (selector->hasPreLineFeed() ? " [hasPreLineFeed]" : " -")
113
376
 
114
- } else if (Cast<Parent_Selector>(node)) {
115
- Parent_Selector_Ptr selector = Cast<Parent_Selector>(node);
116
- std::cerr << ind << "Parent_Selector " << selector;
117
- // if (selector->not_selector()) cerr << " [in_declaration]";
118
- std::cerr << " (" << pstate_source_position(node) << ")";
119
- std::cerr << " <" << selector->hash() << ">";
120
- std::cerr << " [" << (selector->is_real_parent_ref() ? "REAL" : "FAKE") << "]";
121
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
122
- // debug_ast(selector->selector(), ind + "->", env);
377
+ // << (selector->is_invisible() ? " [INVISIBLE]": " -")
378
+ // << (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
379
+ // << (selector->is_optional() ? " [is_optional]": " -")
380
+ << (selector->has_real_parent_ref() ? " [real parent]": " -")
381
+ // << (selector->has_line_feed() ? " [line-feed]": " -")
382
+ // << (selector->has_line_break() ? " [line-break]": " -")
383
+ << " -- \n";
384
+
385
+ for(const SelectorComponentObj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
123
386
 
124
- } else if (Cast<Complex_Selector>(node)) {
125
- Complex_Selector_Ptr selector = Cast<Complex_Selector>(node);
126
- std::cerr << ind << "Complex_Selector " << selector
387
+ } else if (Cast<SelectorCombinator>(node)) {
388
+ SelectorCombinator* selector = Cast<SelectorCombinator>(node);
389
+ std::cerr << ind << "SelectorCombinator " << selector
127
390
  << " (" << pstate_source_position(node) << ")"
128
391
  << " <" << selector->hash() << ">"
129
- << " [length:" << longToHex(selector->length()) << "]"
130
392
  << " [weight:" << longToHex(selector->specificity()) << "]"
131
- << " [@media:" << selector->media_block() << "]"
132
- << (selector->is_invisible() ? " [INVISIBLE]": " -")
133
- << (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
134
- << (selector->is_optional() ? " [is_optional]": " -")
135
- << (selector->has_parent_ref() ? " [has parent]": " -")
136
- << (selector->has_line_feed() ? " [line-feed]": " -")
137
- << (selector->has_line_break() ? " [line-break]": " -")
393
+ << (selector->has_real_parent_ref() ? " [real parent]": " -")
138
394
  << " -- ";
139
- std::string del;
395
+
396
+ sass::string del;
140
397
  switch (selector->combinator()) {
141
- case Complex_Selector::PARENT_OF: del = ">"; break;
142
- case Complex_Selector::PRECEDES: del = "~"; break;
143
- case Complex_Selector::ADJACENT_TO: del = "+"; break;
144
- case Complex_Selector::ANCESTOR_OF: del = " "; break;
145
- case Complex_Selector::REFERENCE: del = "//"; break;
398
+ case SelectorCombinator::CHILD: del = ">"; break;
399
+ case SelectorCombinator::GENERAL: del = "~"; break;
400
+ case SelectorCombinator::ADJACENT: del = "+"; break;
146
401
  }
147
- // if (del = "/") del += selector->reference()->perform(&to_string) + "/";
148
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
149
- debug_ast(selector->head(), ind + " " /* + "[" + del + "]" */, env);
150
- if (selector->tail()) {
151
- debug_ast(selector->tail(), ind + "{" + del + "}", env);
152
- } else if(del != " ") {
153
- std::cerr << ind << " |" << del << "| {trailing op}" << std::endl;
154
- }
155
- ComplexSelectorSet set = selector->sources();
156
- // debug_sources_set(set, ind + " @--> ");
157
- } else if (Cast<Compound_Selector>(node)) {
158
- Compound_Selector_Ptr selector = Cast<Compound_Selector>(node);
159
- std::cerr << ind << "Compound_Selector " << selector;
402
+
403
+ std::cerr << "[" << del << "]" << "\n";
404
+
405
+ } else if (Cast<CompoundSelector>(node)) {
406
+ CompoundSelector* selector = Cast<CompoundSelector>(node);
407
+ std::cerr << ind << "CompoundSelector " << selector;
160
408
  std::cerr << " (" << pstate_source_position(node) << ")";
161
409
  std::cerr << " <" << selector->hash() << ">";
410
+ std::cerr << (selector->hasRealParent() ? " [REAL PARENT]" : "") << ">";
162
411
  std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
163
- std::cerr << " [@media:" << selector->media_block() << "]";
164
- std::cerr << (selector->extended() ? " [extended]": " -");
165
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
166
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
167
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
168
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
169
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
170
- for(const Simple_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
171
- } else if (Cast<Wrapped_Selector>(node)) {
172
- Wrapped_Selector_Ptr selector = Cast<Wrapped_Selector>(node);
173
- std::cerr << ind << "Wrapped_Selector " << selector;
412
+ std::cerr << (selector->hasPostLineBreak() ? " [hasPostLineBreak]" : " -");
413
+ std::cerr << (selector->is_invisible() ? " [is_invisible]" : " -");
414
+ std::cerr << (selector->isInvisible() ? " [isInvisible]" : " -");
415
+ std::cerr << "\n";
416
+ for(const SimpleSelector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
417
+
418
+ } else if (Cast<Parent_Reference>(node)) {
419
+ Parent_Reference* selector = Cast<Parent_Reference>(node);
420
+ std::cerr << ind << "Parent_Reference " << selector;
174
421
  std::cerr << " (" << pstate_source_position(node) << ")";
175
422
  std::cerr << " <" << selector->hash() << ">";
176
- std::cerr << " <<" << selector->ns_name() << ">>";
177
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
178
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
179
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
180
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
181
423
  std::cerr << std::endl;
182
- debug_ast(selector->selector(), ind + " () ", env);
183
- } else if (Cast<Pseudo_Selector>(node)) {
184
- Pseudo_Selector_Ptr selector = Cast<Pseudo_Selector>(node);
185
- std::cerr << ind << "Pseudo_Selector " << selector;
424
+
425
+ } else if (Cast<PseudoSelector>(node)) {
426
+ PseudoSelector* selector = Cast<PseudoSelector>(node);
427
+ std::cerr << ind << "PseudoSelector " << selector;
186
428
  std::cerr << " (" << pstate_source_position(node) << ")";
187
429
  std::cerr << " <" << selector->hash() << ">";
188
430
  std::cerr << " <<" << selector->ns_name() << ">>";
189
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
190
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
191
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
192
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
431
+ std::cerr << (selector->isClass() ? " [isClass]": " -");
432
+ std::cerr << (selector->isSyntacticClass() ? " [isSyntacticClass]": " -");
193
433
  std::cerr << std::endl;
194
- debug_ast(selector->expression(), ind + " <= ", env);
195
- } else if (Cast<Attribute_Selector>(node)) {
196
- Attribute_Selector_Ptr selector = Cast<Attribute_Selector>(node);
197
- std::cerr << ind << "Attribute_Selector " << selector;
434
+ debug_ast(selector->argument(), ind + " <= ", env);
435
+ debug_ast(selector->selector(), ind + " || ", env);
436
+ } else if (Cast<AttributeSelector>(node)) {
437
+ AttributeSelector* selector = Cast<AttributeSelector>(node);
438
+ std::cerr << ind << "AttributeSelector " << selector;
198
439
  std::cerr << " (" << pstate_source_position(node) << ")";
199
440
  std::cerr << " <" << selector->hash() << ">";
200
441
  std::cerr << " <<" << selector->ns_name() << ">>";
201
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
202
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
203
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
204
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
205
442
  std::cerr << std::endl;
206
443
  debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
207
- } else if (Cast<Class_Selector>(node)) {
208
- Class_Selector_Ptr selector = Cast<Class_Selector>(node);
209
- std::cerr << ind << "Class_Selector " << selector;
444
+ } else if (Cast<ClassSelector>(node)) {
445
+ ClassSelector* selector = Cast<ClassSelector>(node);
446
+ std::cerr << ind << "ClassSelector " << selector;
210
447
  std::cerr << " (" << pstate_source_position(node) << ")";
211
448
  std::cerr << " <" << selector->hash() << ">";
212
449
  std::cerr << " <<" << selector->ns_name() << ">>";
213
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
214
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
215
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
216
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
217
450
  std::cerr << std::endl;
218
- } else if (Cast<Id_Selector>(node)) {
219
- Id_Selector_Ptr selector = Cast<Id_Selector>(node);
220
- std::cerr << ind << "Id_Selector " << selector;
451
+ } else if (Cast<IDSelector>(node)) {
452
+ IDSelector* selector = Cast<IDSelector>(node);
453
+ std::cerr << ind << "IDSelector " << selector;
221
454
  std::cerr << " (" << pstate_source_position(node) << ")";
222
455
  std::cerr << " <" << selector->hash() << ">";
223
456
  std::cerr << " <<" << selector->ns_name() << ">>";
224
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
225
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
226
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
227
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
228
457
  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;
458
+ } else if (Cast<TypeSelector>(node)) {
459
+ TypeSelector* selector = Cast<TypeSelector>(node);
460
+ std::cerr << ind << "TypeSelector " << selector;
232
461
  std::cerr << " (" << pstate_source_position(node) << ")";
233
462
  std::cerr << " <" << selector->hash() << ">";
234
463
  std::cerr << " <<" << selector->ns_name() << ">>";
235
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
236
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
237
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
238
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
239
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
240
464
  std::cerr << std::endl;
241
- } else if (Cast<Placeholder_Selector>(node)) {
465
+ } else if (Cast<PlaceholderSelector>(node)) {
242
466
 
243
- Placeholder_Selector_Ptr selector = Cast<Placeholder_Selector>(node);
244
- std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector;
467
+ PlaceholderSelector* selector = Cast<PlaceholderSelector>(node);
468
+ std::cerr << ind << "PlaceholderSelector [" << selector->ns_name() << "] " << selector;
245
469
  std::cerr << " (" << pstate_source_position(selector) << ")"
246
470
  << " <" << selector->hash() << ">"
247
- << " [@media:" << selector->media_block() << "]"
248
- << (selector->is_optional() ? " [is_optional]": " -")
249
- << (selector->has_line_break() ? " [line-break]": " -")
250
- << (selector->has_line_feed() ? " [line-feed]": " -")
471
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
251
472
  << std::endl;
252
473
 
253
- } else if (Cast<Simple_Selector>(node)) {
254
- Simple_Selector* selector = Cast<Simple_Selector>(node);
255
- std::cerr << ind << "Simple_Selector " << selector;
474
+ } else if (Cast<SimpleSelector>(node)) {
475
+ SimpleSelector* selector = Cast<SimpleSelector>(node);
476
+ std::cerr << ind << "SimpleSelector " << selector;
256
477
  std::cerr << " (" << pstate_source_position(node) << ")";
257
- std::cerr << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << std::endl;
258
478
 
259
479
  } else if (Cast<Selector_Schema>(node)) {
260
- Selector_Schema_Ptr selector = Cast<Selector_Schema>(node);
480
+ Selector_Schema* selector = Cast<Selector_Schema>(node);
261
481
  std::cerr << ind << "Selector_Schema " << selector;
262
482
  std::cerr << " (" << pstate_source_position(node) << ")"
263
- << " [@media:" << selector->media_block() << "]"
264
483
  << (selector->connect_parent() ? " [connect-parent]": " -")
265
484
  << std::endl;
266
485
 
@@ -268,15 +487,13 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
268
487
  // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
269
488
 
270
489
  } else if (Cast<Selector>(node)) {
271
- Selector_Ptr selector = Cast<Selector>(node);
490
+ Selector* selector = Cast<Selector>(node);
272
491
  std::cerr << ind << "Selector " << selector;
273
- std::cerr << " (" << pstate_source_position(node) << ")";
274
- std::cerr << (selector->has_line_break() ? " [line-break]": " -")
275
- << (selector->has_line_feed() ? " [line-feed]": " -")
492
+ std::cerr << " (" << pstate_source_position(node) << ")"
276
493
  << std::endl;
277
494
 
278
495
  } else if (Cast<Media_Query_Expression>(node)) {
279
- Media_Query_Expression_Ptr block = Cast<Media_Query_Expression>(node);
496
+ Media_Query_Expression* block = Cast<Media_Query_Expression>(node);
280
497
  std::cerr << ind << "Media_Query_Expression " << block;
281
498
  std::cerr << " (" << pstate_source_position(node) << ")";
282
499
  std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
@@ -285,7 +502,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
285
502
  debug_ast(block->value(), ind + " value) ");
286
503
 
287
504
  } else if (Cast<Media_Query>(node)) {
288
- Media_Query_Ptr block = Cast<Media_Query>(node);
505
+ Media_Query* block = Cast<Media_Query>(node);
289
506
  std::cerr << ind << "Media_Query " << block;
290
507
  std::cerr << " (" << pstate_source_position(node) << ")";
291
508
  std::cerr << (block->is_negated() ? " [is_negated]": " -")
@@ -293,81 +510,100 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
293
510
  << std::endl;
294
511
  debug_ast(block->media_type(), ind + " ");
295
512
  for(const auto& i : block->elements()) { debug_ast(i, ind + " ", env); }
296
-
297
- } else if (Cast<Media_Block>(node)) {
298
- Media_Block_Ptr block = Cast<Media_Block>(node);
299
- std::cerr << ind << "Media_Block " << block;
300
- std::cerr << " (" << pstate_source_position(node) << ")";
301
- std::cerr << " " << block->tabs() << std::endl;
302
- debug_ast(block->media_queries(), ind + " =@ ");
303
- if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
304
- } else if (Cast<Supports_Block>(node)) {
305
- Supports_Block_Ptr block = Cast<Supports_Block>(node);
306
- std::cerr << ind << "Supports_Block " << block;
513
+ }
514
+ else if (Cast<MediaRule>(node)) {
515
+ MediaRule* rule = Cast<MediaRule>(node);
516
+ std::cerr << ind << "MediaRule " << rule;
517
+ std::cerr << " (" << pstate_source_position(rule) << ")";
518
+ std::cerr << " " << rule->tabs() << std::endl;
519
+ debug_ast(rule->schema(), ind + " =@ ");
520
+ debug_ast(rule->block(), ind + " ");
521
+ }
522
+ else if (Cast<CssMediaRule>(node)) {
523
+ CssMediaRule* rule = Cast<CssMediaRule>(node);
524
+ std::cerr << ind << "CssMediaRule " << rule;
525
+ std::cerr << " (" << pstate_source_position(rule) << ")";
526
+ std::cerr << " " << rule->tabs() << std::endl;
527
+ for (auto item : rule->elements()) {
528
+ debug_ast(item, ind + " == ");
529
+ }
530
+ debug_ast(rule->block(), ind + " ");
531
+ }
532
+ else if (Cast<CssMediaQuery>(node)) {
533
+ CssMediaQuery* query = Cast<CssMediaQuery>(node);
534
+ std::cerr << ind << "CssMediaQuery " << query;
535
+ std::cerr << " (" << pstate_source_position(query) << ")";
536
+ std::cerr << " [" << (query->modifier()) << "] ";
537
+ std::cerr << " [" << (query->type()) << "] ";
538
+ std::cerr << " " << debug_vec(query->features());
539
+ std::cerr << std::endl;
540
+ } else if (Cast<SupportsRule>(node)) {
541
+ SupportsRule* block = Cast<SupportsRule>(node);
542
+ std::cerr << ind << "SupportsRule " << block;
307
543
  std::cerr << " (" << pstate_source_position(node) << ")";
308
544
  std::cerr << " " << block->tabs() << std::endl;
309
545
  debug_ast(block->condition(), ind + " =@ ");
310
546
  debug_ast(block->block(), ind + " <>");
311
- } else if (Cast<Supports_Operator>(node)) {
312
- Supports_Operator_Ptr block = Cast<Supports_Operator>(node);
313
- std::cerr << ind << "Supports_Operator " << block;
547
+ } else if (Cast<SupportsOperation>(node)) {
548
+ SupportsOperation* block = Cast<SupportsOperation>(node);
549
+ std::cerr << ind << "SupportsOperation " << block;
314
550
  std::cerr << " (" << pstate_source_position(node) << ")"
315
551
  << std::endl;
316
552
  debug_ast(block->left(), ind + " left) ");
317
553
  debug_ast(block->right(), ind + " right) ");
318
- } else if (Cast<Supports_Negation>(node)) {
319
- Supports_Negation_Ptr block = Cast<Supports_Negation>(node);
320
- std::cerr << ind << "Supports_Negation " << block;
554
+ } else if (Cast<SupportsNegation>(node)) {
555
+ SupportsNegation* block = Cast<SupportsNegation>(node);
556
+ std::cerr << ind << "SupportsNegation " << block;
321
557
  std::cerr << " (" << pstate_source_position(node) << ")"
322
558
  << std::endl;
323
559
  debug_ast(block->condition(), ind + " condition) ");
324
560
  } else if (Cast<At_Root_Query>(node)) {
325
- At_Root_Query_Ptr block = Cast<At_Root_Query>(node);
561
+ At_Root_Query* block = Cast<At_Root_Query>(node);
326
562
  std::cerr << ind << "At_Root_Query " << block;
327
563
  std::cerr << " (" << pstate_source_position(node) << ")"
328
564
  << std::endl;
329
565
  debug_ast(block->feature(), ind + " feature) ");
330
566
  debug_ast(block->value(), ind + " value) ");
331
- } else if (Cast<Supports_Declaration>(node)) {
332
- Supports_Declaration_Ptr block = Cast<Supports_Declaration>(node);
333
- std::cerr << ind << "Supports_Declaration " << block;
567
+ } else if (Cast<SupportsDeclaration>(node)) {
568
+ SupportsDeclaration* block = Cast<SupportsDeclaration>(node);
569
+ std::cerr << ind << "SupportsDeclaration " << block;
334
570
  std::cerr << " (" << pstate_source_position(node) << ")"
335
571
  << std::endl;
336
572
  debug_ast(block->feature(), ind + " feature) ");
337
573
  debug_ast(block->value(), ind + " value) ");
338
574
  } else if (Cast<Block>(node)) {
339
- Block_Ptr root_block = Cast<Block>(node);
575
+ Block* root_block = Cast<Block>(node);
340
576
  std::cerr << ind << "Block " << root_block;
341
577
  std::cerr << " (" << pstate_source_position(node) << ")";
342
578
  if (root_block->is_root()) std::cerr << " [root]";
579
+ if (root_block->isInvisible()) std::cerr << " [isInvisible]";
343
580
  std::cerr << " " << root_block->tabs() << std::endl;
344
581
  for(const Statement_Obj& i : root_block->elements()) { debug_ast(i, ind + " ", env); }
345
- } else if (Cast<Warning>(node)) {
346
- Warning_Ptr block = Cast<Warning>(node);
347
- std::cerr << ind << "Warning " << block;
582
+ } else if (Cast<WarningRule>(node)) {
583
+ WarningRule* block = Cast<WarningRule>(node);
584
+ std::cerr << ind << "WarningRule " << block;
348
585
  std::cerr << " (" << pstate_source_position(node) << ")";
349
586
  std::cerr << " " << block->tabs() << std::endl;
350
587
  debug_ast(block->message(), ind + " : ");
351
- } else if (Cast<Error>(node)) {
352
- Error_Ptr block = Cast<Error>(node);
353
- std::cerr << ind << "Error " << block;
588
+ } else if (Cast<ErrorRule>(node)) {
589
+ ErrorRule* block = Cast<ErrorRule>(node);
590
+ std::cerr << ind << "ErrorRule " << block;
354
591
  std::cerr << " (" << pstate_source_position(node) << ")";
355
592
  std::cerr << " " << block->tabs() << std::endl;
356
- } else if (Cast<Debug>(node)) {
357
- Debug_Ptr block = Cast<Debug>(node);
358
- std::cerr << ind << "Debug " << block;
593
+ } else if (Cast<DebugRule>(node)) {
594
+ DebugRule* block = Cast<DebugRule>(node);
595
+ std::cerr << ind << "DebugRule " << block;
359
596
  std::cerr << " (" << pstate_source_position(node) << ")";
360
597
  std::cerr << " " << block->tabs() << std::endl;
361
598
  debug_ast(block->value(), ind + " ");
362
599
  } else if (Cast<Comment>(node)) {
363
- Comment_Ptr block = Cast<Comment>(node);
600
+ Comment* block = Cast<Comment>(node);
364
601
  std::cerr << ind << "Comment " << block;
365
602
  std::cerr << " (" << pstate_source_position(node) << ")";
366
- std::cerr << " " << block->tabs() <<
367
- " <" << prettyprint(block->pstate().token.ws_before()) << ">" << std::endl;
603
+ std::cerr << " " << block->tabs() << std::endl;
368
604
  debug_ast(block->text(), ind + "// ", env);
369
605
  } else if (Cast<If>(node)) {
370
- If_Ptr block = Cast<If>(node);
606
+ If* block = Cast<If>(node);
371
607
  std::cerr << ind << "If " << block;
372
608
  std::cerr << " (" << pstate_source_position(node) << ")";
373
609
  std::cerr << " " << block->tabs() << std::endl;
@@ -375,44 +611,45 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
375
611
  debug_ast(block->block(), ind + " <>");
376
612
  debug_ast(block->alternative(), ind + " ><");
377
613
  } else if (Cast<Return>(node)) {
378
- Return_Ptr block = Cast<Return>(node);
614
+ Return* block = Cast<Return>(node);
379
615
  std::cerr << ind << "Return " << block;
380
616
  std::cerr << " (" << pstate_source_position(node) << ")";
381
- std::cerr << " " << block->tabs() << std::endl;
382
- } else if (Cast<Extension>(node)) {
383
- Extension_Ptr block = Cast<Extension>(node);
384
- std::cerr << ind << "Extension " << block;
617
+ std::cerr << " " << block->tabs();
618
+ std::cerr << " [" << block->value()->to_string() << "]" << std::endl;
619
+ } else if (Cast<ExtendRule>(node)) {
620
+ ExtendRule* block = Cast<ExtendRule>(node);
621
+ std::cerr << ind << "ExtendRule " << block;
385
622
  std::cerr << " (" << pstate_source_position(node) << ")";
386
623
  std::cerr << " " << block->tabs() << std::endl;
387
624
  debug_ast(block->selector(), ind + "-> ", env);
388
625
  } else if (Cast<Content>(node)) {
389
- Content_Ptr block = Cast<Content>(node);
626
+ Content* block = Cast<Content>(node);
390
627
  std::cerr << ind << "Content " << block;
391
628
  std::cerr << " (" << pstate_source_position(node) << ")";
392
- std::cerr << " [@media:" << block->media_block() << "]";
393
629
  std::cerr << " " << block->tabs() << std::endl;
630
+ debug_ast(block->arguments(), ind + " args: ", env);
394
631
  } else if (Cast<Import_Stub>(node)) {
395
- Import_Stub_Ptr block = Cast<Import_Stub>(node);
632
+ Import_Stub* block = Cast<Import_Stub>(node);
396
633
  std::cerr << ind << "Import_Stub " << block;
397
634
  std::cerr << " (" << pstate_source_position(node) << ")";
398
635
  std::cerr << " [" << block->imp_path() << "] ";
399
636
  std::cerr << " " << block->tabs() << std::endl;
400
637
  } else if (Cast<Import>(node)) {
401
- Import_Ptr block = Cast<Import>(node);
638
+ Import* block = Cast<Import>(node);
402
639
  std::cerr << ind << "Import " << block;
403
640
  std::cerr << " (" << pstate_source_position(node) << ")";
404
641
  std::cerr << " " << block->tabs() << std::endl;
405
- // std::vector<std::string> files_;
642
+ // sass::vector<sass::string> files_;
406
643
  for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
407
644
  debug_ast(block->import_queries(), ind + "@@ ");
408
645
  } else if (Cast<Assignment>(node)) {
409
- Assignment_Ptr block = Cast<Assignment>(node);
646
+ Assignment* block = Cast<Assignment>(node);
410
647
  std::cerr << ind << "Assignment " << block;
411
648
  std::cerr << " (" << pstate_source_position(node) << ")";
412
649
  std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
413
650
  debug_ast(block->value(), ind + "=", env);
414
651
  } else if (Cast<Declaration>(node)) {
415
- Declaration_Ptr block = Cast<Declaration>(node);
652
+ Declaration* block = Cast<Declaration>(node);
416
653
  std::cerr << ind << "Declaration " << block;
417
654
  std::cerr << " (" << pstate_source_position(node) << ")";
418
655
  std::cerr << " [is_custom_property: " << block->is_custom_property() << "] ";
@@ -421,40 +658,40 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
421
658
  debug_ast(block->value(), ind + " value: ", env);
422
659
  debug_ast(block->block(), ind + " ", env);
423
660
  } else if (Cast<Keyframe_Rule>(node)) {
424
- Keyframe_Rule_Ptr has_block = Cast<Keyframe_Rule>(node);
425
- std::cerr << ind << "Keyframe_Rule " << has_block;
661
+ Keyframe_Rule* ParentStatement = Cast<Keyframe_Rule>(node);
662
+ std::cerr << ind << "Keyframe_Rule " << ParentStatement;
426
663
  std::cerr << " (" << pstate_source_position(node) << ")";
427
- std::cerr << " " << has_block->tabs() << std::endl;
428
- if (has_block->name()) debug_ast(has_block->name(), ind + "@");
429
- if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
430
- } else if (Cast<Directive>(node)) {
431
- Directive_Ptr block = Cast<Directive>(node);
432
- std::cerr << ind << "Directive " << block;
664
+ std::cerr << " " << ParentStatement->tabs() << std::endl;
665
+ if (ParentStatement->name()) debug_ast(ParentStatement->name(), ind + "@");
666
+ if (ParentStatement->block()) for(const Statement_Obj& i : ParentStatement->block()->elements()) { debug_ast(i, ind + " ", env); }
667
+ } else if (Cast<AtRule>(node)) {
668
+ AtRule* block = Cast<AtRule>(node);
669
+ std::cerr << ind << "AtRule " << block;
433
670
  std::cerr << " (" << pstate_source_position(node) << ")";
434
671
  std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
435
672
  debug_ast(block->selector(), ind + "~", env);
436
673
  debug_ast(block->value(), ind + "+", env);
437
674
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
438
- } else if (Cast<Each>(node)) {
439
- Each_Ptr block = Cast<Each>(node);
440
- std::cerr << ind << "Each " << block;
675
+ } else if (Cast<EachRule>(node)) {
676
+ EachRule* block = Cast<EachRule>(node);
677
+ std::cerr << ind << "EachRule " << block;
441
678
  std::cerr << " (" << pstate_source_position(node) << ")";
442
679
  std::cerr << " " << block->tabs() << std::endl;
443
680
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
444
- } else if (Cast<For>(node)) {
445
- For_Ptr block = Cast<For>(node);
446
- std::cerr << ind << "For " << block;
681
+ } else if (Cast<ForRule>(node)) {
682
+ ForRule* block = Cast<ForRule>(node);
683
+ std::cerr << ind << "ForRule " << block;
447
684
  std::cerr << " (" << pstate_source_position(node) << ")";
448
685
  std::cerr << " " << block->tabs() << std::endl;
449
686
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
450
- } else if (Cast<While>(node)) {
451
- While_Ptr block = Cast<While>(node);
452
- std::cerr << ind << "While " << block;
687
+ } else if (Cast<WhileRule>(node)) {
688
+ WhileRule* block = Cast<WhileRule>(node);
689
+ std::cerr << ind << "WhileRule " << block;
453
690
  std::cerr << " (" << pstate_source_position(node) << ")";
454
691
  std::cerr << " " << block->tabs() << std::endl;
455
692
  if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
456
693
  } else if (Cast<Definition>(node)) {
457
- Definition_Ptr block = Cast<Definition>(node);
694
+ Definition* block = Cast<Definition>(node);
458
695
  std::cerr << ind << "Definition " << block;
459
696
  std::cerr << " (" << pstate_source_position(node) << ")";
460
697
  std::cerr << " [name: " << block->name() << "] ";
@@ -466,15 +703,16 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
466
703
  debug_ast(block->parameters(), ind + " params: ", env);
467
704
  if (block->block()) debug_ast(block->block(), ind + " ", env);
468
705
  } else if (Cast<Mixin_Call>(node)) {
469
- Mixin_Call_Ptr block = Cast<Mixin_Call>(node);
706
+ Mixin_Call* block = Cast<Mixin_Call>(node);
470
707
  std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
471
708
  std::cerr << " (" << pstate_source_position(block) << ")";
472
709
  std::cerr << " [" << block->name() << "]";
473
710
  std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
474
- debug_ast(block->arguments(), ind + " args: ");
711
+ debug_ast(block->arguments(), ind + " args: ", env);
712
+ debug_ast(block->block_parameters(), ind + " block_params: ", env);
475
713
  if (block->block()) debug_ast(block->block(), ind + " ", env);
476
- } else if (Ruleset_Ptr ruleset = Cast<Ruleset>(node)) {
477
- std::cerr << ind << "Ruleset " << ruleset;
714
+ } else if (StyleRule* ruleset = Cast<StyleRule>(node)) {
715
+ std::cerr << ind << "StyleRule " << ruleset;
478
716
  std::cerr << " (" << pstate_source_position(node) << ")";
479
717
  std::cerr << " [indent: " << ruleset->tabs() << "]";
480
718
  std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
@@ -483,30 +721,22 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
483
721
  debug_ast(ruleset->selector(), ind + ">");
484
722
  debug_ast(ruleset->block(), ind + " ");
485
723
  } else if (Cast<Block>(node)) {
486
- Block_Ptr block = Cast<Block>(node);
724
+ Block* block = Cast<Block>(node);
487
725
  std::cerr << ind << "Block " << block;
488
726
  std::cerr << " (" << pstate_source_position(node) << ")";
489
727
  std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
490
728
  std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
491
729
  for(const Statement_Obj& i : block->elements()) { debug_ast(i, ind + " ", env); }
492
730
  } else if (Cast<Variable>(node)) {
493
- Variable_Ptr expression = Cast<Variable>(node);
731
+ Variable* expression = Cast<Variable>(node);
494
732
  std::cerr << ind << "Variable " << expression;
495
733
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
496
734
  std::cerr << " (" << pstate_source_position(node) << ")";
497
735
  std::cerr << " [" << expression->name() << "]" << std::endl;
498
- std::string name(expression->name());
736
+ sass::string name(expression->name());
499
737
  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
738
  } else if (Cast<Function_Call>(node)) {
509
- Function_Call_Ptr expression = Cast<Function_Call>(node);
739
+ Function_Call* expression = Cast<Function_Call>(node);
510
740
  std::cerr << ind << "Function_Call " << expression;
511
741
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
512
742
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -518,14 +748,14 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
518
748
  debug_ast(expression->arguments(), ind + " args: ", env);
519
749
  debug_ast(expression->func(), ind + " func: ", env);
520
750
  } else if (Cast<Function>(node)) {
521
- Function_Ptr expression = Cast<Function>(node);
751
+ Function* expression = Cast<Function>(node);
522
752
  std::cerr << ind << "Function " << expression;
523
753
  std::cerr << " (" << pstate_source_position(node) << ")";
524
754
  if (expression->is_css()) std::cerr << " [css]";
525
755
  std::cerr << std::endl;
526
756
  debug_ast(expression->definition(), ind + " definition: ", env);
527
757
  } else if (Cast<Arguments>(node)) {
528
- Arguments_Ptr expression = Cast<Arguments>(node);
758
+ Arguments* expression = Cast<Arguments>(node);
529
759
  std::cerr << ind << "Arguments " << expression;
530
760
  if (expression->is_delayed()) std::cerr << " [delayed]";
531
761
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -535,7 +765,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
535
765
  std::cerr << std::endl;
536
766
  for(const Argument_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
537
767
  } else if (Cast<Argument>(node)) {
538
- Argument_Ptr expression = Cast<Argument>(node);
768
+ Argument* expression = Cast<Argument>(node);
539
769
  std::cerr << ind << "Argument " << expression;
540
770
  std::cerr << " (" << pstate_source_position(node) << ")";
541
771
  std::cerr << " [" << expression->value().ptr() << "]";
@@ -544,7 +774,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
544
774
  std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
545
775
  debug_ast(expression->value(), ind + " value: ", env);
546
776
  } else if (Cast<Parameters>(node)) {
547
- Parameters_Ptr expression = Cast<Parameters>(node);
777
+ Parameters* expression = Cast<Parameters>(node);
548
778
  std::cerr << ind << "Parameters " << expression;
549
779
  std::cerr << " (" << pstate_source_position(node) << ")";
550
780
  std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
@@ -552,14 +782,14 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
552
782
  std::cerr << std::endl;
553
783
  for(const Parameter_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
554
784
  } else if (Cast<Parameter>(node)) {
555
- Parameter_Ptr expression = Cast<Parameter>(node);
785
+ Parameter* expression = Cast<Parameter>(node);
556
786
  std::cerr << ind << "Parameter " << expression;
557
787
  std::cerr << " (" << pstate_source_position(node) << ")";
558
788
  std::cerr << " [name: " << expression->name() << "] ";
559
789
  std::cerr << " [default: " << expression->default_value().ptr() << "] ";
560
790
  std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
561
791
  } else if (Cast<Unary_Expression>(node)) {
562
- Unary_Expression_Ptr expression = Cast<Unary_Expression>(node);
792
+ Unary_Expression* expression = Cast<Unary_Expression>(node);
563
793
  std::cerr << ind << "Unary_Expression " << expression;
564
794
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
565
795
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
@@ -567,7 +797,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
567
797
  std::cerr << " [" << expression->type() << "]" << std::endl;
568
798
  debug_ast(expression->operand(), ind + " operand: ", env);
569
799
  } else if (Cast<Binary_Expression>(node)) {
570
- Binary_Expression_Ptr expression = Cast<Binary_Expression>(node);
800
+ Binary_Expression* expression = Cast<Binary_Expression>(node);
571
801
  std::cerr << ind << "Binary_Expression " << expression;
572
802
  if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
573
803
  if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
@@ -580,7 +810,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
580
810
  debug_ast(expression->left(), ind + " left: ", env);
581
811
  debug_ast(expression->right(), ind + " right: ", env);
582
812
  } else if (Cast<Map>(node)) {
583
- Map_Ptr expression = Cast<Map>(node);
813
+ Map* expression = Cast<Map>(node);
584
814
  std::cerr << ind << "Map " << expression;
585
815
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
586
816
  std::cerr << " (" << pstate_source_position(node) << ")";
@@ -590,7 +820,7 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
590
820
  debug_ast(i.second, ind + " val: ");
591
821
  }
592
822
  } else if (Cast<List>(node)) {
593
- List_Ptr expression = Cast<List>(node);
823
+ List* expression = Cast<List>(node);
594
824
  std::cerr << ind << "List " << expression;
595
825
  std::cerr << " (" << pstate_source_position(node) << ")";
596
826
  std::cerr << " (" << expression->length() << ") " <<
@@ -604,51 +834,55 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
604
834
  " [hash: " << expression->hash() << "] " <<
605
835
  std::endl;
606
836
  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
837
  } else if (Cast<Boolean>(node)) {
614
- Boolean_Ptr expression = Cast<Boolean>(node);
838
+ Boolean* expression = Cast<Boolean>(node);
615
839
  std::cerr << ind << "Boolean " << expression;
616
840
  std::cerr << " (" << pstate_source_position(node) << ")";
617
841
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
618
842
  std::cerr << " [" << expression->value() << "]" << std::endl;
619
- } else if (Cast<Color>(node)) {
620
- Color_Ptr expression = Cast<Color>(node);
843
+ } else if (Cast<Color_RGBA>(node)) {
844
+ Color_RGBA* expression = Cast<Color_RGBA>(node);
621
845
  std::cerr << ind << "Color " << expression;
622
846
  std::cerr << " (" << pstate_source_position(node) << ")";
847
+ std::cerr << " [name: " << expression->disp() << "] ";
623
848
  std::cerr << " [delayed: " << expression->is_delayed() << "] ";
624
849
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
625
- std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
850
+ std::cerr << " rgba[" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
851
+ } else if (Cast<Color_HSLA>(node)) {
852
+ Color_HSLA* expression = Cast<Color_HSLA>(node);
853
+ std::cerr << ind << "Color " << expression;
854
+ std::cerr << " (" << pstate_source_position(node) << ")";
855
+ std::cerr << " [name: " << expression->disp() << "] ";
856
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
857
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
858
+ std::cerr << " hsla[" << expression->h() << ":" << expression->s() << ":" << expression->l() << "@" << expression->a() << "]" << std::endl;
626
859
  } else if (Cast<Number>(node)) {
627
- Number_Ptr expression = Cast<Number>(node);
860
+ Number* expression = Cast<Number>(node);
628
861
  std::cerr << ind << "Number " << expression;
629
862
  std::cerr << " (" << pstate_source_position(node) << ")";
863
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
630
864
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
631
865
  std::cerr << " [" << expression->value() << expression->unit() << "]" <<
632
866
  " [hash: " << expression->hash() << "] " <<
633
867
  std::endl;
634
868
  } else if (Cast<Null>(node)) {
635
- Null_Ptr expression = Cast<Null>(node);
869
+ Null* expression = Cast<Null>(node);
636
870
  std::cerr << ind << "Null " << expression;
637
871
  std::cerr << " (" << pstate_source_position(node) << ")";
638
872
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] "
639
873
  // " [hash: " << expression->hash() << "] "
640
874
  << std::endl;
641
875
  } else if (Cast<String_Quoted>(node)) {
642
- String_Quoted_Ptr expression = Cast<String_Quoted>(node);
876
+ String_Quoted* expression = Cast<String_Quoted>(node);
643
877
  std::cerr << ind << "String_Quoted " << expression;
644
878
  std::cerr << " (" << pstate_source_position(node) << ")";
645
879
  std::cerr << " [" << prettyprint(expression->value()) << "]";
646
880
  if (expression->is_delayed()) std::cerr << " [delayed]";
647
881
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
648
882
  if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
649
- std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
883
+ std::cerr << std::endl;
650
884
  } else if (Cast<String_Constant>(node)) {
651
- String_Constant_Ptr expression = Cast<String_Constant>(node);
885
+ String_Constant* expression = Cast<String_Constant>(node);
652
886
  std::cerr << ind << "String_Constant " << expression;
653
887
  if (expression->concrete_type()) {
654
888
  std::cerr << " " << expression->concrete_type();
@@ -657,9 +891,9 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
657
891
  std::cerr << " [" << prettyprint(expression->value()) << "]";
658
892
  if (expression->is_delayed()) std::cerr << " [delayed]";
659
893
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
660
- std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
894
+ std::cerr << std::endl;
661
895
  } else if (Cast<String_Schema>(node)) {
662
- String_Schema_Ptr expression = Cast<String_Schema>(node);
896
+ String_Schema* expression = Cast<String_Schema>(node);
663
897
  std::cerr << ind << "String_Schema " << expression;
664
898
  std::cerr << " (" << pstate_source_position(expression) << ")";
665
899
  std::cerr << " " << expression->concrete_type();
@@ -670,45 +904,46 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
670
904
  if (expression->has_interpolant()) std::cerr << " [has interpolant]";
671
905
  if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
672
906
  if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
673
- std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
907
+ std::cerr << std::endl;
674
908
  for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
675
909
  } else if (Cast<String>(node)) {
676
- String_Ptr expression = Cast<String>(node);
910
+ String* expression = Cast<String>(node);
677
911
  std::cerr << ind << "String " << expression;
678
912
  std::cerr << " " << expression->concrete_type();
679
913
  std::cerr << " (" << pstate_source_position(node) << ")";
680
914
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
681
- std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
915
+ std::cerr << std::endl;
682
916
  } else if (Cast<Expression>(node)) {
683
- Expression_Ptr expression = Cast<Expression>(node);
917
+ Expression* expression = Cast<Expression>(node);
684
918
  std::cerr << ind << "Expression " << expression;
685
919
  std::cerr << " (" << pstate_source_position(node) << ")";
686
920
  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;
921
+ case Expression::Type::NONE: std::cerr << " [NONE]"; break;
922
+ case Expression::Type::BOOLEAN: std::cerr << " [BOOLEAN]"; break;
923
+ case Expression::Type::NUMBER: std::cerr << " [NUMBER]"; break;
924
+ case Expression::Type::COLOR: std::cerr << " [COLOR]"; break;
925
+ case Expression::Type::STRING: std::cerr << " [STRING]"; break;
926
+ case Expression::Type::LIST: std::cerr << " [LIST]"; break;
927
+ case Expression::Type::MAP: std::cerr << " [MAP]"; break;
928
+ case Expression::Type::SELECTOR: std::cerr << " [SELECTOR]"; break;
929
+ case Expression::Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
930
+ case Expression::Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
931
+ case Expression::Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
932
+ case Expression::Type::FUNCTION: std::cerr << " [FUNCTION]"; break;
933
+ case Expression::Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
934
+ case Expression::Type::VARIABLE: std::cerr << " [VARIABLE]"; break;
935
+ case Expression::Type::FUNCTION_VAL: std::cerr << " [FUNCTION_VAL]"; break;
936
+ case Expression::Type::PARENT: std::cerr << " [PARENT]"; break;
702
937
  }
703
938
  std::cerr << std::endl;
704
- } else if (Cast<Has_Block>(node)) {
705
- Has_Block_Ptr has_block = Cast<Has_Block>(node);
706
- std::cerr << ind << "Has_Block " << has_block;
939
+ } else if (Cast<ParentStatement>(node)) {
940
+ ParentStatement* parent = Cast<ParentStatement>(node);
941
+ std::cerr << ind << "ParentStatement " << parent;
707
942
  std::cerr << " (" << pstate_source_position(node) << ")";
708
- std::cerr << " " << has_block->tabs() << std::endl;
709
- if (has_block->block()) for(const Statement_Obj& i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
943
+ std::cerr << " " << parent->tabs() << std::endl;
944
+ if (parent->block()) for(const Statement_Obj& i : parent->block()->elements()) { debug_ast(i, ind + " ", env); }
710
945
  } else if (Cast<Statement>(node)) {
711
- Statement_Ptr statement = Cast<Statement>(node);
946
+ Statement* statement = Cast<Statement>(node);
712
947
  std::cerr << ind << "Statement " << statement;
713
948
  std::cerr << " (" << pstate_source_position(node) << ")";
714
949
  std::cerr << " " << statement->tabs() << std::endl;
@@ -717,84 +952,12 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
717
952
  if (ind == "") std::cerr << "####################################################################\n";
718
953
  }
719
954
 
720
- inline void debug_node(Node* node, std::string ind = "")
721
- {
722
- if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
723
- if (node->isCombinator()) {
724
- std::cerr << ind;
725
- std::cerr << "Combinator ";
726
- std::cerr << node << " ";
727
- if (node->got_line_feed) std::cerr << "[LF] ";
728
- switch (node->combinator()) {
729
- case Complex_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
730
- case Complex_Selector::PARENT_OF: std::cerr << "{>} "; break;
731
- case Complex_Selector::PRECEDES: std::cerr << "{~} "; break;
732
- case Complex_Selector::REFERENCE: std::cerr << "{@} "; break;
733
- case Complex_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
734
- }
735
- std::cerr << std::endl;
736
- // debug_ast(node->combinator(), ind + " ");
737
- } else if (node->isSelector()) {
738
- std::cerr << ind;
739
- std::cerr << "Selector ";
740
- std::cerr << node << " ";
741
- if (node->got_line_feed) std::cerr << "[LF] ";
742
- std::cerr << std::endl;
743
- debug_ast(node->selector(), ind + " ");
744
- } else if (node->isCollection()) {
745
- std::cerr << ind;
746
- std::cerr << "Collection ";
747
- std::cerr << node << " ";
748
- if (node->got_line_feed) std::cerr << "[LF] ";
749
- std::cerr << std::endl;
750
- for(auto n : (*node->collection())) {
751
- debug_node(&n, ind + " ");
752
- }
753
- } else if (node->isNil()) {
754
- std::cerr << ind;
755
- std::cerr << "Nil ";
756
- std::cerr << node << " ";
757
- if (node->got_line_feed) std::cerr << "[LF] ";
758
- std::cerr << std::endl;
759
- } else {
760
- std::cerr << ind;
761
- std::cerr << "OTHER ";
762
- std::cerr << node << " ";
763
- if (node->got_line_feed) std::cerr << "[LF] ";
764
- std::cerr << std::endl;
765
- }
766
- if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
767
- }
768
955
 
769
956
  /*
770
- inline void debug_ast(const AST_Node_Ptr node, std::string ind = "", Env* env = 0)
957
+ inline void debug_ast(const AST_Node* node, sass::string ind = "", Env* env = 0)
771
958
  {
772
- debug_ast(const_cast<AST_Node_Ptr>(node), ind, env);
959
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
773
960
  }
774
961
  */
775
- inline void debug_node(const Node* node, std::string ind = "")
776
- {
777
- debug_node(const_cast<Node*>(node), ind);
778
- }
779
-
780
- inline void debug_subset_map(Sass::Subset_Map& map, std::string ind = "")
781
- {
782
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
783
- for(auto const &it : map.values()) {
784
- debug_ast(it.first, ind + "first: ");
785
- debug_ast(it.second, ind + "second: ");
786
- }
787
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
788
- }
789
-
790
- inline void debug_subset_entries(SubSetMapPairs* entries, std::string ind = "")
791
- {
792
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
793
- for(auto const &pair : *entries) {
794
- debug_ast(pair.first, ind + "first: ");
795
- debug_ast(pair.second, ind + "second: ");
796
- }
797
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
798
- }
799
962
 
800
963
  #endif // SASS_DEBUGGER