precompiled-sassc 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 (214) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/cibuildgem.yaml +67 -0
  3. data/.gitignore +18 -0
  4. data/.gitmodules +3 -0
  5. data/.travis.yml +16 -0
  6. data/CHANGELOG.md +97 -0
  7. data/CODE_OF_CONDUCT.md +10 -0
  8. data/Gemfile +2 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +80 -0
  11. data/Rakefile +51 -0
  12. data/ext/depend +4 -0
  13. data/ext/extconf.rb +92 -0
  14. data/ext/libsass/VERSION +1 -0
  15. data/ext/libsass/contrib/plugin.cpp +60 -0
  16. data/ext/libsass/include/sass/base.h +97 -0
  17. data/ext/libsass/include/sass/context.h +174 -0
  18. data/ext/libsass/include/sass/functions.h +139 -0
  19. data/ext/libsass/include/sass/values.h +145 -0
  20. data/ext/libsass/include/sass/version.h +12 -0
  21. data/ext/libsass/include/sass.h +15 -0
  22. data/ext/libsass/include/sass2scss.h +120 -0
  23. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  24. data/ext/libsass/src/ast.cpp +953 -0
  25. data/ext/libsass/src/ast.hpp +1064 -0
  26. data/ext/libsass/src/ast2c.cpp +80 -0
  27. data/ext/libsass/src/ast2c.hpp +39 -0
  28. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  29. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  30. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  31. data/ext/libsass/src/ast_helpers.hpp +292 -0
  32. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  33. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  34. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  35. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  36. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  37. data/ext/libsass/src/ast_selectors.hpp +522 -0
  38. data/ext/libsass/src/ast_supports.cpp +114 -0
  39. data/ext/libsass/src/ast_supports.hpp +121 -0
  40. data/ext/libsass/src/ast_values.cpp +1154 -0
  41. data/ext/libsass/src/ast_values.hpp +498 -0
  42. data/ext/libsass/src/b64/cencode.h +32 -0
  43. data/ext/libsass/src/b64/encode.h +79 -0
  44. data/ext/libsass/src/backtrace.cpp +50 -0
  45. data/ext/libsass/src/backtrace.hpp +29 -0
  46. data/ext/libsass/src/base64vlq.cpp +47 -0
  47. data/ext/libsass/src/base64vlq.hpp +30 -0
  48. data/ext/libsass/src/bind.cpp +312 -0
  49. data/ext/libsass/src/bind.hpp +15 -0
  50. data/ext/libsass/src/c2ast.cpp +64 -0
  51. data/ext/libsass/src/c2ast.hpp +14 -0
  52. data/ext/libsass/src/c99func.c +54 -0
  53. data/ext/libsass/src/cencode.c +106 -0
  54. data/ext/libsass/src/check_nesting.cpp +393 -0
  55. data/ext/libsass/src/check_nesting.hpp +70 -0
  56. data/ext/libsass/src/color_maps.cpp +652 -0
  57. data/ext/libsass/src/color_maps.hpp +323 -0
  58. data/ext/libsass/src/constants.cpp +199 -0
  59. data/ext/libsass/src/constants.hpp +200 -0
  60. data/ext/libsass/src/context.cpp +863 -0
  61. data/ext/libsass/src/context.hpp +140 -0
  62. data/ext/libsass/src/cssize.cpp +521 -0
  63. data/ext/libsass/src/cssize.hpp +71 -0
  64. data/ext/libsass/src/dart_helpers.hpp +199 -0
  65. data/ext/libsass/src/debug.hpp +43 -0
  66. data/ext/libsass/src/debugger.hpp +963 -0
  67. data/ext/libsass/src/emitter.cpp +297 -0
  68. data/ext/libsass/src/emitter.hpp +101 -0
  69. data/ext/libsass/src/environment.cpp +260 -0
  70. data/ext/libsass/src/environment.hpp +124 -0
  71. data/ext/libsass/src/error_handling.cpp +233 -0
  72. data/ext/libsass/src/error_handling.hpp +239 -0
  73. data/ext/libsass/src/eval.cpp +1543 -0
  74. data/ext/libsass/src/eval.hpp +110 -0
  75. data/ext/libsass/src/eval_selectors.cpp +75 -0
  76. data/ext/libsass/src/expand.cpp +875 -0
  77. data/ext/libsass/src/expand.hpp +98 -0
  78. data/ext/libsass/src/extender.cpp +1188 -0
  79. data/ext/libsass/src/extender.hpp +399 -0
  80. data/ext/libsass/src/extension.cpp +43 -0
  81. data/ext/libsass/src/extension.hpp +89 -0
  82. data/ext/libsass/src/file.cpp +531 -0
  83. data/ext/libsass/src/file.hpp +124 -0
  84. data/ext/libsass/src/fn_colors.cpp +596 -0
  85. data/ext/libsass/src/fn_colors.hpp +85 -0
  86. data/ext/libsass/src/fn_lists.cpp +285 -0
  87. data/ext/libsass/src/fn_lists.hpp +34 -0
  88. data/ext/libsass/src/fn_maps.cpp +94 -0
  89. data/ext/libsass/src/fn_maps.hpp +30 -0
  90. data/ext/libsass/src/fn_miscs.cpp +244 -0
  91. data/ext/libsass/src/fn_miscs.hpp +40 -0
  92. data/ext/libsass/src/fn_numbers.cpp +227 -0
  93. data/ext/libsass/src/fn_numbers.hpp +45 -0
  94. data/ext/libsass/src/fn_selectors.cpp +205 -0
  95. data/ext/libsass/src/fn_selectors.hpp +35 -0
  96. data/ext/libsass/src/fn_strings.cpp +268 -0
  97. data/ext/libsass/src/fn_strings.hpp +34 -0
  98. data/ext/libsass/src/fn_utils.cpp +158 -0
  99. data/ext/libsass/src/fn_utils.hpp +62 -0
  100. data/ext/libsass/src/inspect.cpp +1125 -0
  101. data/ext/libsass/src/inspect.hpp +101 -0
  102. data/ext/libsass/src/json.cpp +1436 -0
  103. data/ext/libsass/src/json.hpp +117 -0
  104. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  105. data/ext/libsass/src/lexer.cpp +122 -0
  106. data/ext/libsass/src/lexer.hpp +304 -0
  107. data/ext/libsass/src/listize.cpp +70 -0
  108. data/ext/libsass/src/listize.hpp +37 -0
  109. data/ext/libsass/src/mapping.hpp +19 -0
  110. data/ext/libsass/src/memory/allocator.cpp +48 -0
  111. data/ext/libsass/src/memory/allocator.hpp +138 -0
  112. data/ext/libsass/src/memory/config.hpp +20 -0
  113. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  114. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  115. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  116. data/ext/libsass/src/memory.hpp +12 -0
  117. data/ext/libsass/src/operation.hpp +223 -0
  118. data/ext/libsass/src/operators.cpp +267 -0
  119. data/ext/libsass/src/operators.hpp +30 -0
  120. data/ext/libsass/src/ordered_map.hpp +112 -0
  121. data/ext/libsass/src/output.cpp +320 -0
  122. data/ext/libsass/src/output.hpp +47 -0
  123. data/ext/libsass/src/parser.cpp +2965 -0
  124. data/ext/libsass/src/parser.hpp +394 -0
  125. data/ext/libsass/src/parser_selectors.cpp +189 -0
  126. data/ext/libsass/src/permutate.hpp +164 -0
  127. data/ext/libsass/src/plugins.cpp +188 -0
  128. data/ext/libsass/src/plugins.hpp +57 -0
  129. data/ext/libsass/src/position.cpp +165 -0
  130. data/ext/libsass/src/position.hpp +147 -0
  131. data/ext/libsass/src/prelexer.cpp +1780 -0
  132. data/ext/libsass/src/prelexer.hpp +484 -0
  133. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  134. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  135. data/ext/libsass/src/sass.cpp +156 -0
  136. data/ext/libsass/src/sass.hpp +147 -0
  137. data/ext/libsass/src/sass2scss.cpp +895 -0
  138. data/ext/libsass/src/sass_context.cpp +741 -0
  139. data/ext/libsass/src/sass_context.hpp +129 -0
  140. data/ext/libsass/src/sass_functions.cpp +210 -0
  141. data/ext/libsass/src/sass_functions.hpp +50 -0
  142. data/ext/libsass/src/sass_values.cpp +362 -0
  143. data/ext/libsass/src/sass_values.hpp +82 -0
  144. data/ext/libsass/src/settings.hpp +19 -0
  145. data/ext/libsass/src/source.cpp +69 -0
  146. data/ext/libsass/src/source.hpp +95 -0
  147. data/ext/libsass/src/source_data.hpp +32 -0
  148. data/ext/libsass/src/source_map.cpp +202 -0
  149. data/ext/libsass/src/source_map.hpp +65 -0
  150. data/ext/libsass/src/stylesheet.cpp +22 -0
  151. data/ext/libsass/src/stylesheet.hpp +57 -0
  152. data/ext/libsass/src/to_value.cpp +114 -0
  153. data/ext/libsass/src/to_value.hpp +46 -0
  154. data/ext/libsass/src/units.cpp +507 -0
  155. data/ext/libsass/src/units.hpp +110 -0
  156. data/ext/libsass/src/utf8/checked.h +336 -0
  157. data/ext/libsass/src/utf8/core.h +332 -0
  158. data/ext/libsass/src/utf8/unchecked.h +235 -0
  159. data/ext/libsass/src/utf8.h +34 -0
  160. data/ext/libsass/src/utf8_string.cpp +104 -0
  161. data/ext/libsass/src/utf8_string.hpp +38 -0
  162. data/ext/libsass/src/util.cpp +723 -0
  163. data/ext/libsass/src/util.hpp +105 -0
  164. data/ext/libsass/src/util_string.cpp +125 -0
  165. data/ext/libsass/src/util_string.hpp +73 -0
  166. data/ext/libsass/src/values.cpp +140 -0
  167. data/ext/libsass/src/values.hpp +12 -0
  168. data/lib/sassc/dependency.rb +17 -0
  169. data/lib/sassc/engine.rb +141 -0
  170. data/lib/sassc/error.rb +37 -0
  171. data/lib/sassc/functions_handler.rb +73 -0
  172. data/lib/sassc/import_handler.rb +50 -0
  173. data/lib/sassc/importer.rb +31 -0
  174. data/lib/sassc/native/native_context_api.rb +147 -0
  175. data/lib/sassc/native/native_functions_api.rb +159 -0
  176. data/lib/sassc/native/sass2scss_api.rb +10 -0
  177. data/lib/sassc/native/sass_input_style.rb +13 -0
  178. data/lib/sassc/native/sass_output_style.rb +12 -0
  179. data/lib/sassc/native/sass_value.rb +97 -0
  180. data/lib/sassc/native/string_list.rb +10 -0
  181. data/lib/sassc/native.rb +65 -0
  182. data/lib/sassc/sass_2_scss.rb +9 -0
  183. data/lib/sassc/script/functions.rb +8 -0
  184. data/lib/sassc/script/value/bool.rb +32 -0
  185. data/lib/sassc/script/value/color.rb +95 -0
  186. data/lib/sassc/script/value/list.rb +136 -0
  187. data/lib/sassc/script/value/map.rb +69 -0
  188. data/lib/sassc/script/value/number.rb +389 -0
  189. data/lib/sassc/script/value/string.rb +96 -0
  190. data/lib/sassc/script/value.rb +137 -0
  191. data/lib/sassc/script/value_conversion/base.rb +13 -0
  192. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  193. data/lib/sassc/script/value_conversion/color.rb +18 -0
  194. data/lib/sassc/script/value_conversion/list.rb +25 -0
  195. data/lib/sassc/script/value_conversion/map.rb +21 -0
  196. data/lib/sassc/script/value_conversion/number.rb +13 -0
  197. data/lib/sassc/script/value_conversion/string.rb +17 -0
  198. data/lib/sassc/script/value_conversion.rb +69 -0
  199. data/lib/sassc/script.rb +17 -0
  200. data/lib/sassc/util/normalized_map.rb +117 -0
  201. data/lib/sassc/util.rb +231 -0
  202. data/lib/sassc/version.rb +5 -0
  203. data/lib/sassc.rb +57 -0
  204. data/sassc.gemspec +69 -0
  205. data/test/custom_importer_test.rb +127 -0
  206. data/test/engine_test.rb +314 -0
  207. data/test/error_test.rb +29 -0
  208. data/test/fixtures/paths.scss +10 -0
  209. data/test/functions_test.rb +340 -0
  210. data/test/native_test.rb +213 -0
  211. data/test/output_style_test.rb +107 -0
  212. data/test/sass_2_scss_test.rb +14 -0
  213. data/test/test_helper.rb +45 -0
  214. metadata +391 -0
