sassc4 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 (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. metadata +396 -0
@@ -0,0 +1,964 @@
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 << (selector->has_real_parent_ref(nullptr) ? " [real parent]" : " -");
434
+ std::cerr << std::endl;
435
+ debug_ast(selector->argument(), ind + " <= ", env);
436
+ debug_ast(selector->selector(), ind + " || ", env);
437
+ } else if (Cast<AttributeSelector>(node)) {
438
+ AttributeSelector* selector = Cast<AttributeSelector>(node);
439
+ std::cerr << ind << "AttributeSelector " << selector;
440
+ std::cerr << " (" << pstate_source_position(node) << ")";
441
+ std::cerr << " <" << selector->hash() << ">";
442
+ std::cerr << " <<" << selector->ns_name() << ">>";
443
+ std::cerr << std::endl;
444
+ debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
445
+ } else if (Cast<ClassSelector>(node)) {
446
+ ClassSelector* selector = Cast<ClassSelector>(node);
447
+ std::cerr << ind << "ClassSelector " << selector;
448
+ std::cerr << " (" << pstate_source_position(node) << ")";
449
+ std::cerr << " <" << selector->hash() << ">";
450
+ std::cerr << " <<" << selector->ns_name() << ">>";
451
+ std::cerr << std::endl;
452
+ } else if (Cast<IDSelector>(node)) {
453
+ IDSelector* selector = Cast<IDSelector>(node);
454
+ std::cerr << ind << "IDSelector " << selector;
455
+ std::cerr << " (" << pstate_source_position(node) << ")";
456
+ std::cerr << " <" << selector->hash() << ">";
457
+ std::cerr << " <<" << selector->ns_name() << ">>";
458
+ std::cerr << std::endl;
459
+ } else if (Cast<TypeSelector>(node)) {
460
+ TypeSelector* selector = Cast<TypeSelector>(node);
461
+ std::cerr << ind << "TypeSelector " << selector;
462
+ std::cerr << " (" << pstate_source_position(node) << ")";
463
+ std::cerr << " <" << selector->hash() << ">";
464
+ std::cerr << " <<" << selector->ns_name() << ">>";
465
+ std::cerr << std::endl;
466
+ } else if (Cast<PlaceholderSelector>(node)) {
467
+
468
+ PlaceholderSelector* selector = Cast<PlaceholderSelector>(node);
469
+ std::cerr << ind << "PlaceholderSelector [" << selector->ns_name() << "] " << selector;
470
+ std::cerr << " (" << pstate_source_position(selector) << ")"
471
+ << " <" << selector->hash() << ">"
472
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
473
+ << std::endl;
474
+
475
+ } else if (Cast<SimpleSelector>(node)) {
476
+ SimpleSelector* selector = Cast<SimpleSelector>(node);
477
+ std::cerr << ind << "SimpleSelector " << selector;
478
+ std::cerr << " (" << pstate_source_position(node) << ")";
479
+
480
+ } else if (Cast<Selector_Schema>(node)) {
481
+ Selector_Schema* selector = Cast<Selector_Schema>(node);
482
+ std::cerr << ind << "Selector_Schema " << selector;
483
+ std::cerr << " (" << pstate_source_position(node) << ")"
484
+ << (selector->connect_parent() ? " [connect-parent]": " -")
485
+ << std::endl;
486
+
487
+ debug_ast(selector->contents(), ind + " ");
488
+ // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
489
+
490
+ } else if (Cast<Selector>(node)) {
491
+ Selector* selector = Cast<Selector>(node);
492
+ std::cerr << ind << "Selector " << selector;
493
+ std::cerr << " (" << pstate_source_position(node) << ")"
494
+ << std::endl;
495
+
496
+ } else if (Cast<Media_Query_Expression>(node)) {
497
+ Media_Query_Expression* block = Cast<Media_Query_Expression>(node);
498
+ std::cerr << ind << "Media_Query_Expression " << block;
499
+ std::cerr << " (" << pstate_source_position(node) << ")";
500
+ std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
501
+ << std::endl;
502
+ debug_ast(block->feature(), ind + " feature) ");
503
+ debug_ast(block->value(), ind + " value) ");
504
+
505
+ } else if (Cast<Media_Query>(node)) {
506
+ Media_Query* block = Cast<Media_Query>(node);
507
+ std::cerr << ind << "Media_Query " << block;
508
+ std::cerr << " (" << pstate_source_position(node) << ")";
509
+ std::cerr << (block->is_negated() ? " [is_negated]": " -")
510
+ << (block->is_restricted() ? " [is_restricted]": " -")
511
+ << std::endl;
512
+ debug_ast(block->media_type(), ind + " ");
513
+ for(const auto& i : block->elements()) { debug_ast(i, ind + " ", env); }
514
+ }
515
+ else if (Cast<MediaRule>(node)) {
516
+ MediaRule* rule = Cast<MediaRule>(node);
517
+ std::cerr << ind << "MediaRule " << rule;
518
+ std::cerr << " (" << pstate_source_position(rule) << ")";
519
+ std::cerr << " " << rule->tabs() << std::endl;
520
+ debug_ast(rule->schema(), ind + " =@ ");
521
+ debug_ast(rule->block(), ind + " ");
522
+ }
523
+ else if (Cast<CssMediaRule>(node)) {
524
+ CssMediaRule* rule = Cast<CssMediaRule>(node);
525
+ std::cerr << ind << "CssMediaRule " << rule;
526
+ std::cerr << " (" << pstate_source_position(rule) << ")";
527
+ std::cerr << " " << rule->tabs() << std::endl;
528
+ for (auto item : rule->elements()) {
529
+ debug_ast(item, ind + " == ");
530
+ }
531
+ debug_ast(rule->block(), ind + " ");
532
+ }
533
+ else if (Cast<CssMediaQuery>(node)) {
534
+ CssMediaQuery* query = Cast<CssMediaQuery>(node);
535
+ std::cerr << ind << "CssMediaQuery " << query;
536
+ std::cerr << " (" << pstate_source_position(query) << ")";
537
+ std::cerr << " [" << (query->modifier()) << "] ";
538
+ std::cerr << " [" << (query->type()) << "] ";
539
+ std::cerr << " " << debug_vec(query->features());
540
+ std::cerr << std::endl;
541
+ } else if (Cast<SupportsRule>(node)) {
542
+ SupportsRule* block = Cast<SupportsRule>(node);
543
+ std::cerr << ind << "SupportsRule " << block;
544
+ std::cerr << " (" << pstate_source_position(node) << ")";
545
+ std::cerr << " " << block->tabs() << std::endl;
546
+ debug_ast(block->condition(), ind + " =@ ");
547
+ debug_ast(block->block(), ind + " <>");
548
+ } else if (Cast<SupportsOperation>(node)) {
549
+ SupportsOperation* block = Cast<SupportsOperation>(node);
550
+ std::cerr << ind << "SupportsOperation " << block;
551
+ std::cerr << " (" << pstate_source_position(node) << ")"
552
+ << std::endl;
553
+ debug_ast(block->left(), ind + " left) ");
554
+ debug_ast(block->right(), ind + " right) ");
555
+ } else if (Cast<SupportsNegation>(node)) {
556
+ SupportsNegation* block = Cast<SupportsNegation>(node);
557
+ std::cerr << ind << "SupportsNegation " << block;
558
+ std::cerr << " (" << pstate_source_position(node) << ")"
559
+ << std::endl;
560
+ debug_ast(block->condition(), ind + " condition) ");
561
+ } else if (Cast<At_Root_Query>(node)) {
562
+ At_Root_Query* block = Cast<At_Root_Query>(node);
563
+ std::cerr << ind << "At_Root_Query " << block;
564
+ std::cerr << " (" << pstate_source_position(node) << ")"
565
+ << std::endl;
566
+ debug_ast(block->feature(), ind + " feature) ");
567
+ debug_ast(block->value(), ind + " value) ");
568
+ } else if (Cast<SupportsDeclaration>(node)) {
569
+ SupportsDeclaration* block = Cast<SupportsDeclaration>(node);
570
+ std::cerr << ind << "SupportsDeclaration " << block;
571
+ std::cerr << " (" << pstate_source_position(node) << ")"
572
+ << std::endl;
573
+ debug_ast(block->feature(), ind + " feature) ");
574
+ debug_ast(block->value(), ind + " value) ");
575
+ } else if (Cast<Block>(node)) {
576
+ Block* root_block = Cast<Block>(node);
577
+ std::cerr << ind << "Block " << root_block;
578
+ std::cerr << " (" << pstate_source_position(node) << ")";
579
+ if (root_block->is_root()) std::cerr << " [root]";
580
+ if (root_block->isInvisible()) std::cerr << " [isInvisible]";
581
+ std::cerr << " " << root_block->tabs() << std::endl;
582
+ for(const Statement_Obj& i : root_block->elements()) { debug_ast(i, ind + " ", env); }
583
+ } else if (Cast<WarningRule>(node)) {
584
+ WarningRule* block = Cast<WarningRule>(node);
585
+ std::cerr << ind << "WarningRule " << block;
586
+ std::cerr << " (" << pstate_source_position(node) << ")";
587
+ std::cerr << " " << block->tabs() << std::endl;
588
+ debug_ast(block->message(), ind + " : ");
589
+ } else if (Cast<ErrorRule>(node)) {
590
+ ErrorRule* block = Cast<ErrorRule>(node);
591
+ std::cerr << ind << "ErrorRule " << block;
592
+ std::cerr << " (" << pstate_source_position(node) << ")";
593
+ std::cerr << " " << block->tabs() << std::endl;
594
+ } else if (Cast<DebugRule>(node)) {
595
+ DebugRule* block = Cast<DebugRule>(node);
596
+ std::cerr << ind << "DebugRule " << block;
597
+ std::cerr << " (" << pstate_source_position(node) << ")";
598
+ std::cerr << " " << block->tabs() << std::endl;
599
+ debug_ast(block->value(), ind + " ");
600
+ } else if (Cast<Comment>(node)) {
601
+ Comment* block = Cast<Comment>(node);
602
+ std::cerr << ind << "Comment " << block;
603
+ std::cerr << " (" << pstate_source_position(node) << ")";
604
+ std::cerr << " " << block->tabs() << std::endl;
605
+ debug_ast(block->text(), ind + "// ", env);
606
+ } else if (Cast<If>(node)) {
607
+ If* block = Cast<If>(node);
608
+ std::cerr << ind << "If " << block;
609
+ std::cerr << " (" << pstate_source_position(node) << ")";
610
+ std::cerr << " " << block->tabs() << std::endl;
611
+ debug_ast(block->predicate(), ind + " = ");
612
+ debug_ast(block->block(), ind + " <>");
613
+ debug_ast(block->alternative(), ind + " ><");
614
+ } else if (Cast<Return>(node)) {
615
+ Return* block = Cast<Return>(node);
616
+ std::cerr << ind << "Return " << block;
617
+ std::cerr << " (" << pstate_source_position(node) << ")";
618
+ std::cerr << " " << block->tabs();
619
+ std::cerr << " [" << block->value()->to_string() << "]" << std::endl;
620
+ } else if (Cast<ExtendRule>(node)) {
621
+ ExtendRule* block = Cast<ExtendRule>(node);
622
+ std::cerr << ind << "ExtendRule " << block;
623
+ std::cerr << " (" << pstate_source_position(node) << ")";
624
+ std::cerr << " " << block->tabs() << std::endl;
625
+ debug_ast(block->selector(), ind + "-> ", env);
626
+ } else if (Cast<Content>(node)) {
627
+ Content* block = Cast<Content>(node);
628
+ std::cerr << ind << "Content " << block;
629
+ std::cerr << " (" << pstate_source_position(node) << ")";
630
+ std::cerr << " " << block->tabs() << std::endl;
631
+ debug_ast(block->arguments(), ind + " args: ", env);
632
+ } else if (Cast<Import_Stub>(node)) {
633
+ Import_Stub* block = Cast<Import_Stub>(node);
634
+ std::cerr << ind << "Import_Stub " << block;
635
+ std::cerr << " (" << pstate_source_position(node) << ")";
636
+ std::cerr << " [" << block->imp_path() << "] ";
637
+ std::cerr << " " << block->tabs() << std::endl;
638
+ } else if (Cast<Import>(node)) {
639
+ Import* block = Cast<Import>(node);
640
+ std::cerr << ind << "Import " << block;
641
+ std::cerr << " (" << pstate_source_position(node) << ")";
642
+ std::cerr << " " << block->tabs() << std::endl;
643
+ // sass::vector<sass::string> files_;
644
+ for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
645
+ debug_ast(block->import_queries(), ind + "@@ ");
646
+ } else if (Cast<Assignment>(node)) {
647
+ Assignment* block = Cast<Assignment>(node);
648
+ std::cerr << ind << "Assignment " << block;
649
+ std::cerr << " (" << pstate_source_position(node) << ")";
650
+ std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
651
+ debug_ast(block->value(), ind + "=", env);
652
+ } else if (Cast<Declaration>(node)) {
653
+ Declaration* block = Cast<Declaration>(node);
654
+ std::cerr << ind << "Declaration " << block;
655
+ std::cerr << " (" << pstate_source_position(node) << ")";
656
+ std::cerr << " [is_custom_property: " << block->is_custom_property() << "] ";
657
+ std::cerr << " " << block->tabs() << std::endl;
658
+ debug_ast(block->property(), ind + " prop: ", env);
659
+ debug_ast(block->value(), ind + " value: ", env);
660
+ debug_ast(block->block(), ind + " ", env);
661
+ } else if (Cast<Keyframe_Rule>(node)) {
662
+ Keyframe_Rule* ParentStatement = Cast<Keyframe_Rule>(node);
663
+ std::cerr << ind << "Keyframe_Rule " << ParentStatement;
664
+ std::cerr << " (" << pstate_source_position(node) << ")";
665
+ std::cerr << " " << ParentStatement->tabs() << std::endl;
666
+ if (ParentStatement->name()) debug_ast(ParentStatement->name(), ind + "@");
667
+ if (ParentStatement->block()) for(const Statement_Obj& i : ParentStatement->block()->elements()) { debug_ast(i, ind + " ", env); }
668
+ } else if (Cast<AtRule>(node)) {
669
+ AtRule* block = Cast<AtRule>(node);
670
+ std::cerr << ind << "AtRule " << block;
671
+ std::cerr << " (" << pstate_source_position(node) << ")";
672
+ std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
673
+ debug_ast(block->selector(), ind + "~", env);
674
+ debug_ast(block->value(), ind + "+", env);
675
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
676
+ } else if (Cast<EachRule>(node)) {
677
+ EachRule* block = Cast<EachRule>(node);
678
+ std::cerr << ind << "EachRule " << block;
679
+ std::cerr << " (" << pstate_source_position(node) << ")";
680
+ std::cerr << " " << block->tabs() << std::endl;
681
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
682
+ } else if (Cast<ForRule>(node)) {
683
+ ForRule* block = Cast<ForRule>(node);
684
+ std::cerr << ind << "ForRule " << block;
685
+ std::cerr << " (" << pstate_source_position(node) << ")";
686
+ std::cerr << " " << block->tabs() << std::endl;
687
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
688
+ } else if (Cast<WhileRule>(node)) {
689
+ WhileRule* block = Cast<WhileRule>(node);
690
+ std::cerr << ind << "WhileRule " << block;
691
+ std::cerr << " (" << pstate_source_position(node) << ")";
692
+ std::cerr << " " << block->tabs() << std::endl;
693
+ if (block->block()) for(const Statement_Obj& i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
694
+ } else if (Cast<Definition>(node)) {
695
+ Definition* block = Cast<Definition>(node);
696
+ std::cerr << ind << "Definition " << block;
697
+ std::cerr << " (" << pstate_source_position(node) << ")";
698
+ std::cerr << " [name: " << block->name() << "] ";
699
+ std::cerr << " [type: " << (block->type() == Sass::Definition::Type::MIXIN ? "Mixin " : "Function ") << "] ";
700
+ // this seems to lead to segfaults some times?
701
+ // std::cerr << " [signature: " << block->signature() << "] ";
702
+ std::cerr << " [native: " << block->native_function() << "] ";
703
+ std::cerr << " " << block->tabs() << std::endl;
704
+ debug_ast(block->parameters(), ind + " params: ", env);
705
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
706
+ } else if (Cast<Mixin_Call>(node)) {
707
+ Mixin_Call* block = Cast<Mixin_Call>(node);
708
+ std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
709
+ std::cerr << " (" << pstate_source_position(block) << ")";
710
+ std::cerr << " [" << block->name() << "]";
711
+ std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
712
+ debug_ast(block->arguments(), ind + " args: ", env);
713
+ debug_ast(block->block_parameters(), ind + " block_params: ", env);
714
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
715
+ } else if (StyleRule* ruleset = Cast<StyleRule>(node)) {
716
+ std::cerr << ind << "StyleRule " << ruleset;
717
+ std::cerr << " (" << pstate_source_position(node) << ")";
718
+ std::cerr << " [indent: " << ruleset->tabs() << "]";
719
+ std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
720
+ std::cerr << (ruleset->is_root() ? " [root]" : "");
721
+ std::cerr << std::endl;
722
+ debug_ast(ruleset->selector(), ind + ">");
723
+ debug_ast(ruleset->block(), ind + " ");
724
+ } else if (Cast<Block>(node)) {
725
+ Block* block = Cast<Block>(node);
726
+ std::cerr << ind << "Block " << block;
727
+ std::cerr << " (" << pstate_source_position(node) << ")";
728
+ std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
729
+ std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
730
+ for(const Statement_Obj& i : block->elements()) { debug_ast(i, ind + " ", env); }
731
+ } else if (Cast<Variable>(node)) {
732
+ Variable* expression = Cast<Variable>(node);
733
+ std::cerr << ind << "Variable " << expression;
734
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
735
+ std::cerr << " (" << pstate_source_position(node) << ")";
736
+ std::cerr << " [" << expression->name() << "]" << std::endl;
737
+ sass::string name(expression->name());
738
+ if (env && env->has(name)) debug_ast(Cast<Expression>((*env)[name]), ind + " -> ", env);
739
+ } else if (Cast<Function_Call>(node)) {
740
+ Function_Call* expression = Cast<Function_Call>(node);
741
+ std::cerr << ind << "Function_Call " << expression;
742
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
743
+ std::cerr << " (" << pstate_source_position(node) << ")";
744
+ std::cerr << " [" << expression->name() << "]";
745
+ if (expression->is_delayed()) std::cerr << " [delayed]";
746
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
747
+ if (expression->is_css()) std::cerr << " [css]";
748
+ std::cerr << std::endl;
749
+ debug_ast(expression->arguments(), ind + " args: ", env);
750
+ debug_ast(expression->func(), ind + " func: ", env);
751
+ } else if (Cast<Function>(node)) {
752
+ Function* expression = Cast<Function>(node);
753
+ std::cerr << ind << "Function " << expression;
754
+ std::cerr << " (" << pstate_source_position(node) << ")";
755
+ if (expression->is_css()) std::cerr << " [css]";
756
+ std::cerr << std::endl;
757
+ debug_ast(expression->definition(), ind + " definition: ", env);
758
+ } else if (Cast<Arguments>(node)) {
759
+ Arguments* expression = Cast<Arguments>(node);
760
+ std::cerr << ind << "Arguments " << expression;
761
+ if (expression->is_delayed()) std::cerr << " [delayed]";
762
+ std::cerr << " (" << pstate_source_position(node) << ")";
763
+ if (expression->has_named_arguments()) std::cerr << " [has_named_arguments]";
764
+ if (expression->has_rest_argument()) std::cerr << " [has_rest_argument]";
765
+ if (expression->has_keyword_argument()) std::cerr << " [has_keyword_argument]";
766
+ std::cerr << std::endl;
767
+ for(const Argument_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
768
+ } else if (Cast<Argument>(node)) {
769
+ Argument* expression = Cast<Argument>(node);
770
+ std::cerr << ind << "Argument " << expression;
771
+ std::cerr << " (" << pstate_source_position(node) << ")";
772
+ std::cerr << " [" << expression->value().ptr() << "]";
773
+ std::cerr << " [name: " << expression->name() << "] ";
774
+ std::cerr << " [rest: " << expression->is_rest_argument() << "] ";
775
+ std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
776
+ debug_ast(expression->value(), ind + " value: ", env);
777
+ } else if (Cast<Parameters>(node)) {
778
+ Parameters* expression = Cast<Parameters>(node);
779
+ std::cerr << ind << "Parameters " << expression;
780
+ std::cerr << " (" << pstate_source_position(node) << ")";
781
+ std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
782
+ std::cerr << " [has_rest: " << expression->has_rest_parameter() << "] ";
783
+ std::cerr << std::endl;
784
+ for(const Parameter_Obj& i : expression->elements()) { debug_ast(i, ind + " ", env); }
785
+ } else if (Cast<Parameter>(node)) {
786
+ Parameter* expression = Cast<Parameter>(node);
787
+ std::cerr << ind << "Parameter " << expression;
788
+ std::cerr << " (" << pstate_source_position(node) << ")";
789
+ std::cerr << " [name: " << expression->name() << "] ";
790
+ std::cerr << " [default: " << expression->default_value().ptr() << "] ";
791
+ std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
792
+ } else if (Cast<Unary_Expression>(node)) {
793
+ Unary_Expression* expression = Cast<Unary_Expression>(node);
794
+ std::cerr << ind << "Unary_Expression " << expression;
795
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
796
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
797
+ std::cerr << " (" << pstate_source_position(node) << ")";
798
+ std::cerr << " [" << expression->type() << "]" << std::endl;
799
+ debug_ast(expression->operand(), ind + " operand: ", env);
800
+ } else if (Cast<Binary_Expression>(node)) {
801
+ Binary_Expression* expression = Cast<Binary_Expression>(node);
802
+ std::cerr << ind << "Binary_Expression " << expression;
803
+ if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
804
+ if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
805
+ if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
806
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
807
+ std::cerr << " [ws_before: " << expression->op().ws_before << "] ";
808
+ std::cerr << " [ws_after: " << expression->op().ws_after << "] ";
809
+ std::cerr << " (" << pstate_source_position(node) << ")";
810
+ std::cerr << " [" << expression->type_name() << "]" << std::endl;
811
+ debug_ast(expression->left(), ind + " left: ", env);
812
+ debug_ast(expression->right(), ind + " right: ", env);
813
+ } else if (Cast<Map>(node)) {
814
+ Map* expression = Cast<Map>(node);
815
+ std::cerr << ind << "Map " << expression;
816
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
817
+ std::cerr << " (" << pstate_source_position(node) << ")";
818
+ std::cerr << " [Hashed]" << std::endl;
819
+ for (const auto& i : expression->elements()) {
820
+ debug_ast(i.first, ind + " key: ");
821
+ debug_ast(i.second, ind + " val: ");
822
+ }
823
+ } else if (Cast<List>(node)) {
824
+ List* expression = Cast<List>(node);
825
+ std::cerr << ind << "List " << expression;
826
+ std::cerr << " (" << pstate_source_position(node) << ")";
827
+ std::cerr << " (" << expression->length() << ") " <<
828
+ (expression->separator() == SASS_COMMA ? "Comma " : expression->separator() == SASS_HASH ? "Map " : "Space ") <<
829
+ " [delayed: " << expression->is_delayed() << "] " <<
830
+ " [interpolant: " << expression->is_interpolant() << "] " <<
831
+ " [listized: " << expression->from_selector() << "] " <<
832
+ " [arglist: " << expression->is_arglist() << "] " <<
833
+ " [bracketed: " << expression->is_bracketed() << "] " <<
834
+ " [expanded: " << expression->is_expanded() << "] " <<
835
+ " [hash: " << expression->hash() << "] " <<
836
+ std::endl;
837
+ for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
838
+ } else if (Cast<Boolean>(node)) {
839
+ Boolean* expression = Cast<Boolean>(node);
840
+ std::cerr << ind << "Boolean " << expression;
841
+ std::cerr << " (" << pstate_source_position(node) << ")";
842
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
843
+ std::cerr << " [" << expression->value() << "]" << std::endl;
844
+ } else if (Cast<Color_RGBA>(node)) {
845
+ Color_RGBA* expression = Cast<Color_RGBA>(node);
846
+ std::cerr << ind << "Color " << expression;
847
+ std::cerr << " (" << pstate_source_position(node) << ")";
848
+ std::cerr << " [name: " << expression->disp() << "] ";
849
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
850
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
851
+ std::cerr << " rgba[" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
852
+ } else if (Cast<Color_HSLA>(node)) {
853
+ Color_HSLA* expression = Cast<Color_HSLA>(node);
854
+ std::cerr << ind << "Color " << expression;
855
+ std::cerr << " (" << pstate_source_position(node) << ")";
856
+ std::cerr << " [name: " << expression->disp() << "] ";
857
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
858
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
859
+ std::cerr << " hsla[" << expression->h() << ":" << expression->s() << ":" << expression->l() << "@" << expression->a() << "]" << std::endl;
860
+ } else if (Cast<Number>(node)) {
861
+ Number* expression = Cast<Number>(node);
862
+ std::cerr << ind << "Number " << expression;
863
+ std::cerr << " (" << pstate_source_position(node) << ")";
864
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
865
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
866
+ std::cerr << " [" << expression->value() << expression->unit() << "]" <<
867
+ " [hash: " << expression->hash() << "] " <<
868
+ std::endl;
869
+ } else if (Cast<Null>(node)) {
870
+ Null* expression = Cast<Null>(node);
871
+ std::cerr << ind << "Null " << expression;
872
+ std::cerr << " (" << pstate_source_position(node) << ")";
873
+ std::cerr << " [interpolant: " << expression->is_interpolant() << "] "
874
+ // " [hash: " << expression->hash() << "] "
875
+ << std::endl;
876
+ } else if (Cast<String_Quoted>(node)) {
877
+ String_Quoted* expression = Cast<String_Quoted>(node);
878
+ std::cerr << ind << "String_Quoted " << expression;
879
+ std::cerr << " (" << pstate_source_position(node) << ")";
880
+ std::cerr << " [" << prettyprint(expression->value()) << "]";
881
+ if (expression->is_delayed()) std::cerr << " [delayed]";
882
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
883
+ if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
884
+ std::cerr << std::endl;
885
+ } else if (Cast<String_Constant>(node)) {
886
+ String_Constant* expression = Cast<String_Constant>(node);
887
+ std::cerr << ind << "String_Constant " << expression;
888
+ if (expression->concrete_type()) {
889
+ std::cerr << " " << expression->concrete_type();
890
+ }
891
+ std::cerr << " (" << pstate_source_position(node) << ")";
892
+ std::cerr << " [" << prettyprint(expression->value()) << "]";
893
+ if (expression->is_delayed()) std::cerr << " [delayed]";
894
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
895
+ std::cerr << std::endl;
896
+ } else if (Cast<String_Schema>(node)) {
897
+ String_Schema* expression = Cast<String_Schema>(node);
898
+ std::cerr << ind << "String_Schema " << expression;
899
+ std::cerr << " (" << pstate_source_position(expression) << ")";
900
+ std::cerr << " " << expression->concrete_type();
901
+ std::cerr << " (" << pstate_source_position(node) << ")";
902
+ if (expression->css()) std::cerr << " [css]";
903
+ if (expression->is_delayed()) std::cerr << " [delayed]";
904
+ if (expression->is_interpolant()) std::cerr << " [is interpolant]";
905
+ if (expression->has_interpolant()) std::cerr << " [has interpolant]";
906
+ if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
907
+ if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
908
+ std::cerr << std::endl;
909
+ for(const auto& i : expression->elements()) { debug_ast(i, ind + " ", env); }
910
+ } else if (Cast<String>(node)) {
911
+ String* expression = Cast<String>(node);
912
+ std::cerr << ind << "String " << expression;
913
+ std::cerr << " " << expression->concrete_type();
914
+ std::cerr << " (" << pstate_source_position(node) << ")";
915
+ if (expression->is_interpolant()) std::cerr << " [interpolant]";
916
+ std::cerr << std::endl;
917
+ } else if (Cast<Expression>(node)) {
918
+ Expression* expression = Cast<Expression>(node);
919
+ std::cerr << ind << "Expression " << expression;
920
+ std::cerr << " (" << pstate_source_position(node) << ")";
921
+ switch (expression->concrete_type()) {
922
+ case Expression::Type::NONE: std::cerr << " [NONE]"; break;
923
+ case Expression::Type::BOOLEAN: std::cerr << " [BOOLEAN]"; break;
924
+ case Expression::Type::NUMBER: std::cerr << " [NUMBER]"; break;
925
+ case Expression::Type::COLOR: std::cerr << " [COLOR]"; break;
926
+ case Expression::Type::STRING: std::cerr << " [STRING]"; break;
927
+ case Expression::Type::LIST: std::cerr << " [LIST]"; break;
928
+ case Expression::Type::MAP: std::cerr << " [MAP]"; break;
929
+ case Expression::Type::SELECTOR: std::cerr << " [SELECTOR]"; break;
930
+ case Expression::Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
931
+ case Expression::Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
932
+ case Expression::Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
933
+ case Expression::Type::FUNCTION: std::cerr << " [FUNCTION]"; break;
934
+ case Expression::Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
935
+ case Expression::Type::VARIABLE: std::cerr << " [VARIABLE]"; break;
936
+ case Expression::Type::FUNCTION_VAL: std::cerr << " [FUNCTION_VAL]"; break;
937
+ case Expression::Type::PARENT: std::cerr << " [PARENT]"; break;
938
+ }
939
+ std::cerr << std::endl;
940
+ } else if (Cast<ParentStatement>(node)) {
941
+ ParentStatement* parent = Cast<ParentStatement>(node);
942
+ std::cerr << ind << "ParentStatement " << parent;
943
+ std::cerr << " (" << pstate_source_position(node) << ")";
944
+ std::cerr << " " << parent->tabs() << std::endl;
945
+ if (parent->block()) for(const Statement_Obj& i : parent->block()->elements()) { debug_ast(i, ind + " ", env); }
946
+ } else if (Cast<Statement>(node)) {
947
+ Statement* statement = Cast<Statement>(node);
948
+ std::cerr << ind << "Statement " << statement;
949
+ std::cerr << " (" << pstate_source_position(node) << ")";
950
+ std::cerr << " " << statement->tabs() << std::endl;
951
+ }
952
+
953
+ if (ind == "") std::cerr << "####################################################################\n";
954
+ }
955
+
956
+
957
+ /*
958
+ inline void debug_ast(const AST_Node* node, sass::string ind = "", Env* env = 0)
959
+ {
960
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
961
+ }
962
+ */
963
+
964
+ #endif // SASS_DEBUGGER