sassc 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -0,0 +1,33 @@
1
+ #include "../sass.hpp"
2
+ #include <iostream>
3
+ #include <typeinfo>
4
+
5
+ #include "shared_ptr.hpp"
6
+ #include "../ast_fwd_decl.hpp"
7
+
8
+ #ifdef DEBUG_SHARED_PTR
9
+ #include "../debugger.hpp"
10
+ #endif
11
+
12
+ namespace Sass {
13
+
14
+ #ifdef DEBUG_SHARED_PTR
15
+ void SharedObj::dumpMemLeaks() {
16
+ if (!all.empty()) {
17
+ std::cerr << "###################################\n";
18
+ std::cerr << "# REPORTING MISSING DEALLOCATIONS #\n";
19
+ std::cerr << "###################################\n";
20
+ for (SharedObj* var : all) {
21
+ if (AST_Node* ast = dynamic_cast<AST_Node*>(var)) {
22
+ debug_ast(ast);
23
+ } else {
24
+ std::cerr << "LEAKED " << var << "\n";
25
+ }
26
+ }
27
+ }
28
+ }
29
+ sass::vector<SharedObj*> SharedObj::all;
30
+ #endif
31
+
32
+ bool SharedObj::taint = false;
33
+ }
@@ -0,0 +1,332 @@
1
+ #ifndef SASS_MEMORY_SHARED_PTR_H
2
+ #define SASS_MEMORY_SHARED_PTR_H
3
+
4
+ #include "sass/base.h"
5
+
6
+ #include "../sass.hpp"
7
+ #include "allocator.hpp"
8
+ #include <cstddef>
9
+ #include <iostream>
10
+ #include <string>
11
+ #include <type_traits>
12
+ #include <vector>
13
+
14
+ // https://lokiastari.com/blog/2014/12/30/c-plus-plus-by-example-smart-pointer/index.html
15
+ // https://lokiastari.com/blog/2015/01/15/c-plus-plus-by-example-smart-pointer-part-ii/index.html
16
+ // https://lokiastari.com/blog/2015/01/23/c-plus-plus-by-example-smart-pointer-part-iii/index.html
17
+
18
+ namespace Sass {
19
+
20
+ // Forward declaration
21
+ class SharedPtr;
22
+
23
+ ///////////////////////////////////////////////////////////////////////////////
24
+ // Use macros for the allocation task, since overloading operator `new`
25
+ // has been proven to be flaky under certain compilers (see comment below).
26
+ ///////////////////////////////////////////////////////////////////////////////
27
+
28
+ #ifdef DEBUG_SHARED_PTR
29
+
30
+ #define SASS_MEMORY_NEW(Class, ...) \
31
+ ((Class*)(new Class(__VA_ARGS__))->trace(__FILE__, __LINE__)) \
32
+
33
+ #define SASS_MEMORY_COPY(obj) \
34
+ ((obj)->copy(__FILE__, __LINE__)) \
35
+
36
+ #define SASS_MEMORY_CLONE(obj) \
37
+ ((obj)->clone(__FILE__, __LINE__)) \
38
+
39
+ #else
40
+
41
+ #define SASS_MEMORY_NEW(Class, ...) \
42
+ new Class(__VA_ARGS__) \
43
+
44
+ #define SASS_MEMORY_COPY(obj) \
45
+ ((obj)->copy()) \
46
+
47
+ #define SASS_MEMORY_CLONE(obj) \
48
+ ((obj)->clone()) \
49
+
50
+ #endif
51
+
52
+ // SharedObj is the base class for all objects that can be stored as a shared object
53
+ // It adds the reference counter and other values directly to the objects
54
+ // This gives a slight overhead when directly used as a stack object, but has some
55
+ // advantages for our code. It is safe to create two shared pointers from the same
56
+ // objects, as the "control block" is directly attached to it. This would lead
57
+ // to undefined behavior with std::shared_ptr. This also avoids the need to
58
+ // allocate additional control blocks and/or the need to dereference two
59
+ // pointers on each operation. This can be optimized in `std::shared_ptr`
60
+ // too by using `std::make_shared` (where the control block and the actual
61
+ // object are allocated in one continuous memory block via one single call).
62
+ class SharedObj {
63
+ public:
64
+ SharedObj() : refcount(0), detached(false) {
65
+ #ifdef DEBUG_SHARED_PTR
66
+ if (taint) all.push_back(this);
67
+ #endif
68
+ }
69
+ virtual ~SharedObj() {
70
+ #ifdef DEBUG_SHARED_PTR
71
+ for (size_t i = 0; i < all.size(); i++) {
72
+ if (all[i] == this) {
73
+ all.erase(all.begin() + i);
74
+ break;
75
+ }
76
+ }
77
+ #endif
78
+ }
79
+
80
+ #ifdef DEBUG_SHARED_PTR
81
+ static void dumpMemLeaks();
82
+ SharedObj* trace(sass::string file, size_t line) {
83
+ this->file = file;
84
+ this->line = line;
85
+ return this;
86
+ }
87
+ sass::string getDbgFile() { return file; }
88
+ size_t getDbgLine() { return line; }
89
+ void setDbg(bool dbg) { this->dbg = dbg; }
90
+ size_t getRefCount() const { return refcount; }
91
+ #endif
92
+
93
+ static void setTaint(bool val) { taint = val; }
94
+
95
+ #ifdef SASS_CUSTOM_ALLOCATOR
96
+ inline void* operator new(size_t nbytes) {
97
+ return allocateMem(nbytes);
98
+ }
99
+ inline void operator delete(void* ptr) {
100
+ return deallocateMem(ptr);
101
+ }
102
+ #endif
103
+
104
+ virtual sass::string to_string() const = 0;
105
+ protected:
106
+ friend class SharedPtr;
107
+ friend class Memory_Manager;
108
+ size_t refcount;
109
+ bool detached;
110
+ static bool taint;
111
+ #ifdef DEBUG_SHARED_PTR
112
+ sass::string file;
113
+ size_t line;
114
+ bool dbg = false;
115
+ static sass::vector<SharedObj*> all;
116
+ #endif
117
+ };
118
+
119
+ // SharedPtr is a intermediate (template-less) base class for SharedImpl.
120
+ // ToDo: there should be a way to include this in SharedImpl and to get
121
+ // ToDo: rid of all the static_cast that are now needed in SharedImpl.
122
+ class SharedPtr {
123
+ public:
124
+ SharedPtr() : node(nullptr) {}
125
+ SharedPtr(SharedObj* ptr) : node(ptr) {
126
+ incRefCount();
127
+ }
128
+ SharedPtr(const SharedPtr& obj) : SharedPtr(obj.node) {}
129
+ ~SharedPtr() {
130
+ decRefCount();
131
+ }
132
+
133
+ SharedPtr& operator=(SharedObj* other_node) {
134
+ if (node != other_node) {
135
+ decRefCount();
136
+ node = other_node;
137
+ incRefCount();
138
+ } else if (node != nullptr) {
139
+ node->detached = false;
140
+ }
141
+ return *this;
142
+ }
143
+
144
+ SharedPtr& operator=(const SharedPtr& obj) {
145
+ return *this = obj.node;
146
+ }
147
+
148
+ // Prevents all SharedPtrs from freeing this node until it is assigned to another SharedPtr.
149
+ SharedObj* detach() {
150
+ if (node != nullptr) node->detached = true;
151
+ #ifdef DEBUG_SHARED_PTR
152
+ if (node->dbg) {
153
+ std::cerr << "DETACHING NODE\n";
154
+ }
155
+ #endif
156
+ return node;
157
+ }
158
+
159
+ SharedObj* obj() const { return node; }
160
+ SharedObj* operator->() const { return node; }
161
+ bool isNull() const { return node == nullptr; }
162
+ operator bool() const { return node != nullptr; }
163
+
164
+ protected:
165
+ SharedObj* node;
166
+ void decRefCount() {
167
+ if (node == nullptr) return;
168
+ --node->refcount;
169
+ #ifdef DEBUG_SHARED_PTR
170
+ if (node->dbg) std::cerr << "- " << node << " X " << node->refcount << " (" << this << ") " << "\n";
171
+ #endif
172
+ if (node->refcount == 0 && !node->detached) {
173
+ #ifdef DEBUG_SHARED_PTR
174
+ if (node->dbg) std::cerr << "DELETE NODE " << node << "\n";
175
+ #endif
176
+ delete node;
177
+ }
178
+ else if (node->refcount == 0) {
179
+ #ifdef DEBUG_SHARED_PTR
180
+ if (node->dbg) std::cerr << "NODE EVAEDED DELETE " << node << "\n";
181
+ #endif
182
+ }
183
+ }
184
+ void incRefCount() {
185
+ if (node == nullptr) return;
186
+ node->detached = false;
187
+ ++node->refcount;
188
+ #ifdef DEBUG_SHARED_PTR
189
+ if (node->dbg) std::cerr << "+ " << node << " X " << node->refcount << " (" << this << ") " << "\n";
190
+ #endif
191
+ }
192
+ };
193
+
194
+ template <class T>
195
+ class SharedImpl : private SharedPtr {
196
+
197
+ public:
198
+ SharedImpl() : SharedPtr(nullptr) {}
199
+
200
+ template <class U>
201
+ SharedImpl(U* node) :
202
+ SharedPtr(static_cast<T*>(node)) {}
203
+
204
+ template <class U>
205
+ SharedImpl(const SharedImpl<U>& impl) :
206
+ SharedImpl(impl.ptr()) {}
207
+
208
+ template <class U>
209
+ SharedImpl<T>& operator=(U *rhs) {
210
+ return static_cast<SharedImpl<T>&>(
211
+ SharedPtr::operator=(static_cast<T*>(rhs)));
212
+ }
213
+
214
+ template <class U>
215
+ SharedImpl<T>& operator=(const SharedImpl<U>& rhs) {
216
+ return static_cast<SharedImpl<T>&>(
217
+ SharedPtr::operator=(static_cast<const SharedImpl<T>&>(rhs)));
218
+ }
219
+
220
+ operator sass::string() const {
221
+ if (node) return node->to_string();
222
+ return "null";
223
+ }
224
+
225
+ using SharedPtr::isNull;
226
+ using SharedPtr::operator bool;
227
+ operator T*() const { return static_cast<T*>(this->obj()); }
228
+ operator T&() const { return *static_cast<T*>(this->obj()); }
229
+ T& operator* () const { return *static_cast<T*>(this->obj()); };
230
+ T* operator-> () const { return static_cast<T*>(this->obj()); };
231
+ T* ptr () const { return static_cast<T*>(this->obj()); };
232
+ T* detach() { return static_cast<T*>(SharedPtr::detach()); }
233
+
234
+ };
235
+
236
+ // Comparison operators, based on:
237
+ // https://en.cppreference.com/w/cpp/memory/unique_ptr/operator_cmp
238
+
239
+ template<class T1, class T2>
240
+ bool operator==(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
241
+ return x.ptr() == y.ptr();
242
+ }
243
+
244
+ template<class T1, class T2>
245
+ bool operator!=(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
246
+ return x.ptr() != y.ptr();
247
+ }
248
+
249
+ template<class T1, class T2>
250
+ bool operator<(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
251
+ using CT = typename std::common_type<T1*, T2*>::type;
252
+ return std::less<CT>()(x.get(), y.get());
253
+ }
254
+
255
+ template<class T1, class T2>
256
+ bool operator<=(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
257
+ return !(y < x);
258
+ }
259
+
260
+ template<class T1, class T2>
261
+ bool operator>(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
262
+ return y < x;
263
+ }
264
+
265
+ template<class T1, class T2>
266
+ bool operator>=(const SharedImpl<T1>& x, const SharedImpl<T2>& y) {
267
+ return !(x < y);
268
+ }
269
+
270
+ template <class T>
271
+ bool operator==(const SharedImpl<T>& x, std::nullptr_t) noexcept {
272
+ return x.isNull();
273
+ }
274
+
275
+ template <class T>
276
+ bool operator==(std::nullptr_t, const SharedImpl<T>& x) noexcept {
277
+ return x.isNull();
278
+ }
279
+
280
+ template <class T>
281
+ bool operator!=(const SharedImpl<T>& x, std::nullptr_t) noexcept {
282
+ return !x.isNull();
283
+ }
284
+
285
+ template <class T>
286
+ bool operator!=(std::nullptr_t, const SharedImpl<T>& x) noexcept {
287
+ return !x.isNull();
288
+ }
289
+
290
+ template <class T>
291
+ bool operator<(const SharedImpl<T>& x, std::nullptr_t) {
292
+ return std::less<T*>()(x.get(), nullptr);
293
+ }
294
+
295
+ template <class T>
296
+ bool operator<(std::nullptr_t, const SharedImpl<T>& y) {
297
+ return std::less<T*>()(nullptr, y.get());
298
+ }
299
+
300
+ template <class T>
301
+ bool operator<=(const SharedImpl<T>& x, std::nullptr_t) {
302
+ return !(nullptr < x);
303
+ }
304
+
305
+ template <class T>
306
+ bool operator<=(std::nullptr_t, const SharedImpl<T>& y) {
307
+ return !(y < nullptr);
308
+ }
309
+
310
+ template <class T>
311
+ bool operator>(const SharedImpl<T>& x, std::nullptr_t) {
312
+ return nullptr < x;
313
+ }
314
+
315
+ template <class T>
316
+ bool operator>(std::nullptr_t, const SharedImpl<T>& y) {
317
+ return y < nullptr;
318
+ }
319
+
320
+ template <class T>
321
+ bool operator>=(const SharedImpl<T>& x, std::nullptr_t) {
322
+ return !(x < nullptr);
323
+ }
324
+
325
+ template <class T>
326
+ bool operator>=(std::nullptr_t, const SharedImpl<T>& y) {
327
+ return !(nullptr < y);
328
+ }
329
+
330
+ } // namespace Sass
331
+
332
+ #endif
@@ -1,171 +1,221 @@
1
1
  #ifndef SASS_OPERATION_H