@@ -0,0 +1,963 @@
1
+ #ifndef SASS_DEBUGGER_H
2
+ #define SASS_DEBUGGER_H
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>
10
+ #include <string>
11
+ #include <sstream>
12
+ #include "ast.hpp"
13
+ #include "ast_fwd_decl.hpp"
14
+ #include "extension.hpp"
15
+
16
+ #include "ordered_map.hpp"
17
+
18
+ using namespace Sass;
19
+
20
+ inline void debug_ast(AST_Node* node, sass::string ind = "", Env* env = 0);
21
+
22
+ inline sass::string debug_vec(const AST_Node* node) {
23
+ if (node == NULL) return "null";
24
+ else return node->to_string();
25
+ }
26
+
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]);
82
+ }
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);
280
+ }
281
+
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)
287
+ {
288
+ size_t pos = 0;
289
+ while((pos = str.find(oldStr, pos)) != sass::string::npos)
290
+ {
291
+ str.replace(pos, oldStr.length(), newStr);
292
+ pos += newStr.length();
293
+ }
294
+ return str;
295
+ }
296
+
297
+ inline sass::string prettyprint(const sass::string& str) {
298
+ sass::string clean = str_replace(str, "\n", "\\n");
299
+ clean = str_replace(clean, " ", "\\t");
300
+ clean = str_replace(clean, "\r", "\\r");
301
+ return clean;
302
+ }
303
+
304
+ inline sass::string longToHex(long long t) {
305
+ sass::sstream is;
306
+ is << std::hex << t;
307
+ return is.str();
308
+ }
309
+
310
+ inline sass::string pstate_source_position(AST_Node* node)
311
+ {
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)
317
+ << "@[" << start.line << ":" << start.column << "]"
318
+ << "-[" << end.line << ":" << end.column << "]";
319
+ #ifdef DEBUG_SHARED_PTR
320
+ str << "x" << node->getRefCount() << ""
321
+ << " " << node->getDbgFile()
322
+ << "@" << node->getDbgLine();
323
+ #endif
324
+ return str.str();
325
+ }
326
+
327
+ inline void debug_ast(AST_Node* node, sass::string ind, Env* env)
328
+ {
329
+ if (node == 0) return;
330
+ if (ind == "") std::cerr << "####################################################################\n";
331
+ if (Cast<Bubble>(node)) {
332
+ Bubble* bubble = Cast<Bubble>(node);
333
+ std::cerr << ind << "Bubble " << bubble;
334
+ std::cerr << " (" << pstate_source_position(node) << ")";
335
+ std::cerr << " " << bubble->tabs();
336
+ std::cerr << std::endl;
337
+ debug_ast(bubble->node(), ind + " ", env);
338
+ } else if (Cast<Trace>(node)) {
339
+ Trace* trace = Cast<Trace>(node);
340
+ std::cerr << ind << "Trace " << trace;
341
+ std::cerr << " (" << pstate_source_position(node) << ")"
342
+ << " [name:" << trace->name() << ", type: " << trace->type() << "]"
343
+ << std::endl;
344
+ debug_ast(trace->block(), ind + " ", env);
345
+ } else if (Cast<AtRootRule>(node)) {
346
+ AtRootRule* root_block = Cast<AtRootRule>(node);
347
+ std::cerr << ind << "AtRootRule " << root_block;
348
+ std::cerr << " (" << pstate_source_position(node) << ")";
349
+ std::cerr << " " << root_block->tabs();
350
+ std::cerr << std::endl;
351
+ debug_ast(root_block->expression(), ind + ":", env);
352
+ debug_ast(root_block->block(), ind + " ", env);
353
+ } else if (Cast<SelectorList>(node)) {
354
+ SelectorList* selector = Cast<SelectorList>(node);
355
+ std::cerr << ind << "SelectorList " << selector;
356
+ std::cerr << " (" << pstate_source_position(node) << ")";
357
+ std::cerr << " <" << selector->hash() << ">";
358
+ std::cerr << (selector->is_invisible() ? " [is_invisible]" : " -");
359
+ std::cerr << (selector->isInvisible() ? " [isInvisible]" : " -");
360
+ std::cerr << (selector->has_real_parent_ref() ? " [real-parent]": " -");
361
+ std::cerr << std::endl;
362
+
363
+ for(const ComplexSelector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
364
+
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]" : " -")
376
+
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); }
386
+
387
+ } else if (Cast<SelectorCombinator>(node)) {
388
+ SelectorCombinator* selector = Cast<SelectorCombinator>(node);
389
+ std::cerr << ind << "SelectorCombinator " << selector
390
+ << " (" << pstate_source_position(node) << ")"
391
+ << " <" << selector->hash() << ">"
392
+ << " [weight:" << longToHex(selector->specificity()) << "]"
393
+ << (selector->has_real_parent_ref() ? " [real parent]": " -")
394
+ << " -- ";
395
+
396
+ sass::string del;
397
+ switch (selector->combinator()) {
398
+ case SelectorCombinator::CHILD: del = ">"; break;
399
+ case SelectorCombinator::GENERAL: del = "~"; break;
400
+ case SelectorCombinator::ADJACENT: del = "+"; break;
401
+ }
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;
408
+ std::cerr << " (" << pstate_source_position(node) << ")";
409
+ std::cerr << " <" << selector->hash() << ">";
410
+ std::cerr << (selector->hasRealParent() ? " [REAL PARENT]" : "") << ">";
411
+ std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
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;
421
+ std::cerr << " (" << pstate_source_position(node) << ")";
422
+ std::cerr << " <" << selector->hash() << ">";
423
+ std::cerr << std::endl;
424
+
425
+ } else if (Cast<PseudoSelector>(node)) {
426
+ PseudoSelector* selector = Cast<PseudoSelector>(node);
427
+ std::cerr << ind << "PseudoSelector " << selector;
428
+ std::cerr << " (" << pstate_source_position(node) << ")";
429
+ std::cerr << " <" << selector->hash() << ">";
430
+ std::cerr << " <<" << selector->ns_name() << ">>";
431
+ std::cerr << (selector->isClass() ? " [isClass]": " -");
432
+ std::cerr << (selector->isSyntacticClass() ? " [isSyntacticClass]": " -");
433
+ std::cerr << std::endl;
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;
439
+ std::cerr << " (" << pstate_source_position(node) << ")";
440
+ std::cerr << " <" << selector->hash() << ">";
441
+ std::cerr << " <<" << selector->ns_name() << ">>";
442
+ std::cerr << std::endl;
443
+ debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
444
+ } else if (Cast<ClassSelector>(node)) {
445
+ ClassSelector* selector = Cast<ClassSelector>(node);
446
+ std::cerr << ind << "ClassSelector " << selector;
447
+ std::cerr << " (" << pstate_source_position(node) << ")";
448
+ std::cerr << " <" << selector->hash() << ">";
449
+ std::cerr << " <<" << selector->ns_name() << ">>";
450
+ std::cerr << std::endl;
451
+ } else if (Cast<IDSelector>(node)) {
452
+ IDSelector* selector = Cast<IDSelector>(node);
453
+ std::cerr << ind << "IDSelector " << selector;
454
+ std::cerr << " (" << pstate_source_position(node) << ")";
455
+ std::cerr << " <" << selector->hash() << ">";
456
+ std::cerr << " <<" << selector->ns_name() << ">>";
457
+ std::cerr << std::endl;
458
+ } else if (Cast<TypeSelector>(node)) {
459
+ TypeSelector* selector = Cast<TypeSelector>(node);
460
+ std::cerr << ind << "TypeSelector " << selector;
461
+ std::cerr << " (" << pstate_source_position(node) << ")";
462
+ std::cerr << " <" << selector->hash() << ">";
463
+ std::cerr << " <<" << selector->ns_name() << ">>";
464
+ std::cerr << std::endl;
465
+ } else if (Cast<PlaceholderSelector>(node)) {
466
+
467
+ PlaceholderSelector* selector = Cast<PlaceholderSelector>(node);
468
+ std::cerr << ind << "PlaceholderSelector [" << selector->ns_name() << "] " << selector;
469
+ std::cerr << " (" << pstate_source_position(selector) << ")"
470
+ << " <" << selector->hash() << ">"
471
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
472
+ << std::endl;
473
+
474
+ } else if (Cast<SimpleSelector>(node)) {
475
+ SimpleSelector* selector = Cast<SimpleSelector>(node);
476
+ std::cerr << ind << "SimpleSelector " << selector;
477
+ std::cerr << " (" << pstate_source_position(node) << ")";
478
+
479
+ } else if (Cast<Selector_Schema>(node)) {
480
+ Selector_Schema* selector = Cast<Selector_Schema>(node);
481
+ std::cerr << ind << "Selector_Schema " << selector;
482
+ std::cerr << " (" << pstate_source_position(node) << ")"
483
+ << (selector->connect_parent() ? " [connect-parent]": " -")
484
+ << std::endl;
485
+
486
+ debug_ast(selector->contents(), ind + " ");
487
+ // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
488
+
489
+ } else if (Cast<Selector>(node)) {
490
+ Selector* selector = Cast<Selector>(node);
491
+ std::cerr << ind << "Selector " << selector;
492
+ std::cerr << " (" << pstate_source_position(node) << ")"
493
+ << std::endl;
494
+
495
+ } else if (Cast<Media_Query_Expression>(node)) {
496
+ Media_Query_Expression* block = Cast<Media_Query_Expression>(node);
497
+ std::cerr << ind << "Media_Query_Expression " << block;
498
+ std::cerr << " (" << pstate_source_position(node) << ")";
499
+ std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
500
+ << std::endl;
501
+ debug_ast(block->feature(), ind + " feature) ");
502
+ debug_ast(block->value(), ind + " value) ");
503
+
504
+ } else if (Cast<Media_Query>(node)) {
505
+ Media_Query* block = Cast<Media_Query>(node);
506
+ std::cerr << ind << "Media_Query " << block;
507
+ std::cerr << " (" << pstate_source_position(node) << ")";
508
+ std::cerr << (block->is_negated() ? " [is_negated]": " -")
509
+ << (block->is_restricted() ? " [is_restricted]": " -")
510
+ << std::endl;
511
+ debug_ast(block->media_type(), ind + " ");
512
+ for(const auto& i : block->elements()) { debug_ast(i, ind + " ", env); }
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;
543
+ std::cerr << " (" << pstate_source_position(node) << ")";
544
+ std::cerr << " " << block->tabs() << std::endl;
545
+ debug_ast(block->condition(), ind + " =@ ");
546
+ debug_ast(block->block(), ind + " <>");
547
+ } else if (Cast<SupportsOperation>(node)) {
548
+ SupportsOperation* block = Cast<SupportsOperation>(node);
549
+ std::cerr << ind << "SupportsOperation " << block;
550
+ std::cerr << " (" << pstate_source_position(node) << ")"
551
+ << std::endl;
552
+ debug_ast(block->left(), ind + " left) ");
553
+ debug_ast(block->right(), ind + " right) ");
554
+ } else if (Cast<SupportsNegation>(node)) {
555
+ SupportsNegation* block = Cast<SupportsNegation>(node);
556
+ std::cerr << ind << "SupportsNegation " << block;
557
+ std::cerr << " (" << pstate_source_position(node) << ")"
558
+ << std::endl;
559
+ debug_ast(block->condition(), ind + " condition) ");
560
+ } else if (Cast<At_Root_Query>(node)) {
561
+ At_Root_Query* block = Cast<At_Root_Query>(node);
562
+ std::cerr << ind << "At_Root_Query " << block;
563
+ std::cerr << " (" << pstate_source_position(node) << ")"
564
+ << std::endl;
565
+ debug_ast(block->feature(), ind + " feature) ");
566
+ debug_ast(block->value(), ind + " value) ");
567
+ } else if (Cast<SupportsDeclaration>(node)) {
568
+ SupportsDeclaration* block = Cast<SupportsDeclaration>(node);
569
+ std::cerr << ind << "SupportsDeclaration " << block;
570
+ std::cerr << " (" << pstate_source_position(node) << ")"
571
+ << std::endl;
572
+ debug_ast(block->feature(), ind + " feature) ");
573
+ debug_ast(block->value(), ind + " value) ");
574
+ } else if (Cast<Block>(node)) {
575
+ Block* root_block = Cast<Block>(node);
576
+ std::cerr << ind << "Block " << root_block;
577
+ std::cerr << " (" << pstate_source_position(node) << ")";
578
+ if (root_block->is_root()) std::cerr << " [root]";
579
+ if (root_block->isInvisible()) std::cerr << " [isInvisible]";
580
+ std::cerr << " " << root_block->tabs() << std::endl;
581
+ for(const Statement_Obj& i : root_block->elements()) { debug_ast(i, ind + " ", env); }
582
+ } else if (Cast<WarningRule>(node)) {
583
+ WarningRule* block = Cast<WarningRule>(node);
584
+ std::cerr << ind << "WarningRule " << block;
585
+ std::cerr << " (" << pstate_source_position(node) << ")";
586
+ std::cerr << " " << block->tabs() << std::endl;
587
+ debug_ast(block->message(), ind + " : ");
588
+ } else if (Cast<ErrorRule>(node)) {
589
+ ErrorRule* block = Cast<ErrorRule>(node);
590
+ std::cerr << ind << "ErrorRule " << block;
591
+ std::cerr << " (" << pstate_source_position(node) << ")";
592
+ std::cerr << " " << block->tabs() << std::endl;
593
+ } else if (Cast<DebugRule>(node)) {
594
+ DebugRule* block = Cast<DebugRule>(node);
595
+ std::cerr << ind << "DebugRule " << block;
596
+ std::cerr << " (" << pstate_source_position(node) << ")";
597
+ std::cerr << " " << block->tabs() << std::endl;
598
+ debug_ast(block->value(), ind + " ");
599
+ } else if (Cast<Comment>(node)) {
600
+ Comment* block = Cast<Comment>(node);
601
+ std::cerr << ind << "Comment " << block;
602
+ std::cerr << " (" << pstate_source_position(node) << ")";
603
+ std::cerr << " " << block->tabs() << std::endl;
604
+ debug_ast(block->text(), ind + "// ", env);
605
+ } else if (Cast<If>(node)) {
606
+ If* block = Cast<If>(node);
607
+ std::cerr << ind << "If " << block;
608
+ std::cerr << " (" << pstate_source_position(node) << ")";
609
+ std::cerr << " " << block->tabs() << std::endl;
610
+ debug_ast(block->predicate(), ind + " = ");
611
+ debug_ast(block->block(), ind + " <>");
612
+ debug_ast(block->alternative(), ind + " ><");
613
+ } else if (Cast<Return>(node)) {
614
+ Return* block = Cast<Return>(node);
615
+ std::cerr << ind << "Return " << block;
616
+ std::cerr << " (" << pstate_source_position(node) << ")";
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;
622
+ std::cerr << " (" << pstate_source_position(node) << ")";
623
+ std::cerr << " " << block->tabs() << std::endl;
624
+ debug_ast(block->selector(), ind + "-> ", env);
625
+ } else if (Cast<Content>(node)) {
626
+ Content* block = Cast<Content>(node);
627
+ std::cerr << ind << "Content " << block;
628
+ std::cerr << " (" << pstate_source_position(node) << ")";
629
+ std::cerr << " " << block->tabs() << std::endl;
630
+ debug_ast(block->arguments(), ind + " args: ", env);
631
+ } else if (Cast<Import_Stub>(node)) {
632
+ Import_Stub* block = Cast<Import_Stub>(node);
633
+ std::cerr << ind << "Import_Stub " << block;
634
+ std::cerr << " (" << pstate_source_position(node) << ")";
635
+ std::cerr << " [" << block->imp_path() << "] ";
636
+ std::cerr << " " << block->tabs() << std::endl;
637
+ } else if (Cast<Import>(node)) {
638
+ Import* block = Cast<Import>(node);
639
+ std::cerr << ind << "Import " << block;
640
+ std::cerr << " (" << pstate_source_position(node) << ")";
641
+ std::cerr << " " << block->tabs() << std::endl;
642
+ // sass::vector<sass::string> files_;
643
+ for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
644
+ debug_ast(block->import_queries(), ind + "@@ ");
645
+ } else if (Cast<Assignment>(node)) {
646
+ Assignment* block = Cast<Assignment>(node);
647
+ std::cerr << ind << "Assignment " << block;
648
+ std::cerr << " (" << pstate_source_position(node) << ")";
649
+ std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
650
+ debug_ast(block->value(), ind + "=", env);
651
+ } else if (Cast<Declaration>(node)) {
652
+ Declaration* block = Cast<Declaration>(node);
653
+ std::cerr << ind << "Declaration " << block;
654
+ std::cerr << " (" << pstate_source_position(node) << ")";
655
+ std::cerr << " [is_custom_property: " << block->is_custom_property() << "] ";
656
+ std::cerr << " " << block->tabs() << std::endl;
657
+ debug_ast(block->property(), ind + " prop: ", env);
658
+ debug_ast(block->value(), ind + " value: ", env);
659
+ debug_ast(block->block(), ind + " ", env);
660
+ } else if (Cast<Keyframe_Rule>(node)) {
661
+ Keyframe_Rule* ParentStatement = Cast<Keyframe_Rule>(node);
662
+ std::cerr << ind << "Keyframe_Rule " << ParentStatement;
663
+ std::cerr << " (" << pstate_source_position(node) << ")";
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;
670
+ std::cerr << " (" << pstate_source_position(node) << ")";
671
+ std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
672
+ debug_ast(block->selector(), ind + "~", env);
673
+ debug_ast(block->value(), ind + "+", env);
674
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
675
+ } else if (Cast<EachRule>(node)) {
676
+ EachRule* block = Cast<EachRule>(node);
677
+ std::cerr << ind << "EachRule " << block;
678
+ std::cerr << " (" << pstate_source_position(node) << ")";
679
+ std::cerr << " " << block->tabs() << std::endl;
680
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
681
+ } else if (Cast<ForRule>(node)) {
682
+ ForRule* block = Cast<ForRule>(node);
683
+ std::cerr << ind << "ForRule " << block;
684
+ std::cerr << " (" << pstate_source_position(node) << ")";
685
+ std::cerr << " " << block->tabs() << std::endl;
686
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
687
+ } else if (Cast<WhileRule>(node)) {
688
+ WhileRule* block = Cast<WhileRule>(node);
689
+ std::cerr << ind << "WhileRule " << block;
690
+ std::cerr << " (" << pstate_source_position(node) << ")";
691
+ std::cerr << " " << block->tabs() << std::endl;
692
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
693
+ } else if (Cast<Definition>(node)) {
694
+ Definition* block = Cast<Definition>(node);
695
+ std::cerr << ind << "Definition " << block;
696
+ std::cerr << " (" << pstate_source_position(node) << ")";
697
+ std::cerr << " [name: " << block->name() << "] ";
698
+ std::cerr << " [type: " << (block->type() == Sass::Definition::Type::MIXIN ? "Mixin " : "Function ") << "] ";
699
+ // this seems to lead to segfaults some times?
700
+ // std::cerr << " [signature: " << block->signature() << "] ";
701
+ std::cerr << " [native: " << block->native_function() << "] ";
702
+ std::cerr << " " << block->tabs() << std::endl;
703
+ debug_ast(block->parameters(), ind + " params: ", env);
704
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
705
+ } else if (Cast<Mixin_Call>(node)) {
706
+ Mixin_Call* block = Cast<Mixin_Call>(node);
707
+ std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
708
+ std::cerr << " (" << pstate_source_position(block) << ")";
709
+ std::cerr << " [" << block->name() << "]";
710
+ std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
711
+ debug_ast(block->arguments(), ind + " args: ", env);
712
+ debug_ast(block->block_parameters(), ind + " block_params: ", env);
713
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
714
+ } else if (StyleRule* ruleset = Cast<StyleRule>(node)) {
715
+ std::cerr << ind << "StyleRule " << ruleset;
716
+ std::cerr << " (" << pstate_source_position(node) << ")";
717
+ std::cerr << " [indent: " << ruleset->tabs() << "]";
718
+ std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
719
+ std::cerr << (ruleset->is_root() ? " [root]" : "");
720
+ std::cerr << std::endl;
721
+ debug_ast(ruleset->selector(), ind + ">");
722
+ debug_ast(ruleset->block(), ind + " ");
723
+ } else if (Cast<Block>(node)) {
724
+ Block* block = Cast<Block>(node);
725
+ std::cerr << ind << "Block " << block;
726
+ std::cerr << " (" << pstate_source_position(node) << ")";
727
+ std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
728
+ std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
729
+ for(const Statement_Obj& i : block->elements()) { debug_ast(i, ind + " ", env); }
730
+ } else if (Cast<Variable>(node)) {
731
+ Variable* expression = Cast<Variable>(node);
732
+ std::cerr << ind << "Variable " << expression;
733
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
734
+ std::cerr << " (" << pstate_source_position(node) << ")";
735
+ std::cerr << " [" << expression->name() << "]" << std::endl;
736
+ sass::string name(expression->name());
737
+ if (env && env->has(name)) debug_ast(Cast<Expression>((*env)[name]), ind + " -> ", env);
738
+ } else if (Cast<Function_Call>(node)) {
739
+ Function_Call* expression = Cast<Function_Call>(node);
740
+ std::cerr << ind << "Function_Call " << expression;
741
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
742
+ std::cerr << " (" << pstate_source_position(node) << ")";
743
+ std::cerr << " [" << expression->name() << "]";
744
+ if (expression->is_delayed()) std::cerr << " [delayed]";
745
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
746
+ if (expression->is_css()) std::cerr << " [css]";
747
+ std::cerr << std::endl;
748
+ debug_ast(expression->arguments(), ind + " args: ", env);
749
+ debug_ast(expression->func(), ind + " func: ", env);
750
+ } else if (Cast<Function>(node)) {
751
+ Function* expression = Cast<Function>(node);
752
+ std::cerr << ind << "Function " << expression;
753
+ std::cerr << " (" << pstate_source_position(node) << ")";
754
+ if (expression->is_css()) std::cerr << " [css]";
755
+ std::cerr << std::endl;
756
+ debug_ast(expression->definition(), ind + " definition: ", env);
757
+ } else if (Cast<Arguments>(node)) {
758
+ Arguments* expression = Cast<Arguments>(node);
759
+ std::cerr << ind << "Arguments " << expression;
760
+ if (expression->is_delayed()) std::cerr << " [delayed]";
761
+ std::cerr << " (" << pstate_source_position(node) << ")";
762
+ if (expression->has_named_arguments()) std::cerr << " [has_named_arguments]";
763
+ if (expression->has_rest_argument()) std::cerr << " [has_rest_argument]";
764
+ if (expression->has_keyword_argument()) std::cerr << " [has_keyword_argument]";
765
+ std::cerr << std::endl;
766
+ for(const Argument_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
767
+ } else if (Cast<Argument>(node)) {
768
+ Argument* expression = Cast<Argument>(node);
769
+ std::cerr << ind << "Argument " << expression;
770
+ std::cerr << " (" << pstate_source_position(node) << ")";
771
+ std::cerr << " [" << expression->value().ptr() << "]";
772
+ std::cerr << " [name: " << expression->name() << "] ";
773
+ std::cerr << " [rest: " << expression->is_rest_argument() << "] ";
774
+ std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
775
+ debug_ast(expression->value(), ind + " value: ", env);
776
+ } else if (Cast<Parameters>(node)) {
777
+ Parameters* expression = Cast<Parameters>(node);
778
+ std::cerr << ind << "Parameters " << expression;
779
+ std::cerr << " (" << pstate_source_position(node) << ")";
780
+ std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
781
+ std::cerr << " [has_rest: " << expression->has_rest_parameter() << "] ";
782
+ std::cerr << std::endl;
783
+ for(const Parameter_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
784
+ } else if (Cast<Parameter>(node)) {
785
+ Parameter* expression = Cast<Parameter>(node);
786
+ std::cerr << ind << "Parameter " << expression;
787
+ std::cerr << " (" << pstate_source_position(node) << ")";
788
+ std::cerr << " [name: " << expression->name() << "] ";
789
+ std::cerr << " [default: " << expression->default_value().ptr() << "] ";
790
+ std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
791
+ } else if (Cast<Unary_Expression>(node)) {
792
+ Unary_Expression* expression = Cast<Unary_Expression>(node);
793
+ std::cerr << ind << "Unary_Expression " << expression;
794
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
795
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
796
+ std::cerr << " (" << pstate_source_position(node) << ")";
797
+ std::cerr << " [" << expression->type() << "]" << std::endl;
798
+ debug_ast(expression->operand(), ind + " operand: ", env);
799
+ } else if (Cast<Binary_Expression>(node)) {
800
+ Binary_Expression* expression = Cast<Binary_Expression>(node);
801
+ std::cerr << ind << "Binary_Expression " << expression;
802
+ if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
803
+ if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
804
+ if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
805
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
806
+ std::cerr << " [ws_before: " << expression->op().ws_before << "] ";
807
+ std::cerr << " [ws_after: " << expression->op().ws_after << "] ";
808
+ std::cerr << " (" << pstate_source_position(node) << ")";
809
+ std::cerr << " [" << expression->type_name() << "]" << std::endl;
810
+ debug_ast(expression->left(), ind + " left: ", env);
811
+ debug_ast(expression->right(), ind + " right: ", env);
812
+ } else if (Cast<Map>(node)) {
813
+ Map* expression = Cast<Map>(node);
814
+ std::cerr << ind << "Map " << expression;
815
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
816
+ std::cerr << " (" << pstate_source_position(node) << ")";
817
+ std::cerr << " [Hashed]" << std::endl;
818
+ for (const auto& i : expression->elements()) {
819
+ debug_ast(i.first, ind + " key: ");
820
+ debug_ast(i.second, ind + " val: ");
821
+ }
822
+ } else if (Cast<List>(node)) {
823
+ List* expression = Cast<List>(node);
824
+ std::cerr << ind << "List " << expression;
825
+ std::cerr << " (" << pstate_source_position(node) << ")";
826
+ std::cerr << " (" << expression->length() << ") " <<
827
+ (expression->separator() == SASS_COMMA ? "Comma " : expression->separator() == SASS_HASH ? "Map " : "Space ") <<
828
+ " [delayed: " << expression->is_delayed() << "] " <<
829
+ " [interpolant: " << expression->is_interpolant() << "] " <<
830
+ " [listized: " << expression->from_selector() << "] " <<
831
+ " [arglist: " << expression->is_arglist() << "] " <<
832
+ " [bracketed: " << expression->is_bracketed() << "] " <<
833
+ " [expanded: " << expression->is_expanded() << "] " <<
834
+ " [hash: " << expression->hash() << "] " <<
835
+ std::endl;
836
+ for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
837
+ } else if (Cast<Boolean>(node)) {
838
+ Boolean* expression = Cast<Boolean>(node);
839
+ std::cerr << ind << "Boolean " << expression;
840
+ std::cerr << " (" << pstate_source_position(node) << ")";
841
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
842
+ std::cerr << " [" << expression->value() << "]" << std::endl;
843
+ } else if (Cast<Color_RGBA>(node)) {
844
+ Color_RGBA* expression = Cast<Color_RGBA>(node);
845
+ std::cerr << ind << "Color " << expression;
846
+ std::cerr << " (" << pstate_source_position(node) << ")";
847
+ std::cerr << " [name: " << expression->disp() << "] ";
848
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
849
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
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;
859
+ } else if (Cast<Number>(node)) {
860
+ Number* expression = Cast<Number>(node);
861
+ std::cerr << ind << "Number " << expression;
862
+ std::cerr << " (" << pstate_source_position(node) << ")";
863
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
864
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
865
+ std::cerr << " [" << expression->value() << expression->unit() << "]" <<
866
+ " [hash: " << expression->hash() << "] " <<
867
+ std::endl;
868
+ } else if (Cast<Null>(node)) {
869
+ Null* expression = Cast<Null>(node);
870
+ std::cerr << ind << "Null " << expression;
871
+ std::cerr << " (" << pstate_source_position(node) << ")";
872
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] "
873
+ // " [hash: " << expression->hash() << "] "
874
+ << std::endl;
875
+ } else if (Cast<String_Quoted>(node)) {
876
+ String_Quoted* expression = Cast<String_Quoted>(node);
877
+ std::cerr << ind << "String_Quoted " << expression;
878
+ std::cerr << " (" << pstate_source_position(node) << ")";
879
+ std::cerr << " [" << prettyprint(expression->value()) << "]";
880
+ if (expression->is_delayed()) std::cerr << " [delayed]";
881
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
882
+ if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
883
+ std::cerr << std::endl;
884
+ } else if (Cast<String_Constant>(node)) {
885
+ String_Constant* expression = Cast<String_Constant>(node);
886
+ std::cerr << ind << "String_Constant " << expression;
887
+ if (expression->concrete_type()) {
888
+ std::cerr << " " << expression->concrete_type();
889
+ }
890
+ std::cerr << " (" << pstate_source_position(node) << ")";
891
+ std::cerr << " [" << prettyprint(expression->value()) << "]";
892
+ if (expression->is_delayed()) std::cerr << " [delayed]";
893
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
894
+ std::cerr << std::endl;
895
+ } else if (Cast<String_Schema>(node)) {
896
+ String_Schema* expression = Cast<String_Schema>(node);
897
+ std::cerr << ind << "String_Schema " << expression;
898
+ std::cerr << " (" << pstate_source_position(expression) << ")";
899
+ std::cerr << " " << expression->concrete_type();
900
+ std::cerr << " (" << pstate_source_position(node) << ")";
901
+ if (expression->css()) std::cerr << " [css]";
902
+ if (expression->is_delayed()) std::cerr << " [delayed]";
903
+ if (expression->is_interpolant()) std::cerr << " [is interpolant]";
904
+ if (expression->has_interpolant()) std::cerr << " [has interpolant]";
905
+ if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
906
+ if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
907
+ std::cerr << std::endl;
908
+ for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
909
+ } else if (Cast<String>(node)) {
910
+ String* expression = Cast<String>(node);
911
+ std::cerr << ind << "String " << expression;
912
+ std::cerr << " " << expression->concrete_type();
913
+ std::cerr << " (" << pstate_source_position(node) << ")";
914
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
915
+ std::cerr << std::endl;
916
+ } else if (Cast<Expression>(node)) {
917
+ Expression* expression = Cast<Expression>(node);
918
+ std::cerr << ind << "Expression " << expression;
919
+ std::cerr << " (" << pstate_source_position(node) << ")";
920
+ switch (expression->concrete_type()) {
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;
937
+ }
938
+ std::cerr << std::endl;
939
+ } else if (Cast<ParentStatement>(node)) {
940
+ ParentStatement* parent = Cast<ParentStatement>(node);
941
+ std::cerr << ind << "ParentStatement " << parent;
942
+ std::cerr << " (" << pstate_source_position(node) << ")";
943
+ std::cerr << " " << parent->tabs() << std::endl;
944
+ if (parent->block()) for(const Statement_Obj& i : parent->block()->elements()) { debug_ast(i, ind + " ", env); }
945
+ } else if (Cast<Statement>(node)) {
946
+ Statement* statement = Cast<Statement>(node);
947
+ std::cerr << ind << "Statement " << statement;
948
+ std::cerr << " (" << pstate_source_position(node) << ")";
949
+ std::cerr << " " << statement->tabs() << std::endl;
950
+ }
951
+
952
+ if (ind == "") std::cerr << "####################################################################\n";
953
+ }
954
+
955
+
956
+ /*
957
+ inline void debug_ast(const AST_Node* node, sass::string ind = "", Env* env = 0)
958
+ {
959
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
960
+ }
961
+ */
962
+
963
+ #endif // SASS_DEBUGGER