sassc 2.0.0 → 2.4.0

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