sassc4 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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +97 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +51 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/contrib/plugin.cpp +60 -0
- data/ext/libsass/include/sass/base.h +97 -0
- data/ext/libsass/include/sass/context.h +174 -0
- data/ext/libsass/include/sass/functions.h +139 -0
- data/ext/libsass/include/sass/values.h +145 -0
- data/ext/libsass/include/sass/version.h +12 -0
- data/ext/libsass/include/sass.h +15 -0
- data/ext/libsass/include/sass2scss.h +120 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +953 -0
- data/ext/libsass/src/ast.hpp +1064 -0
- data/ext/libsass/src/ast2c.cpp +80 -0
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +140 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
- data/ext/libsass/src/ast_helpers.hpp +316 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1070 -0
- data/ext/libsass/src/ast_selectors.hpp +523 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/b64/cencode.h +32 -0
- data/ext/libsass/src/b64/encode.h +79 -0
- data/ext/libsass/src/backtrace.cpp +50 -0
- data/ext/libsass/src/backtrace.hpp +29 -0
- data/ext/libsass/src/base64vlq.cpp +47 -0
- data/ext/libsass/src/base64vlq.hpp +30 -0
- data/ext/libsass/src/bind.cpp +312 -0
- data/ext/libsass/src/bind.hpp +15 -0
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/c99func.c +54 -0
- data/ext/libsass/src/cencode.c +106 -0
- data/ext/libsass/src/check_nesting.cpp +393 -0
- data/ext/libsass/src/check_nesting.hpp +70 -0
- data/ext/libsass/src/color_maps.cpp +652 -0
- data/ext/libsass/src/color_maps.hpp +323 -0
- data/ext/libsass/src/color_spaces.cpp +241 -0
- data/ext/libsass/src/color_spaces.hpp +227 -0
- data/ext/libsass/src/constants.cpp +199 -0
- data/ext/libsass/src/constants.hpp +200 -0
- data/ext/libsass/src/context.cpp +870 -0
- data/ext/libsass/src/context.hpp +140 -0
- data/ext/libsass/src/cssize.cpp +521 -0
- data/ext/libsass/src/cssize.hpp +71 -0
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debug.hpp +43 -0
- data/ext/libsass/src/debugger.hpp +964 -0
- data/ext/libsass/src/emitter.cpp +297 -0
- data/ext/libsass/src/emitter.hpp +101 -0
- data/ext/libsass/src/environment.cpp +260 -0
- data/ext/libsass/src/environment.hpp +124 -0
- data/ext/libsass/src/error_handling.cpp +239 -0
- data/ext/libsass/src/error_handling.hpp +248 -0
- data/ext/libsass/src/eval.cpp +1543 -0
- data/ext/libsass/src/eval.hpp +110 -0
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +875 -0
- data/ext/libsass/src/expand.hpp +98 -0
- data/ext/libsass/src/extender.cpp +1226 -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 +531 -0
- data/ext/libsass/src/file.hpp +124 -0
- data/ext/libsass/src/fn_colors.cpp +836 -0
- data/ext/libsass/src/fn_colors.hpp +99 -0
- data/ext/libsass/src/fn_lists.cpp +285 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +248 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +246 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +159 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +1126 -0
- data/ext/libsass/src/inspect.hpp +101 -0
- data/ext/libsass/src/json.cpp +1436 -0
- data/ext/libsass/src/json.hpp +117 -0
- data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
- data/ext/libsass/src/lexer.cpp +122 -0
- data/ext/libsass/src/lexer.hpp +304 -0
- data/ext/libsass/src/listize.cpp +70 -0
- data/ext/libsass/src/listize.hpp +37 -0
- data/ext/libsass/src/mapping.hpp +19 -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/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +223 -0
- data/ext/libsass/src/operators.cpp +267 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +320 -0
- data/ext/libsass/src/output.hpp +47 -0
- data/ext/libsass/src/parser.cpp +3059 -0
- data/ext/libsass/src/parser.hpp +395 -0
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +188 -0
- data/ext/libsass/src/plugins.hpp +57 -0
- data/ext/libsass/src/position.cpp +163 -0
- data/ext/libsass/src/position.hpp +147 -0
- data/ext/libsass/src/prelexer.cpp +1780 -0
- data/ext/libsass/src/prelexer.hpp +484 -0
- data/ext/libsass/src/remove_placeholders.cpp +86 -0
- data/ext/libsass/src/remove_placeholders.hpp +37 -0
- data/ext/libsass/src/sass.cpp +156 -0
- data/ext/libsass/src/sass.hpp +147 -0
- data/ext/libsass/src/sass2scss.cpp +895 -0
- data/ext/libsass/src/sass_context.cpp +742 -0
- data/ext/libsass/src/sass_context.hpp +129 -0
- data/ext/libsass/src/sass_functions.cpp +210 -0
- data/ext/libsass/src/sass_functions.hpp +50 -0
- data/ext/libsass/src/sass_values.cpp +362 -0
- data/ext/libsass/src/sass_values.hpp +82 -0
- 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 +202 -0
- data/ext/libsass/src/source_map.hpp +65 -0
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +114 -0
- data/ext/libsass/src/to_value.hpp +46 -0
- data/ext/libsass/src/units.cpp +507 -0
- data/ext/libsass/src/units.hpp +110 -0
- data/ext/libsass/src/utf8/checked.h +336 -0
- data/ext/libsass/src/utf8/core.h +332 -0
- data/ext/libsass/src/utf8/unchecked.h +235 -0
- data/ext/libsass/src/utf8.h +34 -0
- data/ext/libsass/src/utf8_string.cpp +104 -0
- data/ext/libsass/src/utf8_string.hpp +38 -0
- data/ext/libsass/src/util.cpp +723 -0
- data/ext/libsass/src/util.hpp +105 -0
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +140 -0
- data/ext/libsass/src/values.hpp +12 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +141 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +73 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +159 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/native.rb +64 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script.rb +17 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/version.rb +5 -0
- data/lib/sassc.rb +57 -0
- data/sassc.gemspec +69 -0
- data/test/css_color_level4_test.rb +168 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +340 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +396 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
#ifndef SASS_AST_SEL_H
|
|
2
|
+
#define SASS_AST_SEL_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
|
+
// Some helper functions
|
|
13
|
+
/////////////////////////////////////////////////////////////////////////
|
|
14
|
+
|
|
15
|
+
bool compoundIsSuperselector(
|
|
16
|
+
const CompoundSelectorObj& compound1,
|
|
17
|
+
const CompoundSelectorObj& compound2,
|
|
18
|
+
const sass::vector<SelectorComponentObj>& parents);
|
|
19
|
+
|
|
20
|
+
bool complexIsParentSuperselector(
|
|
21
|
+
const sass::vector<SelectorComponentObj>& complex1,
|
|
22
|
+
const sass::vector<SelectorComponentObj>& complex2);
|
|
23
|
+
|
|
24
|
+
sass::vector<sass::vector<SelectorComponentObj>> weave(
|
|
25
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& complexes);
|
|
26
|
+
|
|
27
|
+
sass::vector<sass::vector<SelectorComponentObj>> weaveParents(
|
|
28
|
+
sass::vector<SelectorComponentObj> parents1,
|
|
29
|
+
sass::vector<SelectorComponentObj> parents2);
|
|
30
|
+
|
|
31
|
+
sass::vector<SimpleSelectorObj> unifyCompound(
|
|
32
|
+
const sass::vector<SimpleSelectorObj>& compound1,
|
|
33
|
+
const sass::vector<SimpleSelectorObj>& compound2);
|
|
34
|
+
|
|
35
|
+
sass::vector<sass::vector<SelectorComponentObj>> unifyComplex(
|
|
36
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& complexes);
|
|
37
|
+
|
|
38
|
+
/////////////////////////////////////////
|
|
39
|
+
// Abstract base class for CSS selectors.
|
|
40
|
+
/////////////////////////////////////////
|
|
41
|
+
class Selector : public Expression {
|
|
42
|
+
protected:
|
|
43
|
+
mutable size_t hash_;
|
|
44
|
+
public:
|
|
45
|
+
Selector(SourceSpan pstate);
|
|
46
|
+
virtual ~Selector() = 0;
|
|
47
|
+
size_t hash() const override = 0;
|
|
48
|
+
virtual bool has_real_parent_ref() const;
|
|
49
|
+
// you should reset this to null on containers
|
|
50
|
+
virtual unsigned long specificity() const = 0;
|
|
51
|
+
// by default we return the regular specificity
|
|
52
|
+
// you must override this for all containers
|
|
53
|
+
virtual size_t maxSpecificity() const { return specificity(); }
|
|
54
|
+
virtual size_t minSpecificity() const { return specificity(); }
|
|
55
|
+
// dispatch to correct handlers
|
|
56
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(Selector)
|
|
57
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Selector)
|
|
58
|
+
};
|
|
59
|
+
inline Selector::~Selector() { }
|
|
60
|
+
|
|
61
|
+
/////////////////////////////////////////////////////////////////////////
|
|
62
|
+
// Interpolated selectors -- the interpolated String will be expanded and
|
|
63
|
+
// re-parsed into a normal selector class.
|
|
64
|
+
/////////////////////////////////////////////////////////////////////////
|
|
65
|
+
class Selector_Schema final : public AST_Node {
|
|
66
|
+
ADD_PROPERTY(String_Schema_Obj, contents)
|
|
67
|
+
ADD_PROPERTY(bool, connect_parent);
|
|
68
|
+
// store computed hash
|
|
69
|
+
mutable size_t hash_;
|
|
70
|
+
public:
|
|
71
|
+
Selector_Schema(SourceSpan pstate, String_Obj c);
|
|
72
|
+
|
|
73
|
+
bool has_real_parent_ref() const;
|
|
74
|
+
// selector schema is not yet a final selector, so we do not
|
|
75
|
+
// have a specificity for it yet. We need to
|
|
76
|
+
virtual unsigned long specificity() const;
|
|
77
|
+
size_t hash() const override;
|
|
78
|
+
ATTACH_AST_OPERATIONS(Selector_Schema)
|
|
79
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
////////////////////////////////////////////
|
|
83
|
+
// Abstract base class for simple selectors.
|
|
84
|
+
////////////////////////////////////////////
|
|
85
|
+
class SimpleSelector : public Selector {
|
|
86
|
+
public:
|
|
87
|
+
enum Simple_Type {
|
|
88
|
+
ID_SEL,
|
|
89
|
+
TYPE_SEL,
|
|
90
|
+
CLASS_SEL,
|
|
91
|
+
PSEUDO_SEL,
|
|
92
|
+
ATTRIBUTE_SEL,
|
|
93
|
+
PLACEHOLDER_SEL,
|
|
94
|
+
};
|
|
95
|
+
public:
|
|
96
|
+
HASH_CONSTREF(sass::string, ns)
|
|
97
|
+
HASH_CONSTREF(sass::string, name)
|
|
98
|
+
ADD_PROPERTY(Simple_Type, simple_type)
|
|
99
|
+
HASH_PROPERTY(bool, has_ns)
|
|
100
|
+
public:
|
|
101
|
+
SimpleSelector(SourceSpan pstate, sass::string n = "");
|
|
102
|
+
// ordering within parent (peudos go last)
|
|
103
|
+
virtual int getSortOrder() const = 0;
|
|
104
|
+
virtual sass::string ns_name() const;
|
|
105
|
+
size_t hash() const override;
|
|
106
|
+
virtual bool empty() const;
|
|
107
|
+
// namespace compare functions
|
|
108
|
+
bool is_ns_eq(const SimpleSelector& r) const;
|
|
109
|
+
// namespace query functions
|
|
110
|
+
bool is_universal_ns() const;
|
|
111
|
+
bool is_empty_ns() const;
|
|
112
|
+
bool has_empty_ns() const;
|
|
113
|
+
bool has_qualified_ns() const;
|
|
114
|
+
// name query functions
|
|
115
|
+
bool is_universal() const;
|
|
116
|
+
virtual bool has_placeholder();
|
|
117
|
+
|
|
118
|
+
virtual ~SimpleSelector() = 0;
|
|
119
|
+
virtual CompoundSelector* unifyWith(CompoundSelector*);
|
|
120
|
+
|
|
121
|
+
/* helper function for syntax sugar */
|
|
122
|
+
virtual IDSelector* getIdSelector() { return NULL; }
|
|
123
|
+
virtual TypeSelector* getTypeSelector() { return NULL; }
|
|
124
|
+
virtual PseudoSelector* getPseudoSelector() { return NULL; }
|
|
125
|
+
|
|
126
|
+
ComplexSelectorObj wrapInComplex();
|
|
127
|
+
CompoundSelectorObj wrapInCompound();
|
|
128
|
+
|
|
129
|
+
virtual bool isInvisible() const { return false; }
|
|
130
|
+
virtual bool is_pseudo_element() const;
|
|
131
|
+
virtual bool has_real_parent_ref() const override;
|
|
132
|
+
|
|
133
|
+
bool operator==(const Selector& rhs) const final override;
|
|
134
|
+
|
|
135
|
+
virtual bool operator==(const SelectorList& rhs) const;
|
|
136
|
+
virtual bool operator==(const ComplexSelector& rhs) const;
|
|
137
|
+
virtual bool operator==(const CompoundSelector& rhs) const;
|
|
138
|
+
|
|
139
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(SimpleSelector);
|
|
140
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(SimpleSelector);
|
|
141
|
+
ATTACH_CRTP_PERFORM_METHODS();
|
|
142
|
+
|
|
143
|
+
};
|
|
144
|
+
inline SimpleSelector::~SimpleSelector() { }
|
|
145
|
+
|
|
146
|
+
/////////////////////////////////////////////////////////////////////////
|
|
147
|
+
// Placeholder selectors (e.g., "%foo") for use in extend-only selectors.
|
|
148
|
+
/////////////////////////////////////////////////////////////////////////
|
|
149
|
+
class PlaceholderSelector final : public SimpleSelector {
|
|
150
|
+
public:
|
|
151
|
+
PlaceholderSelector(SourceSpan pstate, sass::string n);
|
|
152
|
+
int getSortOrder() const override final { return 0; }
|
|
153
|
+
bool isInvisible() const override { return true; }
|
|
154
|
+
virtual unsigned long specificity() const override;
|
|
155
|
+
virtual bool has_placeholder() override;
|
|
156
|
+
bool operator==(const SimpleSelector& rhs) const override;
|
|
157
|
+
ATTACH_CMP_OPERATIONS(PlaceholderSelector)
|
|
158
|
+
ATTACH_AST_OPERATIONS(PlaceholderSelector)
|
|
159
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/////////////////////////////////////////////////////////////////////
|
|
163
|
+
// Type selectors (and the universal selector) -- e.g., div, span, *.
|
|
164
|
+
/////////////////////////////////////////////////////////////////////
|
|
165
|
+
class TypeSelector final : public SimpleSelector {
|
|
166
|
+
public:
|
|
167
|
+
TypeSelector(SourceSpan pstate, sass::string n);
|
|
168
|
+
int getSortOrder() const override final { return 1; }
|
|
169
|
+
virtual unsigned long specificity() const override;
|
|
170
|
+
SimpleSelector* unifyWith(const SimpleSelector*);
|
|
171
|
+
CompoundSelector* unifyWith(CompoundSelector*) override;
|
|
172
|
+
TypeSelector* getTypeSelector() override { return this; }
|
|
173
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
|
174
|
+
ATTACH_CMP_OPERATIONS(TypeSelector)
|
|
175
|
+
ATTACH_AST_OPERATIONS(TypeSelector)
|
|
176
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
////////////////////////////////////////////////
|
|
180
|
+
// Class selectors -- i.e., .foo.
|
|
181
|
+
////////////////////////////////////////////////
|
|
182
|
+
class ClassSelector final : public SimpleSelector {
|
|
183
|
+
public:
|
|
184
|
+
ClassSelector(SourceSpan pstate, sass::string n);
|
|
185
|
+
int getSortOrder() const override final { return 2; }
|
|
186
|
+
virtual unsigned long specificity() const override;
|
|
187
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
|
188
|
+
ATTACH_CMP_OPERATIONS(ClassSelector)
|
|
189
|
+
ATTACH_AST_OPERATIONS(ClassSelector)
|
|
190
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
////////////////////////////////////////////////
|
|
194
|
+
// ID selectors -- i.e., #foo.
|
|
195
|
+
////////////////////////////////////////////////
|
|
196
|
+
class IDSelector final : public SimpleSelector {
|
|
197
|
+
public:
|
|
198
|
+
IDSelector(SourceSpan pstate, sass::string n);
|
|
199
|
+
int getSortOrder() const override final { return 2; }
|
|
200
|
+
virtual unsigned long specificity() const override;
|
|
201
|
+
CompoundSelector* unifyWith(CompoundSelector*) override;
|
|
202
|
+
IDSelector* getIdSelector() final override { return this; }
|
|
203
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
|
204
|
+
ATTACH_CMP_OPERATIONS(IDSelector)
|
|
205
|
+
ATTACH_AST_OPERATIONS(IDSelector)
|
|
206
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
///////////////////////////////////////////////////
|
|
210
|
+
// Attribute selectors -- e.g., [src*=".jpg"], etc.
|
|
211
|
+
///////////////////////////////////////////////////
|
|
212
|
+
class AttributeSelector final : public SimpleSelector {
|
|
213
|
+
ADD_CONSTREF(sass::string, matcher)
|
|
214
|
+
// this cannot be changed to obj atm!!!!!!????!!!!!!!
|
|
215
|
+
ADD_PROPERTY(String_Obj, value) // might be interpolated
|
|
216
|
+
ADD_PROPERTY(char, modifier);
|
|
217
|
+
public:
|
|
218
|
+
AttributeSelector(SourceSpan pstate, sass::string n, sass::string m, String_Obj v, char o = 0);
|
|
219
|
+
int getSortOrder() const override final { return 2; }
|
|
220
|
+
size_t hash() const override;
|
|
221
|
+
virtual unsigned long specificity() const override;
|
|
222
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
|
223
|
+
ATTACH_CMP_OPERATIONS(AttributeSelector)
|
|
224
|
+
ATTACH_AST_OPERATIONS(AttributeSelector)
|
|
225
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
//////////////////////////////////////////////////////////////////
|
|
229
|
+
// Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc.
|
|
230
|
+
//////////////////////////////////////////////////////////////////
|
|
231
|
+
// Pseudo Selector cannot have any namespace?
|
|
232
|
+
class PseudoSelector final : public SimpleSelector {
|
|
233
|
+
ADD_PROPERTY(sass::string, normalized)
|
|
234
|
+
ADD_PROPERTY(String_Obj, argument)
|
|
235
|
+
ADD_PROPERTY(SelectorListObj, selector)
|
|
236
|
+
ADD_PROPERTY(bool, isSyntacticClass)
|
|
237
|
+
ADD_PROPERTY(bool, isClass)
|
|
238
|
+
public:
|
|
239
|
+
PseudoSelector(SourceSpan pstate, sass::string n, bool element = false);
|
|
240
|
+
int getSortOrder() const override final { return 3; }
|
|
241
|
+
virtual bool is_pseudo_element() const override;
|
|
242
|
+
size_t hash() const override;
|
|
243
|
+
|
|
244
|
+
bool empty() const override;
|
|
245
|
+
|
|
246
|
+
bool has_real_parent_ref() const override;
|
|
247
|
+
|
|
248
|
+
// Whether this is a pseudo-element selector.
|
|
249
|
+
// This is `true` if and only if [isClass] is `false`.
|
|
250
|
+
bool isElement() const { return !isClass(); }
|
|
251
|
+
|
|
252
|
+
// Whether this is syntactically a pseudo-element selector.
|
|
253
|
+
// This is `true` if and only if [isSyntacticClass] is `false`.
|
|
254
|
+
bool isSyntacticElement() const { return !isSyntacticClass(); }
|
|
255
|
+
|
|
256
|
+
virtual unsigned long specificity() const override;
|
|
257
|
+
PseudoSelectorObj withSelector(SelectorListObj selector);
|
|
258
|
+
|
|
259
|
+
CompoundSelector* unifyWith(CompoundSelector*) override;
|
|
260
|
+
PseudoSelector* getPseudoSelector() final override { return this; }
|
|
261
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
|
262
|
+
ATTACH_CMP_OPERATIONS(PseudoSelector)
|
|
263
|
+
ATTACH_AST_OPERATIONS(PseudoSelector)
|
|
264
|
+
void cloneChildren() override;
|
|
265
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
////////////////////////////////////////////////////////////////////////////
|
|
270
|
+
// Complex Selectors are the most important class of selectors.
|
|
271
|
+
// A Selector List consists of Complex Selectors (separated by comma)
|
|
272
|
+
// Complex Selectors are itself a list of Compounds and Combinators
|
|
273
|
+
// Between each item there is an implicit ancestor of combinator
|
|
274
|
+
////////////////////////////////////////////////////////////////////////////
|
|
275
|
+
class ComplexSelector final : public Selector, public Vectorized<SelectorComponentObj> {
|
|
276
|
+
ADD_PROPERTY(bool, chroots);
|
|
277
|
+
// line break before list separator
|
|
278
|
+
ADD_PROPERTY(bool, hasPreLineFeed);
|
|
279
|
+
public:
|
|
280
|
+
ComplexSelector(SourceSpan pstate);
|
|
281
|
+
|
|
282
|
+
// Returns true if the first components
|
|
283
|
+
// is a compound selector and fulfills
|
|
284
|
+
// a few other criteria.
|
|
285
|
+
bool isInvisible() const;
|
|
286
|
+
bool isInvalidCss() const;
|
|
287
|
+
|
|
288
|
+
size_t hash() const override;
|
|
289
|
+
void cloneChildren() override;
|
|
290
|
+
bool has_placeholder() const;
|
|
291
|
+
bool has_real_parent_ref() const override;
|
|
292
|
+
|
|
293
|
+
SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
|
|
294
|
+
virtual unsigned long specificity() const override;
|
|
295
|
+
|
|
296
|
+
SelectorList* unifyWith(ComplexSelector* rhs);
|
|
297
|
+
|
|
298
|
+
bool isSuperselectorOf(const ComplexSelector* sub) const;
|
|
299
|
+
|
|
300
|
+
SelectorListObj wrapInList();
|
|
301
|
+
|
|
302
|
+
size_t maxSpecificity() const override;
|
|
303
|
+
size_t minSpecificity() const override;
|
|
304
|
+
|
|
305
|
+
bool operator==(const Selector& rhs) const override;
|
|
306
|
+
bool operator==(const SelectorList& rhs) const;
|
|
307
|
+
bool operator==(const CompoundSelector& rhs) const;
|
|
308
|
+
bool operator==(const SimpleSelector& rhs) const;
|
|
309
|
+
|
|
310
|
+
ATTACH_CMP_OPERATIONS(ComplexSelector)
|
|
311
|
+
ATTACH_AST_OPERATIONS(ComplexSelector)
|
|
312
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
////////////////////////////////////////////////////////////////////////////
|
|
316
|
+
// Base class for complex selector components
|
|
317
|
+
////////////////////////////////////////////////////////////////////////////
|
|
318
|
+
class SelectorComponent : public Selector {
|
|
319
|
+
// line break after list separator
|
|
320
|
+
ADD_PROPERTY(bool, hasPostLineBreak)
|
|
321
|
+
public:
|
|
322
|
+
SelectorComponent(SourceSpan pstate, bool postLineBreak = false);
|
|
323
|
+
size_t hash() const override = 0;
|
|
324
|
+
void cloneChildren() override;
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
// By default we consider instances not empty
|
|
328
|
+
virtual bool empty() const { return false; }
|
|
329
|
+
|
|
330
|
+
virtual bool has_placeholder() const = 0;
|
|
331
|
+
bool has_real_parent_ref() const override = 0;
|
|
332
|
+
|
|
333
|
+
ComplexSelector* wrapInComplex();
|
|
334
|
+
|
|
335
|
+
size_t maxSpecificity() const override { return 0; }
|
|
336
|
+
size_t minSpecificity() const override { return 0; }
|
|
337
|
+
|
|
338
|
+
virtual bool isCompound() const { return false; };
|
|
339
|
+
virtual bool isCombinator() const { return false; };
|
|
340
|
+
|
|
341
|
+
/* helper function for syntax sugar */
|
|
342
|
+
virtual CompoundSelector* getCompound() { return NULL; }
|
|
343
|
+
virtual SelectorCombinator* getCombinator() { return NULL; }
|
|
344
|
+
virtual const CompoundSelector* getCompound() const { return NULL; }
|
|
345
|
+
virtual const SelectorCombinator* getCombinator() const { return NULL; }
|
|
346
|
+
|
|
347
|
+
virtual unsigned long specificity() const override;
|
|
348
|
+
bool operator==(const Selector& rhs) const override = 0;
|
|
349
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(SelectorComponent);
|
|
350
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(SelectorComponent);
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
////////////////////////////////////////////////////////////////////////////
|
|
354
|
+
// A specific combinator between compound selectors
|
|
355
|
+
////////////////////////////////////////////////////////////////////////////
|
|
356
|
+
class SelectorCombinator final : public SelectorComponent {
|
|
357
|
+
public:
|
|
358
|
+
|
|
359
|
+
// Enumerate all possible selector combinators. There is some
|
|
360
|
+
// discrepancy with dart-sass. Opted to name them as in CSS33
|
|
361
|
+
enum Combinator { CHILD /* > */, GENERAL /* ~ */, ADJACENT /* + */};
|
|
362
|
+
|
|
363
|
+
private:
|
|
364
|
+
|
|
365
|
+
// Store the type of this combinator
|
|
366
|
+
HASH_CONSTREF(Combinator, combinator)
|
|
367
|
+
|
|
368
|
+
public:
|
|
369
|
+
SelectorCombinator(SourceSpan pstate, Combinator combinator, bool postLineBreak = false);
|
|
370
|
+
|
|
371
|
+
bool has_real_parent_ref() const override { return false; }
|
|
372
|
+
bool has_placeholder() const override { return false; }
|
|
373
|
+
|
|
374
|
+
/* helper function for syntax sugar */
|
|
375
|
+
SelectorCombinator* getCombinator() final override { return this; }
|
|
376
|
+
const SelectorCombinator* getCombinator() const final override { return this; }
|
|
377
|
+
|
|
378
|
+
// Query type of combinator
|
|
379
|
+
bool isCombinator() const override { return true; };
|
|
380
|
+
|
|
381
|
+
// Matches the right-hand selector if it's a direct child of the left-
|
|
382
|
+
// hand selector in the DOM tree. Dart-sass also calls this `child`
|
|
383
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Child_combinator
|
|
384
|
+
bool isChildCombinator() const { return combinator_ == CHILD; } // >
|
|
385
|
+
|
|
386
|
+
// Matches the right-hand selector if it comes after the left-hand
|
|
387
|
+
// selector in the DOM tree. Dart-sass class this `followingSibling`
|
|
388
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_combinator
|
|
389
|
+
bool isGeneralCombinator() const { return combinator_ == GENERAL; } // ~
|
|
390
|
+
|
|
391
|
+
// Matches the right-hand selector if it's immediately adjacent to the
|
|
392
|
+
// left-hand selector in the DOM tree. Dart-sass calls this `nextSibling`
|
|
393
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
|
|
394
|
+
bool isAdjacentCombinator() const { return combinator_ == ADJACENT; } // +
|
|
395
|
+
|
|
396
|
+
size_t maxSpecificity() const override { return 0; }
|
|
397
|
+
size_t minSpecificity() const override { return 0; }
|
|
398
|
+
|
|
399
|
+
size_t hash() const override {
|
|
400
|
+
return std::hash<int>()(combinator_);
|
|
401
|
+
}
|
|
402
|
+
void cloneChildren() override;
|
|
403
|
+
virtual unsigned long specificity() const override;
|
|
404
|
+
bool operator==(const Selector& rhs) const override;
|
|
405
|
+
bool operator==(const SelectorComponent& rhs) const override;
|
|
406
|
+
|
|
407
|
+
ATTACH_CMP_OPERATIONS(SelectorCombinator)
|
|
408
|
+
ATTACH_AST_OPERATIONS(SelectorCombinator)
|
|
409
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
////////////////////////////////////////////////////////////////////////////
|
|
413
|
+
// A compound selector consists of multiple simple selectors
|
|
414
|
+
////////////////////////////////////////////////////////////////////////////
|
|
415
|
+
class CompoundSelector final : public SelectorComponent, public Vectorized<SimpleSelectorObj> {
|
|
416
|
+
ADD_PROPERTY(bool, hasRealParent)
|
|
417
|
+
public:
|
|
418
|
+
CompoundSelector(SourceSpan pstate, bool postLineBreak = false);
|
|
419
|
+
|
|
420
|
+
// Returns true if this compound selector
|
|
421
|
+
// fulfills various criteria.
|
|
422
|
+
bool isInvisible() const;
|
|
423
|
+
|
|
424
|
+
bool empty() const override {
|
|
425
|
+
return Vectorized::empty();
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
size_t hash() const override;
|
|
429
|
+
CompoundSelector* unifyWith(CompoundSelector* rhs);
|
|
430
|
+
|
|
431
|
+
/* helper function for syntax sugar */
|
|
432
|
+
CompoundSelector* getCompound() final override { return this; }
|
|
433
|
+
const CompoundSelector* getCompound() const final override { return this; }
|
|
434
|
+
|
|
435
|
+
bool isSuperselectorOf(const CompoundSelector* sub, sass::string wrapped = "") const;
|
|
436
|
+
|
|
437
|
+
void cloneChildren() override;
|
|
438
|
+
bool has_real_parent_ref() const override;
|
|
439
|
+
bool has_placeholder() const override;
|
|
440
|
+
sass::vector<ComplexSelectorObj> resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
|
|
441
|
+
|
|
442
|
+
virtual bool isCompound() const override { return true; };
|
|
443
|
+
virtual unsigned long specificity() const override;
|
|
444
|
+
|
|
445
|
+
size_t maxSpecificity() const override;
|
|
446
|
+
size_t minSpecificity() const override;
|
|
447
|
+
|
|
448
|
+
bool operator==(const Selector& rhs) const override;
|
|
449
|
+
|
|
450
|
+
bool operator==(const SelectorComponent& rhs) const override;
|
|
451
|
+
|
|
452
|
+
bool operator==(const SelectorList& rhs) const;
|
|
453
|
+
bool operator==(const ComplexSelector& rhs) const;
|
|
454
|
+
bool operator==(const SimpleSelector& rhs) const;
|
|
455
|
+
|
|
456
|
+
void sortChildren();
|
|
457
|
+
bool isInvalidCss() const;
|
|
458
|
+
|
|
459
|
+
ATTACH_CMP_OPERATIONS(CompoundSelector)
|
|
460
|
+
ATTACH_AST_OPERATIONS(CompoundSelector)
|
|
461
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
///////////////////////////////////
|
|
465
|
+
// Comma-separated selector groups.
|
|
466
|
+
///////////////////////////////////
|
|
467
|
+
class SelectorList final : public Selector, public Vectorized<ComplexSelectorObj> {
|
|
468
|
+
private:
|
|
469
|
+
// maybe we have optional flag
|
|
470
|
+
// ToDo: should be at ExtendRule?
|
|
471
|
+
ADD_PROPERTY(bool, is_optional)
|
|
472
|
+
public:
|
|
473
|
+
SelectorList(SourceSpan pstate, size_t s = 0);
|
|
474
|
+
sass::string type() const override { return "list"; }
|
|
475
|
+
size_t hash() const override;
|
|
476
|
+
|
|
477
|
+
SelectorList* unifyWith(SelectorList*);
|
|
478
|
+
|
|
479
|
+
// Returns true if all complex selectors
|
|
480
|
+
// can have real parents, meaning every
|
|
481
|
+
// first component does allow for it
|
|
482
|
+
bool isInvisible() const;
|
|
483
|
+
|
|
484
|
+
void cloneChildren() override;
|
|
485
|
+
bool has_real_parent_ref() const override;
|
|
486
|
+
SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
|
|
487
|
+
virtual unsigned long specificity() const override;
|
|
488
|
+
|
|
489
|
+
bool isSuperselectorOf(const SelectorList* sub) const;
|
|
490
|
+
|
|
491
|
+
size_t maxSpecificity() const override;
|
|
492
|
+
size_t minSpecificity() const override;
|
|
493
|
+
|
|
494
|
+
bool operator==(const Selector& rhs) const override;
|
|
495
|
+
bool operator==(const ComplexSelector& rhs) const;
|
|
496
|
+
bool operator==(const CompoundSelector& rhs) const;
|
|
497
|
+
bool operator==(const SimpleSelector& rhs) const;
|
|
498
|
+
// Selector Lists can be compared to comma lists
|
|
499
|
+
bool operator==(const Expression& rhs) const override;
|
|
500
|
+
|
|
501
|
+
ATTACH_CMP_OPERATIONS(SelectorList)
|
|
502
|
+
ATTACH_AST_OPERATIONS(SelectorList)
|
|
503
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
////////////////////////////////
|
|
507
|
+
// The Sass `@extend` directive.
|
|
508
|
+
////////////////////////////////
|
|
509
|
+
class ExtendRule final : public Statement {
|
|
510
|
+
ADD_PROPERTY(bool, isOptional)
|
|
511
|
+
// This should be a simple selector only!
|
|
512
|
+
ADD_PROPERTY(SelectorListObj, selector)
|
|
513
|
+
ADD_PROPERTY(Selector_Schema_Obj, schema)
|
|
514
|
+
public:
|
|
515
|
+
ExtendRule(SourceSpan pstate, SelectorListObj s);
|
|
516
|
+
ExtendRule(SourceSpan pstate, Selector_Schema_Obj s);
|
|
517
|
+
ATTACH_AST_OPERATIONS(ExtendRule)
|
|
518
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
#endif
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
#include "ast.hpp"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////
|
|
11
|
+
|
|
12
|
+
SupportsRule::SupportsRule(SourceSpan pstate, SupportsConditionObj condition, Block_Obj block)
|
|
13
|
+
: ParentStatement(pstate, block), condition_(condition)
|
|
14
|
+
{ statement_type(SUPPORTS); }
|
|
15
|
+
SupportsRule::SupportsRule(const SupportsRule* ptr)
|
|
16
|
+
: ParentStatement(ptr), condition_(ptr->condition_)
|
|
17
|
+
{ statement_type(SUPPORTS); }
|
|
18
|
+
bool SupportsRule::bubbles() { return true; }
|
|
19
|
+
|
|
20
|
+
/////////////////////////////////////////////////////////////////////////
|
|
21
|
+
/////////////////////////////////////////////////////////////////////////
|
|
22
|
+
|
|
23
|
+
SupportsCondition::SupportsCondition(SourceSpan pstate)
|
|
24
|
+
: Expression(pstate)
|
|
25
|
+
{ }
|
|
26
|
+
|
|
27
|
+
SupportsCondition::SupportsCondition(const SupportsCondition* ptr)
|
|
28
|
+
: Expression(ptr)
|
|
29
|
+
{ }
|
|
30
|
+
|
|
31
|
+
/////////////////////////////////////////////////////////////////////////
|
|
32
|
+
/////////////////////////////////////////////////////////////////////////
|
|
33
|
+
|
|
34
|
+
SupportsOperation::SupportsOperation(SourceSpan pstate, SupportsConditionObj l, SupportsConditionObj r, Operand o)
|
|
35
|
+
: SupportsCondition(pstate), left_(l), right_(r), operand_(o)
|
|
36
|
+
{ }
|
|
37
|
+
SupportsOperation::SupportsOperation(const SupportsOperation* ptr)
|
|
38
|
+
: SupportsCondition(ptr),
|
|
39
|
+
left_(ptr->left_),
|
|
40
|
+
right_(ptr->right_),
|
|
41
|
+
operand_(ptr->operand_)
|
|
42
|
+
{ }
|
|
43
|
+
|
|
44
|
+
bool SupportsOperation::needs_parens(SupportsConditionObj cond) const
|
|
45
|
+
{
|
|
46
|
+
if (SupportsOperationObj op = Cast<SupportsOperation>(cond)) {
|
|
47
|
+
return op->operand() != operand();
|
|
48
|
+
}
|
|
49
|
+
return Cast<SupportsNegation>(cond) != NULL;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/////////////////////////////////////////////////////////////////////////
|
|
53
|
+
/////////////////////////////////////////////////////////////////////////
|
|
54
|
+
|
|
55
|
+
SupportsNegation::SupportsNegation(SourceSpan pstate, SupportsConditionObj c)
|
|
56
|
+
: SupportsCondition(pstate), condition_(c)
|
|
57
|
+
{ }
|
|
58
|
+
SupportsNegation::SupportsNegation(const SupportsNegation* ptr)
|
|
59
|
+
: SupportsCondition(ptr), condition_(ptr->condition_)
|
|
60
|
+
{ }
|
|
61
|
+
|
|
62
|
+
bool SupportsNegation::needs_parens(SupportsConditionObj cond) const
|
|
63
|
+
{
|
|
64
|
+
return Cast<SupportsNegation>(cond) ||
|
|
65
|
+
Cast<SupportsOperation>(cond);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/////////////////////////////////////////////////////////////////////////
|
|
69
|
+
/////////////////////////////////////////////////////////////////////////
|
|
70
|
+
|
|
71
|
+
SupportsDeclaration::SupportsDeclaration(SourceSpan pstate, ExpressionObj f, ExpressionObj v)
|
|
72
|
+
: SupportsCondition(pstate), feature_(f), value_(v)
|
|
73
|
+
{ }
|
|
74
|
+
SupportsDeclaration::SupportsDeclaration(const SupportsDeclaration* ptr)
|
|
75
|
+
: SupportsCondition(ptr),
|
|
76
|
+
feature_(ptr->feature_),
|
|
77
|
+
value_(ptr->value_)
|
|
78
|
+
{ }
|
|
79
|
+
|
|
80
|
+
bool SupportsDeclaration::needs_parens(SupportsConditionObj cond) const
|
|
81
|
+
{
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/////////////////////////////////////////////////////////////////////////
|
|
86
|
+
/////////////////////////////////////////////////////////////////////////
|
|
87
|
+
|
|
88
|
+
Supports_Interpolation::Supports_Interpolation(SourceSpan pstate, ExpressionObj v)
|
|
89
|
+
: SupportsCondition(pstate), value_(v)
|
|
90
|
+
{ }
|
|
91
|
+
Supports_Interpolation::Supports_Interpolation(const Supports_Interpolation* ptr)
|
|
92
|
+
: SupportsCondition(ptr),
|
|
93
|
+
value_(ptr->value_)
|
|
94
|
+
{ }
|
|
95
|
+
|
|
96
|
+
bool Supports_Interpolation::needs_parens(SupportsConditionObj cond) const
|
|
97
|
+
{
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/////////////////////////////////////////////////////////////////////////
|
|
102
|
+
/////////////////////////////////////////////////////////////////////////
|
|
103
|
+
|
|
104
|
+
IMPLEMENT_AST_OPERATORS(SupportsRule);
|
|
105
|
+
IMPLEMENT_AST_OPERATORS(SupportsCondition);
|
|
106
|
+
IMPLEMENT_AST_OPERATORS(SupportsOperation);
|
|
107
|
+
IMPLEMENT_AST_OPERATORS(SupportsNegation);
|
|
108
|
+
IMPLEMENT_AST_OPERATORS(SupportsDeclaration);
|
|
109
|
+
IMPLEMENT_AST_OPERATORS(Supports_Interpolation);
|
|
110
|
+
|
|
111
|
+
/////////////////////////////////////////////////////////////////////////
|
|
112
|
+
/////////////////////////////////////////////////////////////////////////
|
|
113
|
+
|
|
114
|
+
}
|