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,498 @@
1
+ #ifndef SASS_AST_VALUES_H
2
+ #define SASS_AST_VALUES_H
3
+
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+ #include "ast.hpp"
8
+
9
+ namespace Sass {
10
+
11
+ //////////////////////////////////////////////////////////////////////
12
+ // Still just an expression, but with a to_string method
13
+ //////////////////////////////////////////////////////////////////////
14
+ class PreValue : public Expression {
15
+ public:
16
+ PreValue(SourceSpan pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
17
+ ATTACH_VIRTUAL_AST_OPERATIONS(PreValue);
18
+ virtual ~PreValue() { }
19
+ };
20
+
21
+ //////////////////////////////////////////////////////////////////////
22
+ // base class for values that support operations
23
+ //////////////////////////////////////////////////////////////////////
24
+ class Value : public PreValue {
25
+ public:
26
+ Value(SourceSpan pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
27
+
28
+ // Some obects are not meant to be compared
29
+ // ToDo: maybe fallback to pointer comparison?
30
+ virtual bool operator< (const Expression& rhs) const override = 0;
31
+ virtual bool operator== (const Expression& rhs) const override = 0;
32
+
33
+ // We can give some reasonable implementations by using
34
+ // inverst operators on the specialized implementations
35
+ virtual bool operator> (const Expression& rhs) const {
36
+ return rhs < *this;
37
+ }
38
+ virtual bool operator!= (const Expression& rhs) const {
39
+ return !(*this == rhs);
40
+ }
41
+
42
+ ATTACH_VIRTUAL_AST_OPERATIONS(Value);
43
+
44
+ };
45
+
46
+ ///////////////////////////////////////////////////////////////////////
47
+ // Lists of values, both comma- and space-separated (distinguished by a
48
+ // type-tag.) Also used to represent variable-length argument lists.
49
+ ///////////////////////////////////////////////////////////////////////
50
+ class List : public Value, public Vectorized<ExpressionObj> {
51
+ void adjust_after_pushing(ExpressionObj e) override { is_expanded(false); }
52
+ private:
53
+ ADD_PROPERTY(enum Sass_Separator, separator)
54
+ ADD_PROPERTY(bool, is_arglist)
55
+ ADD_PROPERTY(bool, is_bracketed)
56
+ ADD_PROPERTY(bool, from_selector)
57
+ public:
58
+ List(SourceSpan pstate, size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false, bool bracket = false);
59
+ sass::string type() const override { return is_arglist_ ? "arglist" : "list"; }
60
+ static sass::string type_name() { return "list"; }
61
+ const char* sep_string(bool compressed = false) const {
62
+ return separator() == SASS_SPACE ?
63
+ " " : (compressed ? "," : ", ");
64
+ }
65
+ bool is_invisible() const override { return empty() && !is_bracketed(); }
66
+ ExpressionObj value_at_index(size_t i);
67
+
68
+ virtual size_t hash() const override;
69
+ virtual size_t size() const;
70
+ virtual void set_delayed(bool delayed) override;
71
+
72
+ virtual bool operator< (const Expression& rhs) const override;
73
+ virtual bool operator== (const Expression& rhs) const override;
74
+
75
+ ATTACH_AST_OPERATIONS(List)
76
+ ATTACH_CRTP_PERFORM_METHODS()
77
+ };
78
+
79
+ ///////////////////////////////////////////////////////////////////////
80
+ // Key value paris.
81
+ ///////////////////////////////////////////////////////////////////////
82
+ class Map : public Value, public Hashed<ExpressionObj, ExpressionObj, Map_Obj> {
83
+ void adjust_after_pushing(std::pair<ExpressionObj, ExpressionObj> p) override { is_expanded(false); }
84
+ public:
85
+ Map(SourceSpan pstate, size_t size = 0);
86
+ sass::string type() const override { return "map"; }
87
+ static sass::string type_name() { return "map"; }
88
+ bool is_invisible() const override { return empty(); }
89
+ List_Obj to_list(SourceSpan& pstate);
90
+
91
+ virtual size_t hash() const override;
92
+
93
+ virtual bool operator< (const Expression& rhs) const override;
94
+ virtual bool operator== (const Expression& rhs) const override;
95
+
96
+ ATTACH_AST_OPERATIONS(Map)
97
+ ATTACH_CRTP_PERFORM_METHODS()
98
+ };
99
+
100
+
101
+ //////////////////////////////////////////////////////////////////////////
102
+ // Binary expressions. Represents logical, relational, and arithmetic
103
+ // operations. Templatized to avoid large switch statements and repetitive
104
+ // subclassing.
105
+ //////////////////////////////////////////////////////////////////////////
106
+ class Binary_Expression : public PreValue {
107
+ private:
108
+ HASH_PROPERTY(Operand, op)
109
+ HASH_PROPERTY(ExpressionObj, left)
110
+ HASH_PROPERTY(ExpressionObj, right)
111
+ mutable size_t hash_;
112
+ public:
113
+ Binary_Expression(SourceSpan pstate,
114
+ Operand op, ExpressionObj lhs, ExpressionObj rhs);
115
+
116
+ const sass::string type_name();
117
+ const sass::string separator();
118
+ bool is_left_interpolant(void) const override;
119
+ bool is_right_interpolant(void) const override;
120
+ bool has_interpolant() const override;
121
+
122
+ virtual void set_delayed(bool delayed) override;
123
+
124
+ virtual bool operator< (const Expression& rhs) const override;
125
+ virtual bool operator==(const Expression& rhs) const override;
126
+
127
+ virtual size_t hash() const override;
128
+ enum Sass_OP optype() const { return op_.operand; }
129
+ ATTACH_AST_OPERATIONS(Binary_Expression)
130
+ ATTACH_CRTP_PERFORM_METHODS()
131
+ };
132
+
133
+ ////////////////////////////////////////////////////
134
+ // Function reference.
135
+ ////////////////////////////////////////////////////
136
+ class Function final : public Value {
137
+ public:
138
+ ADD_PROPERTY(Definition_Obj, definition)
139
+ ADD_PROPERTY(bool, is_css)
140
+ public:
141
+ Function(SourceSpan pstate, Definition_Obj def, bool css);
142
+
143
+ sass::string type() const override { return "function"; }
144
+ static sass::string type_name() { return "function"; }
145
+ bool is_invisible() const override { return true; }
146
+
147
+ sass::string name();
148
+
149
+ bool operator< (const Expression& rhs) const override;
150
+ bool operator== (const Expression& rhs) const override;
151
+
152
+ ATTACH_AST_OPERATIONS(Function)
153
+ ATTACH_CRTP_PERFORM_METHODS()
154
+ };
155
+
156
+ //////////////////
157
+ // Function calls.
158
+ //////////////////
159
+ class Function_Call final : public PreValue {
160
+ HASH_CONSTREF(String_Obj, sname)
161
+ HASH_PROPERTY(Arguments_Obj, arguments)
162
+ HASH_PROPERTY(Function_Obj, func)
163
+ ADD_PROPERTY(bool, via_call)
164
+ ADD_PROPERTY(void*, cookie)
165
+ mutable size_t hash_;
166
+ public:
167
+ Function_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, void* cookie);
168
+ Function_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Function_Obj func);
169
+ Function_Call(SourceSpan pstate, sass::string n, Arguments_Obj args);
170
+
171
+ Function_Call(SourceSpan pstate, String_Obj n, Arguments_Obj args, void* cookie);
172
+ Function_Call(SourceSpan pstate, String_Obj n, Arguments_Obj args, Function_Obj func);
173
+ Function_Call(SourceSpan pstate, String_Obj n, Arguments_Obj args);
174
+
175
+ sass::string name() const;
176
+ bool is_css();
177
+
178
+ bool operator==(const Expression& rhs) const override;
179
+
180
+ size_t hash() const override;
181
+
182
+ ATTACH_AST_OPERATIONS(Function_Call)
183
+ ATTACH_CRTP_PERFORM_METHODS()
184
+ };
185
+
186
+ ///////////////////////
187
+ // Variable references.
188
+ ///////////////////////
189
+ class Variable final : public PreValue {
190
+ ADD_CONSTREF(sass::string, name)
191
+ public:
192
+ Variable(SourceSpan pstate, sass::string n);
193
+ virtual bool operator==(const Expression& rhs) const override;
194
+ virtual size_t hash() const override;
195
+ ATTACH_AST_OPERATIONS(Variable)
196
+ ATTACH_CRTP_PERFORM_METHODS()
197
+ };
198
+
199
+ ////////////////////////////////////////////////
200
+ // Numbers, percentages, dimensions, and colors.
201
+ ////////////////////////////////////////////////
202
+ class Number final : public Value, public Units {
203
+ HASH_PROPERTY(double, value)
204
+ ADD_PROPERTY(bool, zero)
205
+ mutable size_t hash_;
206
+ public:
207
+ Number(SourceSpan pstate, double val, sass::string u = "", bool zero = true);
208
+
209
+ bool zero() { return zero_; }
210
+
211
+ sass::string type() const override { return "number"; }
212
+ static sass::string type_name() { return "number"; }
213
+
214
+ // cancel out unnecessary units
215
+ // result will be in input units
216
+ void reduce();
217
+
218
+ // normalize units to defaults
219
+ // needed to compare two numbers
220
+ void normalize();
221
+
222
+ size_t hash() const override;
223
+
224
+ bool operator< (const Number& rhs) const;
225
+ bool operator== (const Number& rhs) const;
226
+ bool operator< (const Expression& rhs) const override;
227
+ bool operator== (const Expression& rhs) const override;
228
+ ATTACH_AST_OPERATIONS(Number)
229
+ ATTACH_CRTP_PERFORM_METHODS()
230
+ };
231
+
232
+ //////////
233
+ // Colors.
234
+ //////////
235
+ class Color : public Value {
236
+ ADD_CONSTREF(sass::string, disp)
237
+ HASH_PROPERTY(double, a)
238
+ protected:
239
+ mutable size_t hash_;
240
+ public:
241
+ Color(SourceSpan pstate, double a = 1, const sass::string disp = "");
242
+
243
+ sass::string type() const override { return "color"; }
244
+ static sass::string type_name() { return "color"; }
245
+
246
+ virtual size_t hash() const override = 0;
247
+
248
+ bool operator< (const Expression& rhs) const override;
249
+ bool operator== (const Expression& rhs) const override;
250
+
251
+ virtual Color_RGBA* copyAsRGBA() const = 0;
252
+ virtual Color_RGBA* toRGBA() = 0;
253
+
254
+ virtual Color_HSLA* copyAsHSLA() const = 0;
255
+ virtual Color_HSLA* toHSLA() = 0;
256
+
257
+ ATTACH_VIRTUAL_AST_OPERATIONS(Color)
258
+ };
259
+
260
+ //////////
261
+ // Colors.
262
+ //////////
263
+ class Color_RGBA final : public Color {
264
+ HASH_PROPERTY(double, r)
265
+ HASH_PROPERTY(double, g)
266
+ HASH_PROPERTY(double, b)
267
+ public:
268
+ Color_RGBA(SourceSpan pstate, double r, double g, double b, double a = 1, const sass::string disp = "");
269
+
270
+ sass::string type() const override { return "color"; }
271
+ static sass::string type_name() { return "color"; }
272
+
273
+ size_t hash() const override;
274
+
275
+ Color_RGBA* copyAsRGBA() const override;
276
+ Color_RGBA* toRGBA() override { return this; }
277
+
278
+ Color_HSLA* copyAsHSLA() const override;
279
+ Color_HSLA* toHSLA() override { return copyAsHSLA(); }
280
+
281
+ bool operator< (const Expression& rhs) const override;
282
+ bool operator== (const Expression& rhs) const override;
283
+
284
+ ATTACH_AST_OPERATIONS(Color_RGBA)
285
+ ATTACH_CRTP_PERFORM_METHODS()
286
+ };
287
+
288
+
289
+ //////////
290
+ // Colors.
291
+ //////////
292
+ class Color_HSLA final : public Color {
293
+ HASH_PROPERTY(double, h)
294
+ HASH_PROPERTY(double, s)
295
+ HASH_PROPERTY(double, l)
296
+ public:
297
+ Color_HSLA(SourceSpan pstate, double h, double s, double l, double a = 1, const sass::string disp = "");
298
+
299
+ sass::string type() const override { return "color"; }
300
+ static sass::string type_name() { return "color"; }
301
+
302
+ size_t hash() const override;
303
+
304
+ Color_RGBA* copyAsRGBA() const override;
305
+ Color_RGBA* toRGBA() override { return copyAsRGBA(); }
306
+
307
+ Color_HSLA* copyAsHSLA() const override;
308
+ Color_HSLA* toHSLA() override { return this; }
309
+
310
+ bool operator< (const Expression& rhs) const override;
311
+ bool operator== (const Expression& rhs) const override;
312
+
313
+ ATTACH_AST_OPERATIONS(Color_HSLA)
314
+ ATTACH_CRTP_PERFORM_METHODS()
315
+ };
316
+
317
+ //////////////////////////////
318
+ // Errors from Sass_Values.
319
+ //////////////////////////////
320
+ class Custom_Error final : public Value {
321
+ ADD_CONSTREF(sass::string, message)
322
+ public:
323
+ Custom_Error(SourceSpan pstate, sass::string msg);
324
+ bool operator< (const Expression& rhs) const override;
325
+ bool operator== (const Expression& rhs) const override;
326
+ ATTACH_AST_OPERATIONS(Custom_Error)
327
+ ATTACH_CRTP_PERFORM_METHODS()
328
+ };
329
+
330
+ //////////////////////////////
331
+ // Warnings from Sass_Values.
332
+ //////////////////////////////
333
+ class Custom_Warning final : public Value {
334
+ ADD_CONSTREF(sass::string, message)
335
+ public:
336
+ Custom_Warning(SourceSpan pstate, sass::string msg);
337
+ bool operator< (const Expression& rhs) const override;
338
+ bool operator== (const Expression& rhs) const override;
339
+ ATTACH_AST_OPERATIONS(Custom_Warning)
340
+ ATTACH_CRTP_PERFORM_METHODS()
341
+ };
342
+
343
+ ////////////
344
+ // Booleans.
345
+ ////////////
346
+ class Boolean final : public Value {
347
+ HASH_PROPERTY(bool, value)
348
+ mutable size_t hash_;
349
+ public:
350
+ Boolean(SourceSpan pstate, bool val);
351
+ operator bool() override { return value_; }
352
+
353
+ sass::string type() const override { return "bool"; }
354
+ static sass::string type_name() { return "bool"; }
355
+
356
+ size_t hash() const override;
357
+
358
+ bool is_false() override { return !value_; }
359
+
360
+ bool operator< (const Expression& rhs) const override;
361
+ bool operator== (const Expression& rhs) const override;
362
+
363
+ ATTACH_AST_OPERATIONS(Boolean)
364
+ ATTACH_CRTP_PERFORM_METHODS()
365
+ };
366
+
367
+ ////////////////////////////////////////////////////////////////////////
368
+ // Abstract base class for Sass string values. Includes interpolated and
369
+ // "flat" strings.
370
+ ////////////////////////////////////////////////////////////////////////
371
+ class String : public Value {
372
+ public:
373
+ String(SourceSpan pstate, bool delayed = false);
374
+ static sass::string type_name() { return "string"; }
375
+ virtual ~String() = 0;
376
+ virtual void rtrim() = 0;
377
+ virtual bool operator<(const Expression& rhs) const override {
378
+ return this->to_string() < rhs.to_string();
379
+ };
380
+ virtual bool operator==(const Expression& rhs) const override {
381
+ return this->to_string() == rhs.to_string();
382
+ };
383
+ ATTACH_VIRTUAL_AST_OPERATIONS(String);
384
+ ATTACH_CRTP_PERFORM_METHODS()
385
+ };
386
+ inline String::~String() { };
387
+
388
+ ///////////////////////////////////////////////////////////////////////
389
+ // Interpolated strings. Meant to be reduced to flat strings during the
390
+ // evaluation phase.
391
+ ///////////////////////////////////////////////////////////////////////
392
+ class String_Schema final : public String, public Vectorized<PreValueObj> {
393
+ ADD_PROPERTY(bool, css)
394
+ mutable size_t hash_;
395
+ public:
396
+ String_Schema(SourceSpan pstate, size_t size = 0, bool css = true);
397
+
398
+ sass::string type() const override { return "string"; }
399
+ static sass::string type_name() { return "string"; }
400
+
401
+ bool is_left_interpolant(void) const override;
402
+ bool is_right_interpolant(void) const override;
403
+
404
+ bool has_interpolants();
405
+ void rtrim() override;
406
+ size_t hash() const override;
407
+ virtual void set_delayed(bool delayed) override;
408
+
409
+ bool operator< (const Expression& rhs) const override;
410
+ bool operator==(const Expression& rhs) const override;
411
+ ATTACH_AST_OPERATIONS(String_Schema)
412
+ ATTACH_CRTP_PERFORM_METHODS()
413
+ };
414
+
415
+ ////////////////////////////////////////////////////////
416
+ // Flat strings -- the lowest level of raw textual data.
417
+ ////////////////////////////////////////////////////////
418
+ class String_Constant : public String {
419
+ ADD_PROPERTY(char, quote_mark)
420
+ HASH_CONSTREF(sass::string, value)
421
+ protected:
422
+ mutable size_t hash_;
423
+ public:
424
+ String_Constant(SourceSpan pstate, sass::string val, bool css = true);
425
+ String_Constant(SourceSpan pstate, const char* beg, bool css = true);
426
+ String_Constant(SourceSpan pstate, const char* beg, const char* end, bool css = true);
427
+ String_Constant(SourceSpan pstate, const Token& tok, bool css = true);
428
+ sass::string type() const override { return "string"; }
429
+ static sass::string type_name() { return "string"; }
430
+ bool is_invisible() const override;
431
+ virtual void rtrim() override;
432
+ size_t hash() const override;
433
+ bool operator< (const Expression& rhs) const override;
434
+ bool operator==(const Expression& rhs) const override;
435
+ // quotes are forced on inspection
436
+ virtual sass::string inspect() const override;
437
+ ATTACH_AST_OPERATIONS(String_Constant)
438
+ ATTACH_CRTP_PERFORM_METHODS()
439
+ };
440
+
441
+ ////////////////////////////////////////////////////////
442
+ // Possibly quoted string (unquote on instantiation)
443
+ ////////////////////////////////////////////////////////
444
+ class String_Quoted final : public String_Constant {
445
+ public:
446
+ String_Quoted(SourceSpan pstate, sass::string val, char q = 0,
447
+ bool keep_utf8_escapes = false, bool skip_unquoting = false,
448
+ bool strict_unquoting = true, bool css = true);
449
+ bool operator< (const Expression& rhs) const override;
450
+ bool operator==(const Expression& rhs) const override;
451
+ // quotes are forced on inspection
452
+ sass::string inspect() const override;
453
+ ATTACH_AST_OPERATIONS(String_Quoted)
454
+ ATTACH_CRTP_PERFORM_METHODS()
455
+ };
456
+
457
+ //////////////////
458
+ // The null value.
459
+ //////////////////
460
+ class Null final : public Value {
461
+ public:
462
+ Null(SourceSpan pstate);
463
+ sass::string type() const override { return "null"; }
464
+ static sass::string type_name() { return "null"; }
465
+ bool is_invisible() const override { return true; }
466
+ operator bool() override { return false; }
467
+ bool is_false() override { return true; }
468
+
469
+ size_t hash() const override;
470
+
471
+ bool operator< (const Expression& rhs) const override;
472
+ bool operator== (const Expression& rhs) const override;
473
+
474
+ ATTACH_AST_OPERATIONS(Null)
475
+ ATTACH_CRTP_PERFORM_METHODS()
476
+ };
477
+
478
+ //////////////////////////////////
479
+ // The Parent Reference Expression.
480
+ //////////////////////////////////
481
+ class Parent_Reference final : public Value {
482
+ public:
483
+ Parent_Reference(SourceSpan pstate);
484
+ sass::string type() const override { return "parent"; }
485
+ static sass::string type_name() { return "parent"; }
486
+ bool operator< (const Expression& rhs) const override {
487
+ return false; // they are always equal
488
+ }
489
+ bool operator==(const Expression& rhs) const override {
490
+ return true; // they are always equal
491
+ };
492
+ ATTACH_AST_OPERATIONS(Parent_Reference)
493
+ ATTACH_CRTP_PERFORM_METHODS()
494
+ };
495
+
496
+ }
497
+
498
+ #endif