sassc 2.2.1 → 2.3.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +1 -0
  9. data/ext/libsass/src/ast.cpp +49 -59
  10. data/ext/libsass/src/ast.hpp +263 -102
  11. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  12. data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
  13. data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
  14. data/ext/libsass/src/ast_helpers.hpp +292 -0
  15. data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
  16. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  17. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  18. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  19. data/ext/libsass/src/ast_selectors.cpp +559 -1001
  20. data/ext/libsass/src/ast_selectors.hpp +311 -367
  21. data/ext/libsass/src/ast_supports.cpp +1 -17
  22. data/ext/libsass/src/ast_values.cpp +216 -29
  23. data/ext/libsass/src/ast_values.hpp +42 -33
  24. data/ext/libsass/src/bind.cpp +1 -1
  25. data/ext/libsass/src/cencode.c +4 -6
  26. data/ext/libsass/src/check_nesting.cpp +5 -6
  27. data/ext/libsass/src/check_nesting.hpp +4 -0
  28. data/ext/libsass/src/color_maps.cpp +11 -10
  29. data/ext/libsass/src/color_maps.hpp +0 -8
  30. data/ext/libsass/src/constants.cpp +5 -0
  31. data/ext/libsass/src/constants.hpp +6 -0
  32. data/ext/libsass/src/context.cpp +30 -60
  33. data/ext/libsass/src/context.hpp +8 -20
  34. data/ext/libsass/src/cssize.cpp +36 -120
  35. data/ext/libsass/src/cssize.hpp +4 -10
  36. data/ext/libsass/src/dart_helpers.hpp +199 -0
  37. data/ext/libsass/src/debugger.hpp +364 -207
  38. data/ext/libsass/src/emitter.cpp +3 -4
  39. data/ext/libsass/src/emitter.hpp +0 -2
  40. data/ext/libsass/src/environment.hpp +5 -0
  41. data/ext/libsass/src/error_handling.cpp +21 -0
  42. data/ext/libsass/src/error_handling.hpp +25 -3
  43. data/ext/libsass/src/eval.cpp +33 -153
  44. data/ext/libsass/src/eval.hpp +11 -13
  45. data/ext/libsass/src/eval_selectors.cpp +75 -0
  46. data/ext/libsass/src/expand.cpp +214 -167
  47. data/ext/libsass/src/expand.hpp +26 -6
  48. data/ext/libsass/src/extender.cpp +1186 -0
  49. data/ext/libsass/src/extender.hpp +399 -0
  50. data/ext/libsass/src/extension.cpp +43 -0
  51. data/ext/libsass/src/extension.hpp +89 -0
  52. data/ext/libsass/src/file.cpp +15 -14
  53. data/ext/libsass/src/file.hpp +5 -12
  54. data/ext/libsass/src/fn_colors.cpp +12 -10
  55. data/ext/libsass/src/fn_lists.cpp +12 -11
  56. data/ext/libsass/src/fn_miscs.cpp +22 -34
  57. data/ext/libsass/src/fn_numbers.cpp +13 -6
  58. data/ext/libsass/src/fn_selectors.cpp +94 -124
  59. data/ext/libsass/src/fn_strings.cpp +16 -14
  60. data/ext/libsass/src/fn_utils.cpp +5 -6
  61. data/ext/libsass/src/fn_utils.hpp +9 -3
  62. data/ext/libsass/src/inspect.cpp +154 -117
  63. data/ext/libsass/src/inspect.hpp +10 -8
  64. data/ext/libsass/src/lexer.cpp +17 -81
  65. data/ext/libsass/src/lexer.hpp +5 -16
  66. data/ext/libsass/src/listize.cpp +22 -36
  67. data/ext/libsass/src/listize.hpp +8 -9
  68. data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
  69. data/ext/libsass/src/operation.hpp +27 -17
  70. data/ext/libsass/src/operators.cpp +1 -0
  71. data/ext/libsass/src/ordered_map.hpp +112 -0
  72. data/ext/libsass/src/output.cpp +30 -49
  73. data/ext/libsass/src/output.hpp +1 -1
  74. data/ext/libsass/src/parser.cpp +211 -381
  75. data/ext/libsass/src/parser.hpp +17 -15
  76. data/ext/libsass/src/parser_selectors.cpp +189 -0
  77. data/ext/libsass/src/permutate.hpp +140 -0
  78. data/ext/libsass/src/position.hpp +1 -1
  79. data/ext/libsass/src/prelexer.cpp +6 -6
  80. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  81. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  82. data/ext/libsass/src/sass.hpp +1 -0
  83. data/ext/libsass/src/sass2scss.cpp +4 -4
  84. data/ext/libsass/src/sass_context.cpp +42 -91
  85. data/ext/libsass/src/sass_context.hpp +2 -2
  86. data/ext/libsass/src/sass_functions.cpp +1 -1
  87. data/ext/libsass/src/sass_values.cpp +0 -1
  88. data/ext/libsass/src/stylesheet.cpp +22 -0
  89. data/ext/libsass/src/stylesheet.hpp +57 -0
  90. data/ext/libsass/src/to_value.cpp +2 -2
  91. data/ext/libsass/src/to_value.hpp +1 -1
  92. data/ext/libsass/src/units.cpp +5 -3
  93. data/ext/libsass/src/util.cpp +10 -12
  94. data/ext/libsass/src/util.hpp +2 -3
  95. data/ext/libsass/src/util_string.cpp +111 -61
  96. data/ext/libsass/src/util_string.hpp +61 -8
  97. data/lib/sassc/engine.rb +5 -3
  98. data/lib/sassc/functions_handler.rb +8 -8
  99. data/lib/sassc/native.rb +1 -1
  100. data/lib/sassc/script.rb +4 -4
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/functions_test.rb +18 -1
  103. data/test/native_test.rb +1 -1
  104. metadata +17 -12
  105. data/ext/libsass/src/extend.cpp +0 -2132
  106. data/ext/libsass/src/extend.hpp +0 -86
  107. data/ext/libsass/src/node.cpp +0 -322
  108. data/ext/libsass/src/node.hpp +0 -118
  109. data/ext/libsass/src/paths.hpp +0 -71
  110. data/ext/libsass/src/sass_util.cpp +0 -152
  111. data/ext/libsass/src/sass_util.hpp +0 -256
  112. data/ext/libsass/src/subset_map.cpp +0 -58
  113. data/ext/libsass/src/subset_map.hpp +0 -76