2
2
  #define SASS_OPERATION_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
+ // base classes to implement curiously recurring template pattern (CRTP)
9
+ // https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
10
+
11
+ #include <typeinfo>
12
+ #include <stdexcept>
13
+
4
14
  #include "ast_fwd_decl.hpp"
15
+ #include "ast_def_macros.hpp"
5
16
 
6
17
  namespace Sass {
7
18
 
19
+ #define ATTACH_ABSTRACT_CRTP_PERFORM_METHODS()\
20
+ virtual void perform(Operation<void>* op) = 0; \
21
+ virtual Value* perform(Operation<Value*>* op) = 0; \
22
+ virtual sass::string perform(Operation<sass::string>* op) = 0; \
23
+ virtual AST_Node* perform(Operation<AST_Node*>* op) = 0; \
24
+ virtual Selector* perform(Operation<Selector*>* op) = 0; \
25
+ virtual Statement* perform(Operation<Statement*>* op) = 0; \
26
+ virtual Expression* perform(Operation<Expression*>* op) = 0; \
27
+ virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) = 0; \
28
+ virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) = 0; \
29
+
30
+ // you must add operators to every class
31
+ // ensures `this` of actual instance type
32
+ // we therefore call the specific operator
33
+ // they are virtual so most specific is used
34
+ #define ATTACH_CRTP_PERFORM_METHODS()\
35
+ virtual void perform(Operation<void>* op) override { return (*op)(this); } \
36
+ virtual Value* perform(Operation<Value*>* op) override { return (*op)(this); } \
37
+ virtual sass::string perform(Operation<sass::string>* op) override { return (*op)(this); } \
38
+ virtual AST_Node* perform(Operation<AST_Node*>* op) override { return (*op)(this); } \
39
+ virtual Selector* perform(Operation<Selector*>* op) override { return (*op)(this); } \
40
+ virtual Statement* perform(Operation<Statement*>* op) override { return (*op)(this); } \
41
+ virtual Expression* perform(Operation<Expression*>* op) override { return (*op)(this); } \
42
+ virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) override { return (*op)(this); } \
43
+ virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) override { return (*op)(this); } \
44
+
8
45
  template<typename T>
