sassc 2.1.0.pre3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +24 -0
- data/Rakefile +2 -4
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +11 -13
- data/lib/sassc/native.rb +9 -7
- data/lib/sassc/script.rb +4 -6
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +38 -1
- data/test/native_test.rb +4 -4
- metadata +31 -18
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -1,9 +1,14 @@
|
|
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
|
+
|
4
8
|
// base classes to implement curiously recurring template pattern (CRTP)
|
5
9
|
// https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
|
6
10
|
|
11
|
+
#include <typeinfo>
|
7
12
|
#include <stdexcept>
|
8
13
|
|
9
14
|
#include "ast_fwd_decl.hpp"
|
@@ -14,13 +19,13 @@ namespace Sass {
|
|
14
19
|
#define ATTACH_ABSTRACT_CRTP_PERFORM_METHODS()\
|
15
20
|
virtual void perform(Operation<void>* op) = 0; \
|
16
21
|
virtual Value* perform(Operation<Value*>* op) = 0; \
|
17
|
-
virtual
|
22
|
+
virtual sass::string perform(Operation<sass::string>* op) = 0; \
|
18
23
|
virtual AST_Node* perform(Operation<AST_Node*>* op) = 0; \
|
19
24
|
virtual Selector* perform(Operation<Selector*>* op) = 0; \
|
20
25
|
virtual Statement* perform(Operation<Statement*>* op) = 0; \
|
21
26
|
virtual Expression* perform(Operation<Expression*>* op) = 0; \
|
22
27
|
virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) = 0; \
|
23
|
-
virtual
|
28
|
+
virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) = 0; \
|
24
29
|
|
25
30
|
// you must add operators to every class
|
26
31
|
// ensures `this` of actual instance type
|
@@ -29,13 +34,13 @@ namespace Sass {
|
|
29
34
|
#define ATTACH_CRTP_PERFORM_METHODS()\
|
30
35
|
virtual void perform(Operation<void>* op) override { return (*op)(this); } \
|
31
36
|
virtual Value* perform(Operation<Value*>* op) override { return (*op)(this); } \
|
32
|
-
virtual
|
37
|
+
virtual sass::string perform(Operation<sass::string>* op) override { return (*op)(this); } \
|
33
38
|
virtual AST_Node* perform(Operation<AST_Node*>* op) override { return (*op)(this); } \
|
34
39
|
virtual Selector* perform(Operation<Selector*>* op) override { return (*op)(this); } \
|
35
40
|
virtual Statement* perform(Operation<Statement*>* op) override { return (*op)(this); } \
|
36
41
|
virtual Expression* perform(Operation<Expression*>* op) override { return (*op)(this); } \
|
37
42
|
virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) override { return (*op)(this); } \
|
38
|
-
virtual
|
43
|
+
virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) override { return (*op)(this); } \
|
39
44
|
|
40
45
|
template<typename T>
|
41
46
|
class Operation {
|
@@ -43,29 +48,31 @@ namespace Sass {
|
|
43
48
|
virtual T operator()(AST_Node* x) = 0;
|
44
49
|
// statements
|
45
50
|
virtual T operator()(Block* x) = 0;
|
46
|
-
virtual T operator()(
|
51
|
+
virtual T operator()(StyleRule* x) = 0;
|
47
52
|
virtual T operator()(Bubble* x) = 0;
|
48
53
|
virtual T operator()(Trace* x) = 0;
|
49
|
-
virtual T operator()(
|
50
|
-
virtual T operator()(
|
51
|
-
virtual T operator()(
|
52
|
-
virtual T operator()(
|
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;
|
53
60
|
virtual T operator()(Keyframe_Rule* x) = 0;
|
54
61
|
virtual T operator()(Declaration* x) = 0;
|
55
62
|
virtual T operator()(Assignment* x) = 0;
|
56
63
|
virtual T operator()(Import* x) = 0;
|
57
64
|
virtual T operator()(Import_Stub* x) = 0;
|
58
|
-
virtual T operator()(
|
59
|
-
virtual T operator()(
|
60
|
-
virtual T operator()(
|
65
|
+
virtual T operator()(WarningRule* x) = 0;
|
66
|
+
virtual T operator()(ErrorRule* x) = 0;
|
67
|
+
virtual T operator()(DebugRule* x) = 0;
|
61
68
|
virtual T operator()(Comment* x) = 0;
|
62
69
|
virtual T operator()(If* x) = 0;
|
63
|
-
virtual T operator()(
|
64
|
-
virtual T operator()(
|
65
|
-
virtual T operator()(
|
70
|
+
virtual T operator()(ForRule* x) = 0;
|
71
|
+
virtual T operator()(EachRule* x) = 0;
|
72
|
+
virtual T operator()(WhileRule* x) = 0;
|
66
73
|
virtual T operator()(Return* x) = 0;
|
67
74
|
virtual T operator()(Content* x) = 0;
|
68
|
-
virtual T operator()(
|
75
|
+
virtual T operator()(ExtendRule* x) = 0;
|
69
76
|
virtual T operator()(Definition* x) = 0;
|
70
77
|
virtual T operator()(Mixin_Call* x) = 0;
|
71
78
|
// expressions
|
@@ -87,15 +94,14 @@ namespace Sass {
|
|
87
94
|
virtual T operator()(String_Schema* x) = 0;
|
88
95
|
virtual T operator()(String_Quoted* x) = 0;
|
89
96
|
virtual T operator()(String_Constant* x) = 0;
|
90
|
-
virtual T operator()(
|
91
|
-
virtual T operator()(
|
92
|
-
virtual T operator()(
|
93
|
-
virtual T operator()(
|
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;
|
94
101
|
virtual T operator()(Supports_Interpolation* x) = 0;
|
95
|
-
virtual T operator()(Media_Query* x)
|
102
|
+
virtual T operator()(Media_Query* x) = 0;
|
96
103
|
virtual T operator()(Media_Query_Expression* x) = 0;
|
97
104
|
virtual T operator()(At_Root_Query* x) = 0;
|
98
|
-
virtual T operator()(Parent_Selector* x) = 0;
|
99
105
|
virtual T operator()(Parent_Reference* x) = 0;
|
100
106
|
// parameters and arguments
|
101
107
|
virtual T operator()(Parameter* x) = 0;
|
@@ -104,51 +110,55 @@ namespace Sass {
|
|
104
110
|
virtual T operator()(Arguments* x) = 0;
|
105
111
|
// selectors
|
106
112
|
virtual T operator()(Selector_Schema* x) = 0;
|
107
|
-
virtual T operator()(
|
108
|
-
virtual T operator()(
|
109
|
-
virtual T operator()(
|
110
|
-
virtual T operator()(
|
111
|
-
virtual T operator()(
|
112
|
-
virtual T operator()(
|
113
|
-
virtual T operator()(
|
114
|
-
virtual T operator()(
|
115
|
-
virtual T operator()(
|
116
|
-
virtual T operator()(
|
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;
|
124
|
+
|
117
125
|
};
|
118
126
|
|
119
127
|
// example: Operation_CRTP<Expression*, Eval>
|
120
128
|
// T is the base return type of all visitors
|
121
129
|
// D is the class derived visitor class
|
122
|
-
//
|
130
|
+
// normally you want to implement all operators
|
123
131
|
template <typename T, typename D>
|
124
132
|
class Operation_CRTP : public Operation<T> {
|
125
133
|
public:
|
126
134
|
T operator()(AST_Node* x) { return static_cast<D*>(this)->fallback(x); }
|
127
135
|
// statements
|
128
136
|
T operator()(Block* x) { return static_cast<D*>(this)->fallback(x); }
|
129
|
-
T operator()(
|
137
|
+
T operator()(StyleRule* x) { return static_cast<D*>(this)->fallback(x); }
|
130
138
|
T operator()(Bubble* x) { return static_cast<D*>(this)->fallback(x); }
|
131
139
|
T operator()(Trace* x) { return static_cast<D*>(this)->fallback(x); }
|
132
|
-
T operator()(
|
133
|
-
T operator()(
|
134
|
-
T operator()(
|
135
|
-
T operator()(
|
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); }
|
136
146
|
T operator()(Keyframe_Rule* x) { return static_cast<D*>(this)->fallback(x); }
|
137
147
|
T operator()(Declaration* x) { return static_cast<D*>(this)->fallback(x); }
|
138
148
|
T operator()(Assignment* x) { return static_cast<D*>(this)->fallback(x); }
|
139
149
|
T operator()(Import* x) { return static_cast<D*>(this)->fallback(x); }
|
140
150
|
T operator()(Import_Stub* x) { return static_cast<D*>(this)->fallback(x); }
|
141
|
-
T operator()(
|
142
|
-
T operator()(
|
143
|
-
T operator()(
|
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); }
|
144
154
|
T operator()(Comment* x) { return static_cast<D*>(this)->fallback(x); }
|
145
155
|
T operator()(If* x) { return static_cast<D*>(this)->fallback(x); }
|
146
|
-
T operator()(
|
147
|
-
T operator()(
|
148
|
-
T operator()(
|
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); }
|
149
159
|
T operator()(Return* x) { return static_cast<D*>(this)->fallback(x); }
|
150
160
|
T operator()(Content* x) { return static_cast<D*>(this)->fallback(x); }
|
151
|
-
T operator()(
|
161
|
+
T operator()(ExtendRule* x) { return static_cast<D*>(this)->fallback(x); }
|
152
162
|
T operator()(Definition* x) { return static_cast<D*>(this)->fallback(x); }
|
153
163
|
T operator()(Mixin_Call* x) { return static_cast<D*>(this)->fallback(x); }
|
154
164
|
// expressions
|
@@ -170,15 +180,14 @@ namespace Sass {
|
|
170
180
|
T operator()(String_Schema* x) { return static_cast<D*>(this)->fallback(x); }
|
171
181
|
T operator()(String_Constant* x) { return static_cast<D*>(this)->fallback(x); }
|
172
182
|
T operator()(String_Quoted* x) { return static_cast<D*>(this)->fallback(x); }
|
173
|
-
T operator()(
|
174
|
-
T operator()(
|
175
|
-
T operator()(
|
176
|
-
T operator()(
|
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); }
|
177
187
|
T operator()(Supports_Interpolation* x) { return static_cast<D*>(this)->fallback(x); }
|
178
188
|
T operator()(Media_Query* x) { return static_cast<D*>(this)->fallback(x); }
|
179
189
|
T operator()(Media_Query_Expression* x) { return static_cast<D*>(this)->fallback(x); }
|
180
190
|
T operator()(At_Root_Query* x) { return static_cast<D*>(this)->fallback(x); }
|
181
|
-
T operator()(Parent_Selector* x) { return static_cast<D*>(this)->fallback(x); }
|
182
191
|
T operator()(Parent_Reference* x) { return static_cast<D*>(this)->fallback(x); }
|
183
192
|
// parameters and arguments
|
184
193
|
T operator()(Parameter* x) { return static_cast<D*>(this)->fallback(x); }
|
@@ -187,20 +196,21 @@ namespace Sass {
|
|
187
196
|
T operator()(Arguments* x) { return static_cast<D*>(this)->fallback(x); }
|
188
197
|
// selectors
|
189
198
|
T operator()(Selector_Schema* x) { return static_cast<D*>(this)->fallback(x); }
|
190
|
-
T operator()(
|
191
|
-
T operator()(
|
192
|
-
T operator()(
|
193
|
-
T operator()(
|
194
|
-
T operator()(
|
195
|
-
T operator()(
|
196
|
-
T operator()(
|
197
|
-
T operator()(
|
198
|
-
T operator()(
|
199
|
-
T operator()(
|
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); }
|
200
210
|
|
201
211
|
// fallback with specific type U
|
202
212
|
// will be called if not overloaded
|
203
|
-
template <typename U> T fallback(U x)
|
213
|
+
template <typename U> inline T fallback(U x)
|
204
214
|
{
|
205
215
|
throw std::runtime_error(
|
206
216
|
std::string(typeid(*this).name()) + ": CRTP not implemented for " + typeid(x).name());
|
@@ -2,6 +2,7 @@
|
|
2
2
|
// __EXTENSIONS__ fix on Solaris.
|
3
3
|
#include "sass.hpp"
|
4
4
|
|
5
|
+
#include <cmath>
|
5
6
|
#include "operators.hpp"
|
6
7
|
|
7
8
|
namespace Sass {
|
@@ -30,7 +31,7 @@ namespace Sass {
|
|
30
31
|
};
|
31
32
|
|
32
33
|
/* static function, has no pstate or traces */
|
33
|
-
bool eq(
|
34
|
+
bool eq(ExpressionObj lhs, ExpressionObj rhs)
|
34
35
|
{
|
35
36
|
// operation is undefined if one is not a number
|
36
37
|
if (!lhs || !rhs) throw Exception::UndefinedOperation(lhs, rhs, Sass_OP::EQ);
|
@@ -39,7 +40,7 @@ namespace Sass {
|
|
39
40
|
}
|
40
41
|
|
41
42
|
/* static function, throws OperationError, has no pstate or traces */
|
42
|
-
bool cmp(
|
43
|
+
bool cmp(ExpressionObj lhs, ExpressionObj rhs, const Sass_OP op)
|
43
44
|
{
|
44
45
|
// can only compare numbers!?
|
45
46
|
Number_Obj l = Cast<Number>(lhs);
|
@@ -51,14 +52,14 @@ namespace Sass {
|
|
51
52
|
}
|
52
53
|
|
53
54
|
/* static functions, throws OperationError, has no pstate or traces */
|
54
|
-
bool lt(
|
55
|
-
bool neq(
|
56
|
-
bool gt(
|
57
|
-
bool lte(
|
58
|
-
bool gte(
|
55
|
+
bool lt(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
|
56
|
+
bool neq(ExpressionObj lhs, ExpressionObj rhs) { return eq(lhs, rhs) == false; }
|
57
|
+
bool gt(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
|
58
|
+
bool lte(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
|
59
|
+
bool gte(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
|
59
60
|
|
60
61
|
/* colour math deprecation warning */
|
61
|
-
void op_color_deprecation(enum Sass_OP op,
|
62
|
+
void op_color_deprecation(enum Sass_OP op, sass::string lsh, sass::string rhs, const SourceSpan& pstate)
|
62
63
|
{
|
63
64
|
deprecated(
|
64
65
|
"The operation `" + lsh + " " + sass_op_to_name(op) + " " + rhs +
|
@@ -69,20 +70,20 @@ namespace Sass {
|
|
69
70
|
}
|
70
71
|
|
71
72
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
72
|
-
Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const
|
73
|
+
Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
73
74
|
{
|
74
75
|
enum Sass_OP op = operand.operand;
|
75
76
|
|
76
77
|
String_Quoted* lqstr = Cast<String_Quoted>(&lhs);
|
77
78
|
String_Quoted* rqstr = Cast<String_Quoted>(&rhs);
|
78
79
|
|
79
|
-
|
80
|
-
|
80
|
+
sass::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
|
81
|
+
sass::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
|
81
82
|
|
82
83
|
if (Cast<Null>(&lhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
|
83
84
|
if (Cast<Null>(&rhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
|
84
85
|
|
85
|
-
|
86
|
+
sass::string sep;
|
86
87
|
switch (op) {
|
87
88
|
case Sass_OP::ADD: sep = ""; break;
|
88
89
|
case Sass_OP::SUB: sep = "-"; break;
|
@@ -120,7 +121,7 @@ namespace Sass {
|
|
120
121
|
|
121
122
|
/* ToDo: allow to operate also with hsla colors */
|
122
123
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
123
|
-
Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const
|
124
|
+
Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
124
125
|
{
|
125
126
|
|
126
127
|
if (lhs.a() != rhs.a()) {
|
@@ -141,7 +142,7 @@ namespace Sass {
|
|
141
142
|
}
|
142
143
|
|
143
144
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
144
|
-
Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const
|
145
|
+
Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
145
146
|
{
|
146
147
|
double lval = lhs.value();
|
147
148
|
double rval = rhs.value();
|
@@ -151,7 +152,7 @@ namespace Sass {
|
|
151
152
|
}
|
152
153
|
|
153
154
|
if (op == Sass_OP::DIV && rval == 0) {
|
154
|
-
|
155
|
+
sass::string result(lval ? "Infinity" : "NaN");
|
155
156
|
return SASS_MEMORY_NEW(String_Quoted, pstate, result);
|
156
157
|
}
|
157
158
|
|
@@ -211,7 +212,7 @@ namespace Sass {
|
|
211
212
|
}
|
212
213
|
|
213
214
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
214
|
-
Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const
|
215
|
+
Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
215
216
|
{
|
216
217
|
double lval = lhs.value();
|
217
218
|
|
@@ -228,7 +229,7 @@ namespace Sass {
|
|
228
229
|
}
|
229
230
|
case Sass_OP::SUB:
|
230
231
|
case Sass_OP::DIV: {
|
231
|
-
|
232
|
+
sass::string color(rhs.to_string(opt));
|
232
233
|
op_color_deprecation(op, lhs.to_string(), color, pstate);
|
233
234
|
return SASS_MEMORY_NEW(String_Quoted,
|
234
235
|
pstate,
|
@@ -242,7 +243,7 @@ namespace Sass {
|
|
242
243
|
}
|
243
244
|
|
244
245
|
/* static function, throws OperationError, has no traces but optional pstate for returned value */
|
245
|
-
Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const
|
246
|
+
Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
|
246
247
|
{
|
247
248
|
double rval = rhs.value();
|
248
249
|
|
@@ -9,19 +9,19 @@ namespace Sass {
|
|
9
9
|
namespace Operators {
|
10
10
|
|
11
11
|
// equality operator using AST Node operator==
|
12
|
-
bool eq(
|
13
|
-
bool neq(
|
12
|
+
bool eq(ExpressionObj, ExpressionObj);
|
13
|
+
bool neq(ExpressionObj, ExpressionObj);
|
14
14
|
// specific operators based on cmp and eq
|
15
|
-
bool lt(
|
16
|
-
bool gt(
|
17
|
-
bool lte(
|
18
|
-
bool gte(
|
15
|
+
bool lt(ExpressionObj, ExpressionObj);
|
16
|
+
bool gt(ExpressionObj, ExpressionObj);
|
17
|
+
bool lte(ExpressionObj, ExpressionObj);
|
18
|
+
bool gte(ExpressionObj, ExpressionObj);
|
19
19
|
// arithmetic for all the combinations that matter
|
20
|
-
Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const
|
21
|
-
Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const
|
22
|
-
Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const
|
23
|
-
Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const
|
24
|
-
Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const
|
20
|
+
Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
21
|
+
Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
22
|
+
Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
23
|
+
Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
24
|
+
Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
|
25
25
|
|
26
26
|
};
|
27
27
|
|
@@ -0,0 +1,112 @@
|
|
1
|
+
#ifndef SASS_ORDERED_MAP_H
|
2
|
+
#define SASS_ORDERED_MAP_H
|
3
|
+
|
4
|
+
namespace Sass {
|
5
|
+
|
6
|
+
// ##########################################################################
|
7
|
+
// Very simple and limited container for insert ordered hash map.
|
8
|
+
// Piggy-back implementation on std::unordered_map and sass::vector
|
9
|
+
// ##########################################################################
|
10
|
+
template<
|
11
|
+
class Key,
|
12
|
+
class T,
|
13
|
+
class Hash = std::hash<Key>,
|
14
|
+
class KeyEqual = std::equal_to<Key>,
|
15
|
+
class Allocator = std::allocator<std::pair<const Key, T>>
|
16
|
+
>
|
17
|
+
class ordered_map {
|
18
|
+
|
19
|
+
private:
|
20
|
+
|
21
|
+
using map_type = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>;
|
22
|
+
using map_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::iterator;
|
23
|
+
using map_const_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::const_iterator;
|
24
|
+
|
25
|
+
// The main unordered map
|
26
|
+
map_type _map;
|
27
|
+
|
28
|
+
// Keep insertion order
|
29
|
+
sass::vector<Key> _keys;
|
30
|
+
sass::vector<T> _values;
|
31
|
+
|
32
|
+
const KeyEqual _keyEqual;
|
33
|
+
|
34
|
+
public:
|
35
|
+
|
36
|
+
ordered_map() :
|
37
|
+
_keyEqual(KeyEqual())
|
38
|
+
{
|
39
|
+
}
|
40
|
+
|
41
|
+
ordered_map& operator= (const ordered_map& other) {
|
42
|
+
_map = other._map;
|
43
|
+
_keys = other._keys;
|
44
|
+
_values = other._values;
|
45
|
+
return *this;
|
46
|
+
}
|
47
|
+
|
48
|
+
std::pair<Key, T> front() {
|
49
|
+
return std::make_pair(
|
50
|
+
_keys.front(),
|
51
|
+
_values.front()
|
52
|
+
);
|
53
|
+
}
|
54
|
+
|
55
|
+
bool empty() const {
|
56
|
+
return _keys.empty();
|
57
|
+
}
|
58
|
+
|
59
|
+
void insert(const Key& key, const T& val) {
|
60
|
+
if (!hasKey(key)) {
|
61
|
+
_values.push_back(val);
|
62
|
+
_keys.push_back(key);
|
63
|
+
}
|
64
|
+
_map[key] = val;
|
65
|
+
}
|
66
|
+
|
67
|
+
bool hasKey(const Key& key) const {
|
68
|
+
return _map.find(key) != _map.end();
|
69
|
+
}
|
70
|
+
|
71
|
+
bool erase(const Key& key) {
|
72
|
+
_map.erase(key);
|
73
|
+
// find the position in the array
|
74
|
+
for (size_t i = 0; i < _keys.size(); i += 1) {
|
75
|
+
if (_keyEqual(key, _keys[i])) {
|
76
|
+
_keys.erase(_keys.begin() + i);
|
77
|
+
_values.erase(_values.begin() + i);
|
78
|
+
return true;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
return false;
|
82
|
+
}
|
83
|
+
|
84
|
+
const sass::vector<Key>& keys() const { return _keys; }
|
85
|
+
const sass::vector<T>& values() const { return _values; }
|
86
|
+
|
87
|
+
const T& get(const Key& key) {
|
88
|
+
if (hasKey(key)) {
|
89
|
+
return _map[key];
|
90
|
+
}
|
91
|
+
throw std::runtime_error("Key does not exist");
|
92
|
+
}
|
93
|
+
|
94
|
+
using iterator = typename sass::vector<Key>::iterator;
|
95
|
+
using const_iterator = typename sass::vector<Key>::const_iterator;
|
96
|
+
using reverse_iterator = typename sass::vector<Key>::reverse_iterator;
|
97
|
+
using const_reverse_iterator = typename sass::vector<Key>::const_reverse_iterator;
|
98
|
+
|
99
|
+
typename sass::vector<Key>::iterator end() { return _keys.end(); }
|
100
|
+
typename sass::vector<Key>::iterator begin() { return _keys.begin(); }
|
101
|
+
typename sass::vector<Key>::reverse_iterator rend() { return _keys.rend(); }
|
102
|
+
typename sass::vector<Key>::reverse_iterator rbegin() { return _keys.rbegin(); }
|
103
|
+
typename sass::vector<Key>::const_iterator end() const { return _keys.end(); }
|
104
|
+
typename sass::vector<Key>::const_iterator begin() const { return _keys.begin(); }
|
105
|
+
typename sass::vector<Key>::const_reverse_iterator rend() const { return _keys.rend(); }
|
106
|
+
typename sass::vector<Key>::const_reverse_iterator rbegin() const { return _keys.rbegin(); }
|
107
|
+
|
108
|
+
};
|
109
|
+
|
110
|
+
}
|
111
|
+
|
112
|
+
#endif
|