@@ -12,7 +12,6 @@ namespace Sass {
12
12
 
13
13
  class Cssize : public Operation_CRTP<Statement*, Cssize> {
14
14
 
15
- Context& ctx;
16
15
  Backtraces& traces;
17
16
  BlockStack block_stack;
18
17
  std::vector<Statement*> p_stack;
@@ -21,12 +20,10 @@ namespace Sass {
21
20
  Cssize(Context&);
22
21
  ~Cssize() { }
23
22
 
24
- Selector_List* selector();
25
-
26
23
  Block* operator()(Block*);
27
24
  Statement* operator()(Ruleset*);
28
25
  // Statement* operator()(Bubble*);
29
- Statement* operator()(Media_Block*);
26
+ Statement* operator()(CssMediaRule*);
30
27
  Statement* operator()(Supports_Block*);
31
28
  Statement* operator()(At_Root_Block*);
32
29
  Statement* operator()(Directive*);
@@ -44,7 +41,7 @@ namespace Sass {
44
41
  // Statement* operator()(Each*);
45
42
  // Statement* operator()(While*);
46
43
  // Statement* operator()(Return*);
47
- // Statement* operator()(Extension*);
44
+ // Statement* operator()(ExtendRule*);
48
45
  // Statement* operator()(Definition*);
49
46
  // Statement* operator()(Mixin_Call*);
50
47
  // Statement* operator()(Content*);
@@ -54,16 +51,13 @@ namespace Sass {
54
51
  std::vector<std::pair<bool, Block_Obj>> slice_by_bubble(Block*);
55
52
  Statement* bubble(Directive*);
56
53
  Statement* bubble(At_Root_Block*);
57
- Statement* bubble(Media_Block*);
54
+ Statement* bubble(CssMediaRule*);
58
55
  Statement* bubble(Supports_Block*);
59
56
 
60
57
  Block* debubble(Block* children, Statement* parent = 0);
61
- Block* flatten(Block*);
58
+ Block* flatten(const Block*);
62
59
  bool bubblable(Statement*);
63
60
 
64
- List* merge_media_queries(Media_Block*, Media_Block*);
65
- Media_Query* merge_media_query(Media_Query*, Media_Query*);
66
-
67
61
  // generic fallback
68
62
  template <typename U>
69
63
  Statement* fallback(U x)
@@ -0,0 +1,199 @@
1
+ #ifndef SASS_DART_HELPERS_H
2
+ #define SASS_DART_HELPERS_H
3
+
4
+ #include <vector>
5
+ #include <utility>
6
+ #include <iterator>
7
+ #include <functional>
8
+
9
+ namespace Sass {
10
+
11
+ // ##########################################################################
12
+ // Flatten `vector<vector<T>>` to `vector<T>`
13
+ // ##########################################################################
14
+ template <class T>
15
+ T flatten(const std::vector<T>& all)
16
+ {
17
+ T flattened;
18
+ for (const auto& sub : all) {
19
+ std::copy(std::begin(sub), std::end(sub),
20
+ std::back_inserter(flattened));
21
+ }
22
+ return flattened;
23
+ }
24
+
25
+ // ##########################################################################
26
+ // Expands each element of this Iterable into zero or more elements.
27
+ // Calls a function on every element and ads all results to flat array
28
+ // ##########################################################################
29
+ // Equivalent to dart `cnt.any`
30
+ // Pass additional closure variables to `fn`
31
+ template <class T, class U, typename ...Args>
32
+ T expand(const T& cnt, U fn, Args... args) {
33
+ T flattened;
34
+ for (const auto& sub : cnt) {
35
+ auto rv = fn(sub, args...);
36
+ flattened.insert(flattened.end(),
37
+ rv.begin(), rv.end());
38
+ }
39
+ return flattened;
40
+ }
41
+
42
+ // ##########################################################################
43
+ // ##########################################################################
44
+ template <class T>
45
+ T flattenInner(const std::vector<T>& vec)
46
+ {
47
+ T outer;
48
+ for (const auto& sub : vec) {
49
+ outer.emplace_back(std::move(flatten(sub)));
50
+ }
51
+ return outer;
52
+ }
53
+ // EO flattenInner
54
+
55
+ // ##########################################################################
56
+ // Equivalent to dart `cnt.any`
57
+ // Pass additional closure variables to `fn`
58
+ // ##########################################################################
59
+ template <class T, class U, typename ...Args>
60
+ bool hasAny(const T& cnt, U fn, Args... args) {
61
+ for (const auto& sub : cnt) {
62
+ if (fn(sub, args...)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ // EO hasAny
69
+
70
+ // ##########################################################################
71
+ // Equivalent to dart `cnt.take(len).any`
72
+ // Pass additional closure variables to `fn`
73
+ // ##########################################################################
74
+ template <class T, class U, typename ...Args>
75
+ bool hasSubAny(const T& cnt, size_t len, U fn, Args... args) {
76
+ for (size_t i = 0; i < len; i++) {
77
+ if (fn(cnt[i], args...)) {
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+
84
+ // ##########################################################################
85
+ // Default predicate for lcs algorithm
86
+ // ##########################################################################
87
+ template <class T>
88
+ inline bool lcsIdentityCmp(const T& X, const T& Y, T& result)
89
+ {
90
+ // Assert equality
91
+ if (!ObjEqualityFn(X, Y)) {
92
+ return false;
93
+ }
94
+ // Store in reference
95
+ result = X;
96
+ // Return success
97
+ return true;
98
+ }
99
+ // EO lcsIdentityCmp
100
+
101
+ // ##########################################################################
102
+ // Longest common subsequence with predicate
103
+ // ##########################################################################
104
+ template <class T>
105
+ std::vector<T> lcs(
106
+ const std::vector<T>& X, const std::vector<T>& Y,
107
+ bool(*select)(const T&, const T&, T&) = lcsIdentityCmp<T>)
108
+ {
109
+
110
+ std::size_t m = X.size(), mm = X.size() + 1;
111
+ std::size_t n = Y.size(), nn = Y.size() + 1;
112
+
113
+ if (m == 0) return {};
114
+ if (n == 0) return {};
115
+
116
+ // MSVC does not support variable-length arrays
117
+ // To circumvent, allocate one array on the heap
118
+ // Then use a macro to access via double index
119
+ // e.g. `size_t L[m][n]` is supported by gcc
120
+ size_t* len = new size_t[mm * nn + 1];
121
+ bool* acc = new bool[mm * nn + 1];
122
+ T* res = new T[mm * nn + 1];
123
+
124
+ #define LEN(x, y) len[(x) * nn + (y)]
125
+ #define ACC(x, y) acc[(x) * nn + (y)]
126
+ #define RES(x, y) res[(x) * nn + (y)]
127
+
128
+ /* Following steps build L[m+1][n+1] in bottom up fashion. Note
129
+ that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */
130
+ for (size_t i = 0; i <= m; i++) {
131
+ for (size_t j = 0; j <= n; j++) {
132
+ if (i == 0 || j == 0)
133
+ LEN(i, j) = 0;
134
+ else {
135
+ ACC(i - 1, j - 1) = select(X[i - 1], Y[j - 1], RES(i - 1, j - 1));
136
+ if (ACC(i - 1, j - 1))
137
+ LEN(i, j) = LEN(i - 1, j - 1) + 1;
138
+ else
139
+ LEN(i, j) = std::max(LEN(i - 1, j), LEN(i, j - 1));
140
+ }
141
+ }
142
+ }
143
+
144
+ // Following code is used to print LCS
145
+ std::vector<T> lcs;
146
+ std::size_t index = LEN(m, n);
147
+ lcs.reserve(index);
148
+
149
+ // Start from the right-most-bottom-most corner
150
+ // and one by one store objects in lcs[]
151
+ std::size_t i = m, j = n;
152
+ while (i > 0 && j > 0) {
153
+
154
+ // If current objects in X[] and Y are same,
155
+ // then current object is part of LCS
156
+ if (ACC(i - 1, j - 1))
157
+ {
158
+ // Put the stored object in result
159
+ // Note: we push instead of unshift
160
+ // Note: reverse the vector later
161
+ // ToDo: is deque more performant?
162
+ lcs.push_back(RES(i - 1, j - 1));
163
+ // reduce values of i, j and index
164
+ i -= 1; j -= 1; index -= 1;
165
+ }
166
+
167
+ // If not same, then find the larger of two and
168
+ // go in the direction of larger value
169
+ else if (LEN(i - 1, j) > LEN(i, j - 1)) {
170
+ i--;
171
+ }
172
+ else {
173
+ j--;
174
+ }
175
+
176
+ }
177
+
178
+ // reverse now as we used push_back
179
+ std::reverse(lcs.begin(), lcs.end());
180
+
181
+ // Delete temp memory on heap
182
+ delete[] len;
183
+ delete[] acc;
184
+ delete[] res;
185
+
186
+ #undef LEN
187
+ #undef ACC
188
+ #undef RES
189
+
190
+ return lcs;
191
+ }
192
+ // EO lcs
193
+
194
+ // ##########################################################################
195
+ // ##########################################################################
196
+
197
+ }
198
+
199
+ #endif
@@ -1,27 +1,286 @@
1
1
  #ifndef SASS_DEBUGGER_H
2
2
  #define SASS_DEBUGGER_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
8
+ #include <queue>
9
+ #include <vector>
4
10
  #include <string>
5
11
  #include <sstream>
6
- #include "node.hpp"
12
+ #include "ast.hpp"
7
13
  #include "ast_fwd_decl.hpp"
14
+ #include "extension.hpp"
15
+
16
+ #include "ordered_map.hpp"
8
17
 
9
18
  using namespace Sass;
10
19
 
11
20
  inline void debug_ast(AST_Node* node, std::string ind = "", Env* env = 0);
12
21
 
13
- inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0) {
14
- debug_ast(const_cast<AST_Node*>(node), ind, env);
22
+ inline std::string debug_vec(const AST_Node* node) {
23
+ if (node == NULL) return "null";
24
+ else return node->to_string();
15
25
  }
16
26
 
17
- inline void debug_sources_set(ComplexSelectorSet& set, std::string ind = "")
18
- {
19
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
20
- for(auto const &pair : set) {
21
- debug_ast(pair, ind + "");
22
- // debug_ast(set[pair], ind + "first: ");
27
+ inline std::string debug_dude(std::vector<std::vector<int>> vec) {
28
+ std::stringstream 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 std::string debug_vec(std::string& str) {
48
+ return str;
49
+ }
50
+
51
+ inline std::string debug_vec(Extension& ext) {
52
+ std::stringstream 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 std::string debug_vec(std::vector<T> vec) {
65
+ std::stringstream 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 std::string debug_vec(std::queue<T> vec) {
77
+ std::stringstream 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 std::string debug_vec(std::map<T, U, O> vec) {
89
+ std::stringstream 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 std::string debug_vec(const ordered_map<T, U, O, V>& vec) {
106
+ std::stringstream 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 std::string debug_vec(std::unordered_map<T, U, O, V> vec) {
122
+ std::stringstream 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 std::string debug_keys(std::unordered_map<T, U, O, V> vec) {
139
+ std::stringstream 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;
23
147
  }
24
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
148
+ out << "}";
149
+ return out.str();
150
+ }
151
+
152
+ inline std::string debug_vec(ExtListSelSet& vec) {
153
+ std::stringstream 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 std::string debug_values(tsl::ordered_map<T, U, O, V> vec) {
169
+ std::stringstream 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 std::string debug_vec(tsl::ordered_map<T, U, O, V> vec) {
184
+ std::stringstream 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 std::string debug_vals(tsl::ordered_map<T, U, O, V> vec) {
201
+ std::stringstream 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 std::string debug_keys(tsl::ordered_map<T, U, O, V> vec) {
216
+ std::stringstream 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 std::string debug_vec(std::set<T, U> vec) {
232
+ std::stringstream 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 std::string debug_vec(tsl::ordered_set<T, U, O, V> vec) {
247
+ std::stringstream 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 std::string debug_vec(std::unordered_set<T, U, O, V> vec) {
262
+ std::stringstream 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 std::string debug_bool(bool val) {
275
+ return val ? "true" : "false";
276
+ }
277
+ inline std::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, std::string ind = "", Env* env = 0) {
283
+ debug_ast(const_cast<AST_Node*>(node), ind, env);
25
284
  }
26
285
 
27
286
  inline std::string str_replace(std::string str, const std::string& oldStr, const std::string& newStr)
@@ -53,7 +312,7 @@ inline std::string pstate_source_position(AST_Node* node)
53
312
  std::stringstream str;
54
313
  Position start(node->pstate());
55
314
  Position end(start + node->pstate().offset);
56
- str << (start.file == std::string::npos ? -1 : start.file)
315
+ str << (start.file == std::string::npos ? 99999999 : start.file)
57
316
  << "@[" << start.line << ":" << start.column << "]"
58
317
  << "-[" << end.line << ":" << end.column << "]";
59
318
  #ifdef DEBUG_SHARED_PTR
@@ -90,127 +349,95 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
90
349
  std::cerr << std::endl;
91
350
  debug_ast(root_block->expression(), ind + ":", env);
92
351
  debug_ast(root_block->block(), ind + " ", env);
93
- } else if (Cast<Selector_List>(node)) {
94
- Selector_List* selector = Cast<Selector_List>(node);
95
- std::cerr << ind << "Selector_List " << selector;
352
+ } else if (Cast<SelectorList>(node)) {
353
+ SelectorList* selector = Cast<SelectorList>(node);
354
+ std::cerr << ind << "SelectorList " << selector;
96
355
  std::cerr << " (" << pstate_source_position(node) << ")";
97
356
  std::cerr << " <" << selector->hash() << ">";
98
- std::cerr << " [@media:" << selector->media_block() << "]";
99
- std::cerr << (selector->is_invisible() ? " [INVISIBLE]": " -");
100
- std::cerr << (selector->has_placeholder() ? " [PLACEHOLDER]": " -");
101
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
102
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
103
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
104
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
357
+ std::cerr << (selector->is_invisible() ? " [is_invisible]" : " -");
358
+ std::cerr << (selector->isInvisible() ? " [isInvisible]" : " -");
359
+ std::cerr << (selector->has_real_parent_ref() ? " [real-parent]": " -");
105
360
  std::cerr << std::endl;
106
- debug_ast(selector->schema(), ind + "#{} ");
107
361
 
108
- for(const Complex_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
362
+ for(const ComplexSelector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
109
363
 
110
- // } else if (Cast<Expression>(node)) {
111
- // Expression* expression = Cast<Expression>(node);
112
- // std::cerr << ind << "Expression " << expression << " " << expression->concrete_type() << std::endl;
364
+ } else if (Cast<ComplexSelector>(node)) {
365
+ ComplexSelector* selector = Cast<ComplexSelector>(node);
366
+ std::cerr << ind << "ComplexSelector " << selector
367
+ << " (" << pstate_source_position(node) << ")"
368
+ << " <" << selector->hash() << ">"
369
+ << " [" << (selector->chroots() ? "CHROOT" : "CONNECT") << "]"
370
+ << " [length:" << longToHex(selector->length()) << "]"
371
+ << " [weight:" << longToHex(selector->specificity()) << "]"
372
+ << (selector->is_invisible() ? " [is_invisible]" : " -")
373
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
374
+ << (selector->hasPreLineFeed() ? " [hasPreLineFeed]" : " -")
113
375
 
114
- } else if (Cast<Parent_Reference>(node)) {
115
- Parent_Reference* selector = Cast<Parent_Reference>(node);
116
- std::cerr << ind << "Parent_Reference " << selector;
117
- // if (selector->not_selector()) cerr << " [in_declaration]";
118
- std::cerr << " (" << pstate_source_position(node) << ")";
119
- std::cerr << " <" << selector->hash() << ">";
120
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
121
- // debug_ast(selector->selector(), ind + "->", env);
376
+ // << (selector->is_invisible() ? " [INVISIBLE]": " -")
377
+ // << (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
378
+ // << (selector->is_optional() ? " [is_optional]": " -")
379
+ << (selector->has_real_parent_ref() ? " [real parent]": " -")
380
+ // << (selector->has_line_feed() ? " [line-feed]": " -")
381
+ // << (selector->has_line_break() ? " [line-break]": " -")
382
+ << " -- \n";
122
383
 
123
- } else if (Cast<Parent_Selector>(node)) {
124
- Parent_Selector* selector = Cast<Parent_Selector>(node);
125
- std::cerr << ind << "Parent_Selector " << selector;
126
- // if (selector->not_selector()) cerr << " [in_declaration]";
127
- std::cerr << " (" << pstate_source_position(node) << ")";
128
- std::cerr << " <" << selector->hash() << ">";
129
- std::cerr << " [" << (selector->real() ? "REAL" : "FAKE") << "]";
130
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
131
- // debug_ast(selector->selector(), ind + "->", env);
384
+ for(const SelectorComponentObj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
132
385
 
133
- } else if (Cast<Complex_Selector>(node)) {
134
- Complex_Selector* selector = Cast<Complex_Selector>(node);
135
- std::cerr << ind << "Complex_Selector " << selector
386
+ } else if (Cast<SelectorCombinator>(node)) {
387
+ SelectorCombinator* selector = Cast<SelectorCombinator>(node);
388
+ std::cerr << ind << "SelectorCombinator " << selector
136
389
  << " (" << pstate_source_position(node) << ")"
137
390
  << " <" << selector->hash() << ">"
138
- << " [length:" << longToHex(selector->length()) << "]"
139
391
  << " [weight:" << longToHex(selector->specificity()) << "]"
140
- << " [@media:" << selector->media_block() << "]"
141
- << (selector->is_invisible() ? " [INVISIBLE]": " -")
142
- << (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
143
- << (selector->is_optional() ? " [is_optional]": " -")
144
- << (selector->has_parent_ref() ? " [has parent]": " -")
145
- << (selector->has_line_feed() ? " [line-feed]": " -")
146
- << (selector->has_line_break() ? " [line-break]": " -")
392
+ << (selector->has_real_parent_ref() ? " [real parent]": " -")
147
393
  << " -- ";
394
+
148
395
  std::string del;
149
396
  switch (selector->combinator()) {
150
- case Complex_Selector::PARENT_OF: del = ">"; break;
151
- case Complex_Selector::PRECEDES: del = "~"; break;
152
- case Complex_Selector::ADJACENT_TO: del = "+"; break;
153
- case Complex_Selector::ANCESTOR_OF: del = " "; break;
154
- case Complex_Selector::REFERENCE: del = "//"; break;
397
+ case SelectorCombinator::CHILD: del = ">"; break;
398
+ case SelectorCombinator::GENERAL: del = "~"; break;
399
+ case SelectorCombinator::ADJACENT: del = "+"; break;
155
400
  }
156
- // if (del = "/") del += selector->reference()->perform(&to_string) + "/";
157
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
158
- debug_ast(selector->head(), ind + " " /* + "[" + del + "]" */, env);
159
- if (selector->tail()) {
160
- debug_ast(selector->tail(), ind + "{" + del + "}", env);
161
- } else if(del != " ") {
162
- std::cerr << ind << " |" << del << "| {trailing op}" << std::endl;
163
- }
164
- ComplexSelectorSet set = selector->sources();
165
- // debug_sources_set(set, ind + " @--> ");
166
- } else if (Cast<Compound_Selector>(node)) {
167
- Compound_Selector* selector = Cast<Compound_Selector>(node);
168
- std::cerr << ind << "Compound_Selector " << selector;
401
+
402
+ std::cerr << "[" << del << "]" << "\n";
403
+
404
+ } else if (Cast<CompoundSelector>(node)) {
405
+ CompoundSelector* selector = Cast<CompoundSelector>(node);
406
+ std::cerr << ind << "CompoundSelector " << selector;
169
407
  std::cerr << " (" << pstate_source_position(node) << ")";
170
408
  std::cerr << " <" << selector->hash() << ">";
409
+ std::cerr << (selector->hasRealParent() ? " [REAL PARENT]" : "") << ">";
171
410
  std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
172
- std::cerr << " [@media:" << selector->media_block() << "]";
173
- std::cerr << (selector->extended() ? " [extended]": " -");
174
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
175
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
176
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
177
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
178
- std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
179
- for(const Simple_Selector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
180
- } else if (Cast<Wrapped_Selector>(node)) {
181
- Wrapped_Selector* selector = Cast<Wrapped_Selector>(node);
182
- std::cerr << ind << "Wrapped_Selector " << selector;
411
+ std::cerr << (selector->hasPostLineBreak() ? " [hasPostLineBreak]" : " -");
412
+ std::cerr << (selector->is_invisible() ? " [is_invisible]" : " -");
413
+ std::cerr << (selector->isInvisible() ? " [isInvisible]" : " -");
414
+ std::cerr << "\n";
415
+ for(const SimpleSelector_Obj& i : selector->elements()) { debug_ast(i, ind + " ", env); }
416
+
417
+ } else if (Cast<Parent_Reference>(node)) {
418
+ Parent_Reference* selector = Cast<Parent_Reference>(node);
419
+ std::cerr << ind << "Parent_Reference " << selector;
183
420
  std::cerr << " (" << pstate_source_position(node) << ")";
184
421
  std::cerr << " <" << selector->hash() << ">";
185
- std::cerr << " <<" << selector->ns_name() << ">>";
186
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
187
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
188
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
189
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
190
- std::cerr << std::endl;
191
- debug_ast(selector->selector(), ind + " () ", env);
422
+ std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
423
+
192
424
  } else if (Cast<Pseudo_Selector>(node)) {
193
425
  Pseudo_Selector* selector = Cast<Pseudo_Selector>(node);
194
426
  std::cerr << ind << "Pseudo_Selector " << selector;
195
427
  std::cerr << " (" << pstate_source_position(node) << ")";
196
428
  std::cerr << " <" << selector->hash() << ">";
197
429
  std::cerr << " <<" << selector->ns_name() << ">>";
198
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
199
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
200
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
201
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
430
+ std::cerr << (selector->isClass() ? " [isClass]": " -");
431
+ std::cerr << (selector->isSyntacticClass() ? " [isSyntacticClass]": " -");
202
432
  std::cerr << std::endl;
203
- debug_ast(selector->expression(), ind + " <= ", env);
433
+ debug_ast(selector->argument(), ind + " <= ", env);
434
+ debug_ast(selector->selector(), ind + " || ", env);
204
435
  } else if (Cast<Attribute_Selector>(node)) {
205
436
  Attribute_Selector* selector = Cast<Attribute_Selector>(node);
206
437
  std::cerr << ind << "Attribute_Selector " << selector;
207
438
  std::cerr << " (" << pstate_source_position(node) << ")";
208
439
  std::cerr << " <" << selector->hash() << ">";
209
440
  std::cerr << " <<" << selector->ns_name() << ">>";
210
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
211
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
212
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
213
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
214
441
  std::cerr << std::endl;
215
442
  debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
216
443
  } else if (Cast<Class_Selector>(node)) {
@@ -219,10 +446,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
219
446
  std::cerr << " (" << pstate_source_position(node) << ")";
220
447
  std::cerr << " <" << selector->hash() << ">";
221
448
  std::cerr << " <<" << selector->ns_name() << ">>";
222
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
223
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
224
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
225
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
226
449
  std::cerr << std::endl;
227
450
  } else if (Cast<Id_Selector>(node)) {
228
451
  Id_Selector* selector = Cast<Id_Selector>(node);
@@ -230,10 +453,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
230
453
  std::cerr << " (" << pstate_source_position(node) << ")";
231
454
  std::cerr << " <" << selector->hash() << ">";
232
455
  std::cerr << " <<" << selector->ns_name() << ">>";
233
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
234
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
235
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
236
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
237
456
  std::cerr << std::endl;
238
457
  } else if (Cast<Type_Selector>(node)) {
239
458
  Type_Selector* selector = Cast<Type_Selector>(node);
@@ -241,10 +460,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
241
460
  std::cerr << " (" << pstate_source_position(node) << ")";
242
461
  std::cerr << " <" << selector->hash() << ">";
243
462
  std::cerr << " <<" << selector->ns_name() << ">>";
244
- std::cerr << (selector->is_optional() ? " [is_optional]": " -");
245
- std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
246
- std::cerr << (selector->has_line_break() ? " [line-break]": " -");
247
- std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
248
463
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
249
464
  std::cerr << std::endl;
250
465
  } else if (Cast<Placeholder_Selector>(node)) {
@@ -253,23 +468,18 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
253
468
  std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector;
254
469
  std::cerr << " (" << pstate_source_position(selector) << ")"
255
470
  << " <" << selector->hash() << ">"
256
- << " [@media:" << selector->media_block() << "]"
257
- << (selector->is_optional() ? " [is_optional]": " -")
258
- << (selector->has_line_break() ? " [line-break]": " -")
259
- << (selector->has_line_feed() ? " [line-feed]": " -")
471
+ << (selector->isInvisible() ? " [isInvisible]" : " -")
260
472
  << std::endl;
261
473
 
262
- } else if (Cast<Simple_Selector>(node)) {
263
- Simple_Selector* selector = Cast<Simple_Selector>(node);
264
- std::cerr << ind << "Simple_Selector " << selector;
474
+ } else if (Cast<SimpleSelector>(node)) {
475
+ SimpleSelector* selector = Cast<SimpleSelector>(node);
476
+ std::cerr << ind << "SimpleSelector " << selector;
265
477
  std::cerr << " (" << pstate_source_position(node) << ")";
266
- std::cerr << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << std::endl;
267
478
 
268
479
  } else if (Cast<Selector_Schema>(node)) {
269
480
  Selector_Schema* selector = Cast<Selector_Schema>(node);
270
481
  std::cerr << ind << "Selector_Schema " << selector;
271
482
  std::cerr << " (" << pstate_source_position(node) << ")"
272
- << " [@media:" << selector->media_block() << "]"
273
483
  << (selector->connect_parent() ? " [connect-parent]": " -")
274
484
  << std::endl;
275
485
 
@@ -279,9 +489,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
279
489
  } else if (Cast<Selector>(node)) {
280
490
  Selector* selector = Cast<Selector>(node);
281
491
  std::cerr << ind << "Selector " << selector;
282
- std::cerr << " (" << pstate_source_position(node) << ")";
283
- std::cerr << (selector->has_line_break() ? " [line-break]": " -")
284
- << (selector->has_line_feed() ? " [line-feed]": " -")
492
+ std::cerr << " (" << pstate_source_position(node) << ")"
285
493
  << std::endl;
286
494
 
287
495
  } else if (Cast<Media_Query_Expression>(node)) {
@@ -302,14 +510,33 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
302
510
  << std::endl;
303
511
  debug_ast(block->media_type(), ind + " ");
304
512
  for(const auto& i : block->elements()) { debug_ast(i, ind + " ", env); }
305
-
306
- } else if (Cast<Media_Block>(node)) {
307
- Media_Block* block = Cast<Media_Block>(node);
308
- std::cerr << ind << "Media_Block " << block;
309
- std::cerr << " (" << pstate_source_position(node) << ")";
310
- std::cerr << " " << block->tabs() << std::endl;
311
- debug_ast(block->media_queries(), ind + " =@ ");
312
- if (block->block()) for(const Statement_Obj& i : block->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;
313
540
  } else if (Cast<Supports_Block>(node)) {
314
541
  Supports_Block* block = Cast<Supports_Block>(node);
315
542
  std::cerr << ind << "Supports_Block " << block;
@@ -349,6 +576,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
349
576
  std::cerr << ind << "Block " << root_block;
350
577
  std::cerr << " (" << pstate_source_position(node) << ")";
351
578
  if (root_block->is_root()) std::cerr << " [root]";
579
+ if (root_block->isInvisible()) std::cerr << " [isInvisible]";
352
580
  std::cerr << " " << root_block->tabs() << std::endl;
353
581
  for(const Statement_Obj& i : root_block->elements()) { debug_ast(i, ind + " ", env); }
354
582
  } else if (Cast<Warning>(node)) {
@@ -387,10 +615,11 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
387
615
  Return* block = Cast<Return>(node);
388
616
  std::cerr << ind << "Return " << block;
389
617
  std::cerr << " (" << pstate_source_position(node) << ")";
390
- std::cerr << " " << block->tabs() << std::endl;
391
- } else if (Cast<Extension>(node)) {
392
- Extension* block = Cast<Extension>(node);
393
- std::cerr << ind << "Extension " << block;
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;
394
623
  std::cerr << " (" << pstate_source_position(node) << ")";
395
624
  std::cerr << " " << block->tabs() << std::endl;
396
625
  debug_ast(block->selector(), ind + "-> ", env);
@@ -724,54 +953,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
724
953
  if (ind == "") std::cerr << "####################################################################\n";
725
954
  }
726
955
 
727
- inline void debug_node(Node* node, std::string ind = "")
728
- {
729
- if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
730
- if (node->isCombinator()) {
731
- std::cerr << ind;
732
- std::cerr << "Combinator ";
733
- std::cerr << node << " ";
734
- if (node->got_line_feed) std::cerr << "[LF] ";
735
- switch (node->combinator()) {
736
- case Complex_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
737
- case Complex_Selector::PARENT_OF: std::cerr << "{>} "; break;
738
- case Complex_Selector::PRECEDES: std::cerr << "{~} "; break;
739
- case Complex_Selector::REFERENCE: std::cerr << "{@} "; break;
740
- case Complex_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
741
- }
742
- std::cerr << std::endl;
743
- // debug_ast(node->combinator(), ind + " ");
744
- } else if (node->isSelector()) {
745
- std::cerr << ind;
746
- std::cerr << "Selector ";
747
- std::cerr << node << " ";
748
- if (node->got_line_feed) std::cerr << "[LF] ";
749
- std::cerr << std::endl;
750
- debug_ast(node->selector(), ind + " ");
751
- } else if (node->isCollection()) {
752
- std::cerr << ind;
753
- std::cerr << "Collection ";
754
- std::cerr << node << " ";
755
- if (node->got_line_feed) std::cerr << "[LF] ";
756
- std::cerr << std::endl;
757
- for(auto n : (*node->collection())) {
758
- debug_node(&n, ind + " ");
759
- }
760
- } else if (node->isNil()) {
761
- std::cerr << ind;
762
- std::cerr << "Nil ";
763
- std::cerr << node << " ";
764
- if (node->got_line_feed) std::cerr << "[LF] ";
765
- std::cerr << std::endl;
766
- } else {
767
- std::cerr << ind;
768
- std::cerr << "OTHER ";
769
- std::cerr << node << " ";
770
- if (node->got_line_feed) std::cerr << "[LF] ";
771
- std::cerr << std::endl;
772
- }
773
- if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
774
- }
775
956
 
776
957
  /*
777
958
  inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0)
@@ -779,29 +960,5 @@ inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0)
779
960
  debug_ast(const_cast<AST_Node*>(node), ind, env);
780
961
  }
781
962
  */
782
- inline void debug_node(const Node* node, std::string ind = "")
783
- {
784
- debug_node(const_cast<Node*>(node), ind);
785
- }
786
-
787
- inline void debug_subset_map(Sass::Subset_Map& map, std::string ind = "")
788
- {
789
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
790
- for(auto const &it : map.values()) {
791
- debug_ast(it.first, ind + "first: ");
792
- debug_ast(it.second, ind + "second: ");
793
- }
794
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
795
- }
796
-
797
- inline void debug_subset_entries(SubSetMapPairs* entries, std::string ind = "")
798
- {
799
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
800
- for(auto const &pair : *entries) {
801
- debug_ast(pair.first, ind + "first: ");
802
- debug_ast(pair.second, ind + "second: ");
803
- }
804
- if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
805
- }
806
963
 
807
964
  #endif // SASS_DEBUGGER