sassc 2.0.1 → 2.1.0.pre1

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -0,0 +1,489 @@
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
+
8
+ #include <set>
9
+ #include <deque>
10
+ #include <vector>
11
+ #include <string>
12
+ #include <sstream>
13
+ #include <iostream>
14
+ #include <typeinfo>
15
+ #include <algorithm>
16
+ #include "sass/base.h"
17
+ #include "ast_fwd_decl.hpp"
18
+
19
+ #include "util.hpp"
20
+ #include "units.hpp"
21
+ #include "context.hpp"
22
+ #include "position.hpp"
23
+ #include "constants.hpp"
24
+ #include "operation.hpp"
25
+ #include "position.hpp"
26
+ #include "inspect.hpp"
27
+ #include "source_map.hpp"
28
+ #include "environment.hpp"
29
+ #include "error_handling.hpp"
30
+ #include "ast_def_macros.hpp"
31
+ #include "ast_fwd_decl.hpp"
32
+ #include "source_map.hpp"
33
+ #include "fn_utils.hpp"
34
+
35
+ #include "sass.h"
36
+
37
+ namespace Sass {
38
+
39
+ //////////////////////////////////////////////////////////////////////
40
+ // Still just an expression, but with a to_string method
41
+ //////////////////////////////////////////////////////////////////////
42
+ class PreValue : public Expression {
43
+ public:
44
+ PreValue(ParserState pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
45
+ ATTACH_VIRTUAL_AST_OPERATIONS(PreValue);
46
+ virtual ~PreValue() { }
47
+ };
48
+
49
+ //////////////////////////////////////////////////////////////////////
50
+ // base class for values that support operations
51
+ //////////////////////////////////////////////////////////////////////
52
+ class Value : public PreValue {
53
+ public:
54
+ Value(ParserState pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
55
+ ATTACH_VIRTUAL_AST_OPERATIONS(Value);
56
+ virtual bool operator== (const Expression& rhs) const override = 0;
57
+ };
58
+
59
+ ///////////////////////////////////////////////////////////////////////
60
+ // Lists of values, both comma- and space-separated (distinguished by a
61
+ // type-tag.) Also used to represent variable-length argument lists.
62
+ ///////////////////////////////////////////////////////////////////////
63
+ class List : public Value, public Vectorized<Expression_Obj> {
64
+ void adjust_after_pushing(Expression_Obj e) override { is_expanded(false); }
65
+ private:
66
+ ADD_PROPERTY(enum Sass_Separator, separator)
67
+ ADD_PROPERTY(bool, is_arglist)
68
+ ADD_PROPERTY(bool, is_bracketed)
69
+ ADD_PROPERTY(bool, from_selector)
70
+ public:
71
+ List(ParserState pstate, size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false, bool bracket = false);
72
+ std::string type() const override { return is_arglist_ ? "arglist" : "list"; }
73
+ static std::string type_name() { return "list"; }
74
+ const char* sep_string(bool compressed = false) const {
75
+ return separator() == SASS_SPACE ?
76
+ " " : (compressed ? "," : ", ");
77
+ }
78
+ bool is_invisible() const override { return empty() && !is_bracketed(); }
79
+ Expression_Obj value_at_index(size_t i);
80
+
81
+ virtual size_t hash() const override;
82
+ virtual size_t size() const;
83
+ virtual void set_delayed(bool delayed) override;
84
+ virtual bool operator== (const Expression& rhs) const override;
85
+
86
+ ATTACH_AST_OPERATIONS(List)
87
+ ATTACH_CRTP_PERFORM_METHODS()
88
+ };
89
+
90
+ ///////////////////////////////////////////////////////////////////////
91
+ // Key value paris.
92
+ ///////////////////////////////////////////////////////////////////////
93
+ class Map : public Value, public Hashed {
94
+ void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) override { is_expanded(false); }
95
+ public:
96
+ Map(ParserState pstate, size_t size = 0);
97
+ std::string type() const override { return "map"; }
98
+ static std::string type_name() { return "map"; }
99
+ bool is_invisible() const override { return empty(); }
100
+ List_Obj to_list(ParserState& pstate);
101
+
102
+ virtual size_t hash() const override;
103
+ virtual bool operator== (const Expression& rhs) const override;
104
+
105
+ ATTACH_AST_OPERATIONS(Map)
106
+ ATTACH_CRTP_PERFORM_METHODS()
107
+ };
108
+
109
+
110
+ //////////////////////////////////////////////////////////////////////////
111
+ // Binary expressions. Represents logical, relational, and arithmetic
112
+ // operations. Templatized to avoid large switch statements and repetitive
113
+ // subclassing.
114
+ //////////////////////////////////////////////////////////////////////////
115
+ class Binary_Expression : public PreValue {
116
+ private:
117
+ HASH_PROPERTY(Operand, op)
118
+ HASH_PROPERTY(Expression_Obj, left)
119
+ HASH_PROPERTY(Expression_Obj, right)
120
+ mutable size_t hash_;
121
+ public:
122
+ Binary_Expression(ParserState pstate,
123
+ Operand op, Expression_Obj lhs, Expression_Obj rhs);
124
+
125
+ const std::string type_name();
126
+ const std::string separator();
127
+ bool is_left_interpolant(void) const override;
128
+ bool is_right_interpolant(void) const override;
129
+ bool has_interpolant() const override;
130
+
131
+ virtual void set_delayed(bool delayed) override;
132
+
133
+ virtual bool operator==(const Expression& rhs) const override;
134
+
135
+ virtual size_t hash() const override;
136
+ enum Sass_OP optype() const { return op_.operand; }
137
+ ATTACH_AST_OPERATIONS(Binary_Expression)
138
+ ATTACH_CRTP_PERFORM_METHODS()
139
+ };
140
+
141
+ ////////////////////////////////////////////////////
142
+ // Function reference.
143
+ ////////////////////////////////////////////////////
144
+ class Function final : public Value {
145
+ public:
146
+ ADD_PROPERTY(Definition_Obj, definition)
147
+ ADD_PROPERTY(bool, is_css)
148
+ public:
149
+ Function(ParserState pstate, Definition_Obj def, bool css);
150
+
151
+ std::string type() const override { return "function"; }
152
+ static std::string type_name() { return "function"; }
153
+ bool is_invisible() const override { return true; }
154
+
155
+ std::string name();
156
+
157
+ bool operator== (const Expression& rhs) const override;
158
+
159
+ ATTACH_AST_OPERATIONS(Function)
160
+ ATTACH_CRTP_PERFORM_METHODS()
161
+ };
162
+
163
+ //////////////////
164
+ // Function calls.
165
+ //////////////////
166
+ class Function_Call final : public PreValue {
167
+ HASH_CONSTREF(String_Obj, sname)
168
+ HASH_PROPERTY(Arguments_Obj, arguments)
169
+ HASH_PROPERTY(Function_Obj, func)
170
+ ADD_PROPERTY(bool, via_call)
171
+ ADD_PROPERTY(void*, cookie)
172
+ mutable size_t hash_;
173
+ public:
174
+ Function_Call(ParserState pstate, std::string n, Arguments_Obj args, void* cookie);
175
+ Function_Call(ParserState pstate, std::string n, Arguments_Obj args, Function_Obj func);
176
+ Function_Call(ParserState pstate, std::string n, Arguments_Obj args);
177
+
178
+ Function_Call(ParserState pstate, String_Obj n, Arguments_Obj args, void* cookie);
179
+ Function_Call(ParserState pstate, String_Obj n, Arguments_Obj args, Function_Obj func);
180
+ Function_Call(ParserState pstate, String_Obj n, Arguments_Obj args);
181
+
182
+ std::string name() const;
183
+ bool is_css();
184
+
185
+ bool operator==(const Expression& rhs) const override;
186
+
187
+ size_t hash() const override;
188
+
189
+ ATTACH_AST_OPERATIONS(Function_Call)
190
+ ATTACH_CRTP_PERFORM_METHODS()
191
+ };
192
+
193
+ ///////////////////////
194
+ // Variable references.
195
+ ///////////////////////
196
+ class Variable final : public PreValue {
197
+ ADD_CONSTREF(std::string, name)
198
+ public:
199
+ Variable(ParserState pstate, std::string n);
200
+ virtual bool operator==(const Expression& rhs) const override;
201
+ virtual size_t hash() const override;
202
+ ATTACH_AST_OPERATIONS(Variable)
203
+ ATTACH_CRTP_PERFORM_METHODS()
204
+ };
205
+
206
+ ////////////////////////////////////////////////
207
+ // Numbers, percentages, dimensions, and colors.
208
+ ////////////////////////////////////////////////
209
+ class Number final : public Value, public Units {
210
+ HASH_PROPERTY(double, value)
211
+ ADD_PROPERTY(bool, zero)
212
+ mutable size_t hash_;
213
+ public:
214
+ Number(ParserState pstate, double val, std::string u = "", bool zero = true);
215
+
216
+ bool zero() { return zero_; }
217
+
218
+ std::string type() const override { return "number"; }
219
+ static std::string type_name() { return "number"; }
220
+
221
+ // cancel out unnecessary units
222
+ // result will be in input units
223
+ void reduce();
224
+
225
+ // normalize units to defaults
226
+ // needed to compare two numbers
227
+ void normalize();
228
+
229
+ size_t hash() const override;
230
+
231
+ bool operator< (const Number& rhs) const;
232
+ bool operator== (const Number& rhs) const;
233
+ bool operator== (const Expression& rhs) const override;
234
+ ATTACH_AST_OPERATIONS(Number)
235
+ ATTACH_CRTP_PERFORM_METHODS()
236
+ };
237
+
238
+ //////////
239
+ // Colors.
240
+ //////////
241
+ class Color : public Value {
242
+ ADD_CONSTREF(std::string, disp)
243
+ HASH_PROPERTY(double, a)
244
+ protected:
245
+ mutable size_t hash_;
246
+ public:
247
+ Color(ParserState pstate, double a = 1, const std::string disp = "");
248
+
249
+ std::string type() const override { return "color"; }
250
+ static std::string type_name() { return "color"; }
251
+
252
+ virtual size_t hash() const override = 0;
253
+
254
+ bool operator== (const Expression& rhs) const override;
255
+
256
+ virtual Color_RGBA* copyAsRGBA() const = 0;
257
+ virtual Color_RGBA* toRGBA() = 0;
258
+
259
+ virtual Color_HSLA* copyAsHSLA() const = 0;
260
+ virtual Color_HSLA* toHSLA() = 0;
261
+
262
+ ATTACH_VIRTUAL_AST_OPERATIONS(Color)
263
+ };
264
+
265
+ //////////
266
+ // Colors.
267
+ //////////
268
+ class Color_RGBA final : public Color {
269
+ HASH_PROPERTY(double, r)
270
+ HASH_PROPERTY(double, g)
271
+ HASH_PROPERTY(double, b)
272
+ public:
273
+ Color_RGBA(ParserState pstate, double r, double g, double b, double a = 1, const std::string disp = "");
274
+
275
+ std::string type() const override { return "color"; }
276
+ static std::string type_name() { return "color"; }
277
+
278
+ size_t hash() const override;
279
+
280
+ Color_RGBA* copyAsRGBA() const override;
281
+ Color_RGBA* toRGBA() override { return this; }
282
+
283
+ Color_HSLA* copyAsHSLA() const override;
284
+ Color_HSLA* toHSLA() override { return copyAsHSLA(); }
285
+
286
+ bool operator== (const Expression& rhs) const override;
287
+
288
+ ATTACH_AST_OPERATIONS(Color_RGBA)
289
+ ATTACH_CRTP_PERFORM_METHODS()
290
+ };
291
+
292
+
293
+ //////////
294
+ // Colors.
295
+ //////////
296
+ class Color_HSLA final : public Color {
297
+ HASH_PROPERTY(double, h)
298
+ HASH_PROPERTY(double, s)
299
+ HASH_PROPERTY(double, l)
300
+ public:
301
+ Color_HSLA(ParserState pstate, double h, double s, double l, double a = 1, const std::string disp = "");
302
+
303
+ std::string type() const override { return "color"; }
304
+ static std::string type_name() { return "color"; }
305
+
306
+ size_t hash() const override;
307
+
308
+ Color_RGBA* copyAsRGBA() const override;
309
+ Color_RGBA* toRGBA() override { return copyAsRGBA(); }
310
+
311
+ Color_HSLA* copyAsHSLA() const override;
312
+ Color_HSLA* toHSLA() override { return this; }
313
+
314
+ bool operator== (const Expression& rhs) const override;
315
+
316
+ ATTACH_AST_OPERATIONS(Color_HSLA)
317
+ ATTACH_CRTP_PERFORM_METHODS()
318
+ };
319
+
320
+ //////////////////////////////
321
+ // Errors from Sass_Values.
322
+ //////////////////////////////
323
+ class Custom_Error final : public Value {
324
+ ADD_CONSTREF(std::string, message)
325
+ public:
326
+ Custom_Error(ParserState pstate, std::string msg);
327
+ bool operator== (const Expression& rhs) const override;
328
+ ATTACH_AST_OPERATIONS(Custom_Error)
329
+ ATTACH_CRTP_PERFORM_METHODS()
330
+ };
331
+
332
+ //////////////////////////////
333
+ // Warnings from Sass_Values.
334
+ //////////////////////////////
335
+ class Custom_Warning final : public Value {
336
+ ADD_CONSTREF(std::string, message)
337
+ public:
338
+ Custom_Warning(ParserState pstate, std::string msg);
339
+ bool operator== (const Expression& rhs) const override;
340
+ ATTACH_AST_OPERATIONS(Custom_Warning)
341
+ ATTACH_CRTP_PERFORM_METHODS()
342
+ };
343
+
344
+ ////////////
345
+ // Booleans.
346
+ ////////////
347
+ class Boolean final : public Value {
348
+ HASH_PROPERTY(bool, value)
349
+ mutable size_t hash_;
350
+ public:
351
+ Boolean(ParserState pstate, bool val);
352
+ operator bool() override { return value_; }
353
+
354
+ std::string type() const override { return "bool"; }
355
+ static std::string type_name() { return "bool"; }
356
+
357
+ size_t hash() const override;
358
+
359
+ bool is_false() override { return !value_; }
360
+
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(ParserState pstate, bool delayed = false);
374
+ static std::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
+ ATTACH_VIRTUAL_AST_OPERATIONS(String);
381
+ ATTACH_CRTP_PERFORM_METHODS()
382
+ };
383
+ inline String::~String() { };
384
+
385
+ ///////////////////////////////////////////////////////////////////////
386
+ // Interpolated strings. Meant to be reduced to flat strings during the
387
+ // evaluation phase.
388
+ ///////////////////////////////////////////////////////////////////////
389
+ class String_Schema final : public String, public Vectorized<PreValue_Obj> {
390
+ ADD_PROPERTY(bool, css)
391
+ mutable size_t hash_;
392
+ public:
393
+ String_Schema(ParserState pstate, size_t size = 0, bool css = true);
394
+
395
+ std::string type() const override { return "string"; }
396
+ static std::string type_name() { return "string"; }
397
+
398
+ bool is_left_interpolant(void) const override;
399
+ bool is_right_interpolant(void) const override;
400
+
401
+ bool has_interpolants();
402
+ void rtrim() override;
403
+ size_t hash() const override;
404
+ virtual void set_delayed(bool delayed) override;
405
+
406
+ bool operator==(const Expression& rhs) const override;
407
+ ATTACH_AST_OPERATIONS(String_Schema)
408
+ ATTACH_CRTP_PERFORM_METHODS()
409
+ };
410
+
411
+ ////////////////////////////////////////////////////////
412
+ // Flat strings -- the lowest level of raw textual data.
413
+ ////////////////////////////////////////////////////////
414
+ class String_Constant : public String {
415
+ ADD_PROPERTY(char, quote_mark)
416
+ ADD_PROPERTY(bool, can_compress_whitespace)
417
+ HASH_CONSTREF(std::string, value)
418
+ protected:
419
+ mutable size_t hash_;
420
+ public:
421
+ String_Constant(ParserState pstate, std::string val, bool css = true);
422
+ String_Constant(ParserState pstate, const char* beg, bool css = true);
423
+ String_Constant(ParserState pstate, const char* beg, const char* end, bool css = true);
424
+ String_Constant(ParserState pstate, const Token& tok, bool css = true);
425
+ std::string type() const override { return "string"; }
426
+ static std::string type_name() { return "string"; }
427
+ bool is_invisible() const override;
428
+ virtual void rtrim() override;
429
+ size_t hash() const override;
430
+ bool operator==(const Expression& rhs) const override;
431
+ // quotes are forced on inspection
432
+ virtual std::string inspect() const override;
433
+ ATTACH_AST_OPERATIONS(String_Constant)
434
+ ATTACH_CRTP_PERFORM_METHODS()
435
+ };
436
+
437
+ ////////////////////////////////////////////////////////
438
+ // Possibly quoted string (unquote on instantiation)
439
+ ////////////////////////////////////////////////////////
440
+ class String_Quoted final : public String_Constant {
441
+ public:
442
+ String_Quoted(ParserState pstate, std::string val, char q = 0,
443
+ bool keep_utf8_escapes = false, bool skip_unquoting = false,
444
+ bool strict_unquoting = true, bool css = true);
445
+ bool operator==(const Expression& rhs) const override;
446
+ // quotes are forced on inspection
447
+ std::string inspect() const override;
448
+ ATTACH_AST_OPERATIONS(String_Quoted)
449
+ ATTACH_CRTP_PERFORM_METHODS()
450
+ };
451
+
452
+ //////////////////
453
+ // The null value.
454
+ //////////////////
455
+ class Null final : public Value {
456
+ public:
457
+ Null(ParserState pstate);
458
+ std::string type() const override { return "null"; }
459
+ static std::string type_name() { return "null"; }
460
+ bool is_invisible() const override { return true; }
461
+ operator bool() override { return false; }
462
+ bool is_false() override { return true; }
463
+
464
+ size_t hash() const override;
465
+
466
+ bool operator== (const Expression& rhs) const override;
467
+
468
+ ATTACH_AST_OPERATIONS(Null)
469
+ ATTACH_CRTP_PERFORM_METHODS()
470
+ };
471
+
472
+ //////////////////////////////////
473
+ // The Parent Reference Expression.
474
+ //////////////////////////////////
475
+ class Parent_Reference final : public Value {
476
+ public:
477
+ Parent_Reference(ParserState pstate);
478
+ std::string type() const override { return "parent"; }
479
+ static std::string type_name() { return "parent"; }
480
+ bool operator==(const Expression& rhs) const override {
481
+ return true; // can they ever be not equal?
482
+ };
483
+ ATTACH_AST_OPERATIONS(Parent_Reference)
484
+ ATTACH_CRTP_PERFORM_METHODS()
485
+ };
486
+
487
+ }
488
+
489
+ #endif