sassc 2.0.1 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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