9
46
  class Operation {
10
47
  public:
11
- virtual T operator()(AST_Node_Ptr x) = 0;
12
- virtual ~Operation() { }
48
+ virtual T operator()(AST_Node* x) = 0;
13
49
  // statements
14
- virtual T operator()(Block_Ptr x) = 0;
15
- virtual T operator()(Ruleset_Ptr x) = 0;
16
- virtual T operator()(Bubble_Ptr x) = 0;
17
- virtual T operator()(Trace_Ptr x) = 0;
18
- virtual T operator()(Supports_Block_Ptr x) = 0;
19
- virtual T operator()(Media_Block_Ptr x) = 0;
20
- virtual T operator()(At_Root_Block_Ptr x) = 0;
21
- virtual T operator()(Directive_Ptr x) = 0;
22
- virtual T operator()(Keyframe_Rule_Ptr x) = 0;
23
- virtual T operator()(Declaration_Ptr x) = 0;
24
- virtual T operator()(Assignment_Ptr x) = 0;
25
- virtual T operator()(Import_Ptr x) = 0;
26
- virtual T operator()(Import_Stub_Ptr x) = 0;
27
- virtual T operator()(Warning_Ptr x) = 0;
28
- virtual T operator()(Error_Ptr x) = 0;
29
- virtual T operator()(Debug_Ptr x) = 0;
30
- virtual T operator()(Comment_Ptr x) = 0;
31
- virtual T operator()(If_Ptr x) = 0;
32
- virtual T operator()(For_Ptr x) = 0;
33
- virtual T operator()(Each_Ptr x) = 0;
34
- virtual T operator()(While_Ptr x) = 0;
35
- virtual T operator()(Return_Ptr x) = 0;
36
- virtual T operator()(Content_Ptr x) = 0;
37
- virtual T operator()(Extension_Ptr x) = 0;
38
- virtual T operator()(Definition_Ptr x) = 0;
39
- virtual T operator()(Mixin_Call_Ptr x) = 0;
50
+ virtual T operator()(Block* x) = 0;
51
+ virtual T operator()(StyleRule* x) = 0;
52
+ virtual T operator()(Bubble* x) = 0;
53
+ virtual T operator()(Trace* x) = 0;
54
+ virtual T operator()(SupportsRule* x) = 0;
55
+ virtual T operator()(MediaRule* x) = 0;
56
+ virtual T operator()(CssMediaRule* x) = 0;
57
+ virtual T operator()(CssMediaQuery* x) = 0;
58
+ virtual T operator()(AtRootRule* x) = 0;
59
+ virtual T operator()(AtRule* x) = 0;
60
+ virtual T operator()(Keyframe_Rule* x) = 0;
61
+ virtual T operator()(Declaration* x) = 0;
62
+ virtual T operator()(Assignment* x) = 0;
63
+ virtual T operator()(Import* x) = 0;
64
+ virtual T operator()(Import_Stub* x) = 0;
65
+ virtual T operator()(WarningRule* x) = 0;
66
+ virtual T operator()(ErrorRule* x) = 0;
67
+ virtual T operator()(DebugRule* x) = 0;
68
+ virtual T operator()(Comment* x) = 0;
69
+ virtual T operator()(If* x) = 0;
70
+ virtual T operator()(ForRule* x) = 0;
71
+ virtual T operator()(EachRule* x) = 0;
72
+ virtual T operator()(WhileRule* x) = 0;
73
+ virtual T operator()(Return* x) = 0;
74
+ virtual T operator()(Content* x) = 0;
75
+ virtual T operator()(ExtendRule* x) = 0;
76
+ virtual T operator()(Definition* x) = 0;
77
+ virtual T operator()(Mixin_Call* x) = 0;
40
78
  // expressions
41
- virtual T operator()(List_Ptr x) = 0;
42
- virtual T operator()(Map_Ptr x) = 0;
43
- virtual T operator()(Function_Ptr x) = 0;
44
- virtual T operator()(Binary_Expression_Ptr x) = 0;
45
- virtual T operator()(Unary_Expression_Ptr x) = 0;
46
- virtual T operator()(Function_Call_Ptr x) = 0;
47
- virtual T operator()(Function_Call_Schema_Ptr x) = 0;
48
- virtual T operator()(Custom_Warning_Ptr x) = 0;
49
- virtual T operator()(Custom_Error_Ptr x) = 0;
50
- virtual T operator()(Variable_Ptr x) = 0;
51
- virtual T operator()(Number_Ptr x) = 0;
52
- virtual T operator()(Color_Ptr x) = 0;
53
- virtual T operator()(Boolean_Ptr x) = 0;
54
- virtual T operator()(String_Schema_Ptr x) = 0;
55
- virtual T operator()(String_Quoted_Ptr x) = 0;
56
- virtual T operator()(String_Constant_Ptr x) = 0;
57
- virtual T operator()(Supports_Condition_Ptr x) = 0;
58
- virtual T operator()(Supports_Operator_Ptr x) = 0;
59
- virtual T operator()(Supports_Negation_Ptr x) = 0;
60
- virtual T operator()(Supports_Declaration_Ptr x) = 0;
61
- virtual T operator()(Supports_Interpolation_Ptr x) = 0;
62
- virtual T operator()(Media_Query_Ptr x) = 0;
63
- virtual T operator()(Media_Query_Expression_Ptr x) = 0;
64
- virtual T operator()(At_Root_Query_Ptr x) = 0;
65
- virtual T operator()(Null_Ptr x) = 0;
66
- virtual T operator()(Parent_Selector_Ptr x) = 0;
79
+ virtual T operator()(Null* x) = 0;
80
+ virtual T operator()(List* x) = 0;
81
+ virtual T operator()(Map* x) = 0;
82
+ virtual T operator()(Function* x) = 0;
83
+ virtual T operator()(Binary_Expression* x) = 0;
84
+ virtual T operator()(Unary_Expression* x) = 0;
85
+ virtual T operator()(Function_Call* x) = 0;
86
+ virtual T operator()(Custom_Warning* x) = 0;
87
+ virtual T operator()(Custom_Error* x) = 0;
88
+ virtual T operator()(Variable* x) = 0;
89
+ virtual T operator()(Number* x) = 0;
90
+ virtual T operator()(Color* x) = 0;
91
+ virtual T operator()(Color_RGBA* x) = 0;
92
+ virtual T operator()(Color_HSLA* x) = 0;
93
+ virtual T operator()(Boolean* x) = 0;
94
+ virtual T operator()(String_Schema* x) = 0;
95
+ virtual T operator()(String_Quoted* x) = 0;
96
+ virtual T operator()(String_Constant* x) = 0;
97
+ virtual T operator()(SupportsCondition* x) = 0;
98
+ virtual T operator()(SupportsOperation* x) = 0;
99
+ virtual T operator()(SupportsNegation* x) = 0;
100
+ virtual T operator()(SupportsDeclaration* x) = 0;
101
+ virtual T operator()(Supports_Interpolation* x) = 0;
102
+ virtual T operator()(Media_Query* x) = 0;
103
+ virtual T operator()(Media_Query_Expression* x) = 0;
104
+ virtual T operator()(At_Root_Query* x) = 0;
105
+ virtual T operator()(Parent_Reference* x) = 0;
67
106
  // parameters and arguments
68
- virtual T operator()(Parameter_Ptr x) = 0;
69
- virtual T operator()(Parameters_Ptr x) = 0;
70
- virtual T operator()(Argument_Ptr x) = 0;
71
- virtual T operator()(Arguments_Ptr x) = 0;
107
+ virtual T operator()(Parameter* x) = 0;
108
+ virtual T operator()(Parameters* x) = 0;
109
+ virtual T operator()(Argument* x) = 0;
110
+ virtual T operator()(Arguments* x) = 0;
72
111
  // selectors
73
- virtual T operator()(Selector_Schema_Ptr x) = 0;
74
- virtual T operator()(Placeholder_Selector_Ptr x) = 0;
75
- virtual T operator()(Element_Selector_Ptr x) = 0;
76
- virtual T operator()(Class_Selector_Ptr x) = 0;
77
- virtual T operator()(Id_Selector_Ptr x) = 0;
78
- virtual T operator()(Attribute_Selector_Ptr x) = 0;
79
- virtual T operator()(Pseudo_Selector_Ptr x) = 0;
80
- virtual T operator()(Wrapped_Selector_Ptr x) = 0;
81
- virtual T operator()(Compound_Selector_Ptr x)= 0;
82
- virtual T operator()(Complex_Selector_Ptr x) = 0;
83
- virtual T operator()(Selector_List_Ptr x) = 0;
112
+ virtual T operator()(Selector_Schema* x) = 0;
113
+ virtual T operator()(PlaceholderSelector* x) = 0;
114
+ virtual T operator()(TypeSelector* x) = 0;
115
+ virtual T operator()(ClassSelector* x) = 0;
116
+ virtual T operator()(IDSelector* x) = 0;
117
+ virtual T operator()(AttributeSelector* x) = 0;
118
+ virtual T operator()(PseudoSelector* x) = 0;
119
+ virtual T operator()(SelectorComponent* x) = 0;
120
+ virtual T operator()(SelectorCombinator* x) = 0;
121
+ virtual T operator()(CompoundSelector* x) = 0;
122
+ virtual T operator()(ComplexSelector* x) = 0;
123
+ virtual T operator()(SelectorList* x) = 0;
84
124
 
85
- template <typename U>
86
- T fallback(U x) { return T(); }
87
125
  };
88
126
 
127
+ // example: Operation_CRTP<Expression*, Eval>
128
+ // T is the base return type of all visitors
129
+ // D is the class derived visitor class
130
+ // normally you want to implement all operators
89
131
  template <typename T, typename D>
90
132
  class Operation_CRTP : public Operation<T> {
91
133
  public:
92
- D& impl() { return static_cast<D&>(*this); }
93
- public:
94
- T operator()(AST_Node_Ptr x) { return static_cast<D*>(this)->fallback(x); }
134
+ T operator()(AST_Node* x) { return static_cast<D*>(this)->fallback(x); }
95
135
  // statements
96
- T operator()(Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
97
- T operator()(Ruleset_Ptr x) { return static_cast<D*>(this)->fallback(x); }
98
- T operator()(Bubble_Ptr x) { return static_cast<D*>(this)->fallback(x); }
99
- T operator()(Trace_Ptr x) { return static_cast<D*>(this)->fallback(x); }
100
- T operator()(Supports_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
101
- T operator()(Media_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
102
- T operator()(At_Root_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
103
- T operator()(Directive_Ptr x) { return static_cast<D*>(this)->fallback(x); }
104
- T operator()(Keyframe_Rule_Ptr x) { return static_cast<D*>(this)->fallback(x); }
105
- T operator()(Declaration_Ptr x) { return static_cast<D*>(this)->fallback(x); }
106
- T operator()(Assignment_Ptr x) { return static_cast<D*>(this)->fallback(x); }
107
- T operator()(Import_Ptr x) { return static_cast<D*>(this)->fallback(x); }
108
- T operator()(Import_Stub_Ptr x) { return static_cast<D*>(this)->fallback(x); }
109
- T operator()(Warning_Ptr x) { return static_cast<D*>(this)->fallback(x); }
110
- T operator()(Error_Ptr x) { return static_cast<D*>(this)->fallback(x); }
111
- T operator()(Debug_Ptr x) { return static_cast<D*>(this)->fallback(x); }
112
- T operator()(Comment_Ptr x) { return static_cast<D*>(this)->fallback(x); }
113
- T operator()(If_Ptr x) { return static_cast<D*>(this)->fallback(x); }
114
- T operator()(For_Ptr x) { return static_cast<D*>(this)->fallback(x); }
115
- T operator()(Each_Ptr x) { return static_cast<D*>(this)->fallback(x); }
116
- T operator()(While_Ptr x) { return static_cast<D*>(this)->fallback(x); }
117
- T operator()(Return_Ptr x) { return static_cast<D*>(this)->fallback(x); }
118
- T operator()(Content_Ptr x) { return static_cast<D*>(this)->fallback(x); }
119
- T operator()(Extension_Ptr x) { return static_cast<D*>(this)->fallback(x); }
120
- T operator()(Definition_Ptr x) { return static_cast<D*>(this)->fallback(x); }
121
- T operator()(Mixin_Call_Ptr x) { return static_cast<D*>(this)->fallback(x); }
136
+ T operator()(Block* x) { return static_cast<D*>(this)->fallback(x); }
137
+ T operator()(StyleRule* x) { return static_cast<D*>(this)->fallback(x); }
138
+ T operator()(Bubble* x) { return static_cast<D*>(this)->fallback(x); }
139
+ T operator()(Trace* x) { return static_cast<D*>(this)->fallback(x); }
140
+ T operator()(SupportsRule* x) { return static_cast<D*>(this)->fallback(x); }
141
+ T operator()(MediaRule* x) { return static_cast<D*>(this)->fallback(x); }
142
+ T operator()(CssMediaRule* x) { return static_cast<D*>(this)->fallback(x); }
143
+ T operator()(CssMediaQuery* x) { return static_cast<D*>(this)->fallback(x); }
144
+ T operator()(AtRootRule* x) { return static_cast<D*>(this)->fallback(x); }
145
+ T operator()(AtRule* x) { return static_cast<D*>(this)->fallback(x); }
146
+ T operator()(Keyframe_Rule* x) { return static_cast<D*>(this)->fallback(x); }
147
+ T operator()(Declaration* x) { return static_cast<D*>(this)->fallback(x); }
148
+ T operator()(Assignment* x) { return static_cast<D*>(this)->fallback(x); }
149
+ T operator()(Import* x) { return static_cast<D*>(this)->fallback(x); }
150
+ T operator()(Import_Stub* x) { return static_cast<D*>(this)->fallback(x); }
151
+ T operator()(WarningRule* x) { return static_cast<D*>(this)->fallback(x); }
152
+ T operator()(ErrorRule* x) { return static_cast<D*>(this)->fallback(x); }
153
+ T operator()(DebugRule* x) { return static_cast<D*>(this)->fallback(x); }
154
+ T operator()(Comment* x) { return static_cast<D*>(this)->fallback(x); }
155
+ T operator()(If* x) { return static_cast<D*>(this)->fallback(x); }
156
+ T operator()(ForRule* x) { return static_cast<D*>(this)->fallback(x); }
157
+ T operator()(EachRule* x) { return static_cast<D*>(this)->fallback(x); }
158
+ T operator()(WhileRule* x) { return static_cast<D*>(this)->fallback(x); }
159
+ T operator()(Return* x) { return static_cast<D*>(this)->fallback(x); }
160
+ T operator()(Content* x) { return static_cast<D*>(this)->fallback(x); }
161
+ T operator()(ExtendRule* x) { return static_cast<D*>(this)->fallback(x); }
162
+ T operator()(Definition* x) { return static_cast<D*>(this)->fallback(x); }
163
+ T operator()(Mixin_Call* x) { return static_cast<D*>(this)->fallback(x); }
122
164
  // expressions
123
- T operator()(List_Ptr x) { return static_cast<D*>(this)->fallback(x); }
124
- T operator()(Map_Ptr x) { return static_cast<D*>(this)->fallback(x); }
125
- T operator()(Function_Ptr x) { return static_cast<D*>(this)->fallback(x); }
126
- T operator()(Binary_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
127
- T operator()(Unary_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
128
- T operator()(Function_Call_Ptr x) { return static_cast<D*>(this)->fallback(x); }
129
- T operator()(Function_Call_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
130
- T operator()(Custom_Warning_Ptr x) { return static_cast<D*>(this)->fallback(x); }
131
- T operator()(Custom_Error_Ptr x) { return static_cast<D*>(this)->fallback(x); }
132
- T operator()(Variable_Ptr x) { return static_cast<D*>(this)->fallback(x); }
133
- T operator()(Number_Ptr x) { return static_cast<D*>(this)->fallback(x); }
134
- T operator()(Color_Ptr x) { return static_cast<D*>(this)->fallback(x); }
135
- T operator()(Boolean_Ptr x) { return static_cast<D*>(this)->fallback(x); }
136
- T operator()(String_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
137
- T operator()(String_Constant_Ptr x) { return static_cast<D*>(this)->fallback(x); }
138
- T operator()(String_Quoted_Ptr x) { return static_cast<D*>(this)->fallback(x); }
139
- T operator()(Supports_Condition_Ptr x) { return static_cast<D*>(this)->fallback(x); }
140
- T operator()(Supports_Operator_Ptr x) { return static_cast<D*>(this)->fallback(x); }
141
- T operator()(Supports_Negation_Ptr x) { return static_cast<D*>(this)->fallback(x); }
142
- T operator()(Supports_Declaration_Ptr x) { return static_cast<D*>(this)->fallback(x); }
143
- T operator()(Supports_Interpolation_Ptr x) { return static_cast<D*>(this)->fallback(x); }
144
- T operator()(Media_Query_Ptr x) { return static_cast<D*>(this)->fallback(x); }
145
- T operator()(Media_Query_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
146
- T operator()(At_Root_Query_Ptr x) { return static_cast<D*>(this)->fallback(x); }
147
- T operator()(Null_Ptr x) { return static_cast<D*>(this)->fallback(x); }
148
- T operator()(Parent_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
165
+ T operator()(Null* x) { return static_cast<D*>(this)->fallback(x); }
166
+ T operator()(List* x) { return static_cast<D*>(this)->fallback(x); }
167
+ T operator()(Map* x) { return static_cast<D*>(this)->fallback(x); }
168
+ T operator()(Function* x) { return static_cast<D*>(this)->fallback(x); }
169
+ T operator()(Binary_Expression* x) { return static_cast<D*>(this)->fallback(x); }
170
+ T operator()(Unary_Expression* x) { return static_cast<D*>(this)->fallback(x); }
171
+ T operator()(Function_Call* x) { return static_cast<D*>(this)->fallback(x); }
172
+ T operator()(Custom_Warning* x) { return static_cast<D*>(this)->fallback(x); }
173
+ T operator()(Custom_Error* x) { return static_cast<D*>(this)->fallback(x); }
174
+ T operator()(Variable* x) { return static_cast<D*>(this)->fallback(x); }
175
+ T operator()(Number* x) { return static_cast<D*>(this)->fallback(x); }
176
+ T operator()(Color* x) { return static_cast<D*>(this)->fallback(x); }
177
+ T operator()(Color_RGBA* x) { return static_cast<D*>(this)->fallback(x); }
178
+ T operator()(Color_HSLA* x) { return static_cast<D*>(this)->fallback(x); }
179
+ T operator()(Boolean* x) { return static_cast<D*>(this)->fallback(x); }
180
+ T operator()(String_Schema* x) { return static_cast<D*>(this)->fallback(x); }
181
+ T operator()(String_Constant* x) { return static_cast<D*>(this)->fallback(x); }
182
+ T operator()(String_Quoted* x) { return static_cast<D*>(this)->fallback(x); }
183
+ T operator()(SupportsCondition* x) { return static_cast<D*>(this)->fallback(x); }
184
+ T operator()(SupportsOperation* x) { return static_cast<D*>(this)->fallback(x); }
185
+ T operator()(SupportsNegation* x) { return static_cast<D*>(this)->fallback(x); }
186
+ T operator()(SupportsDeclaration* x) { return static_cast<D*>(this)->fallback(x); }
187
+ T operator()(Supports_Interpolation* x) { return static_cast<D*>(this)->fallback(x); }
188
+ T operator()(Media_Query* x) { return static_cast<D*>(this)->fallback(x); }
189
+ T operator()(Media_Query_Expression* x) { return static_cast<D*>(this)->fallback(x); }
190
+ T operator()(At_Root_Query* x) { return static_cast<D*>(this)->fallback(x); }
191
+ T operator()(Parent_Reference* x) { return static_cast<D*>(this)->fallback(x); }
149
192
  // parameters and arguments
150
- T operator()(Parameter_Ptr x) { return static_cast<D*>(this)->fallback(x); }
151
- T operator()(Parameters_Ptr x) { return static_cast<D*>(this)->fallback(x); }
152
- T operator()(Argument_Ptr x) { return static_cast<D*>(this)->fallback(x); }
153
- T operator()(Arguments_Ptr x) { return static_cast<D*>(this)->fallback(x); }
193
+ T operator()(Parameter* x) { return static_cast<D*>(this)->fallback(x); }
194
+ T operator()(Parameters* x) { return static_cast<D*>(this)->fallback(x); }
195
+ T operator()(Argument* x) { return static_cast<D*>(this)->fallback(x); }
196
+ T operator()(Arguments* x) { return static_cast<D*>(this)->fallback(x); }
154
197
  // selectors
155
- T operator()(Selector_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
156
- T operator()(Placeholder_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
157
- T operator()(Element_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
158
- T operator()(Class_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
159
- T operator()(Id_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
160
- T operator()(Attribute_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
161
- T operator()(Pseudo_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
162
- T operator()(Wrapped_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
163
- T operator()(Compound_Selector_Ptr x){ return static_cast<D*>(this)->fallback(x); }
164
- T operator()(Complex_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
165
- T operator()(Selector_List_Ptr x) { return static_cast<D*>(this)->fallback(x); }
198
+ T operator()(Selector_Schema* x) { return static_cast<D*>(this)->fallback(x); }
199
+ T operator()(PlaceholderSelector* x) { return static_cast<D*>(this)->fallback(x); }
200
+ T operator()(TypeSelector* x) { return static_cast<D*>(this)->fallback(x); }
201
+ T operator()(ClassSelector* x) { return static_cast<D*>(this)->fallback(x); }
202
+ T operator()(IDSelector* x) { return static_cast<D*>(this)->fallback(x); }
203
+ T operator()(AttributeSelector* x) { return static_cast<D*>(this)->fallback(x); }
204
+ T operator()(PseudoSelector* x) { return static_cast<D*>(this)->fallback(x); }
205
+ T operator()(SelectorComponent* x) { return static_cast<D*>(this)->fallback(x); }
206
+ T operator()(SelectorCombinator* x) { return static_cast<D*>(this)->fallback(x); }
207
+ T operator()(CompoundSelector* x) { return static_cast<D*>(this)->fallback(x); }
208
+ T operator()(ComplexSelector* x) { return static_cast<D*>(this)->fallback(x); }
209
+ T operator()(SelectorList* x) { return static_cast<D*>(this)->fallback(x); }
210
+
211
+ // fallback with specific type U
212
+ // will be called if not overloaded
213
+ template <typename U> inline T fallback(U x)
214
+ {
215
+ throw std::runtime_error(
216
+ std::string(typeid(*this).name()) + ": CRTP not implemented for " + typeid(x).name());
217
+ }
166
218
 
167
- template <typename U>
168
- T fallback(U x) { return T(); }
169
219
  };
170
220
 
171
221
  }