sassc 2.2.1 → 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 +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Rakefile +1 -3
- 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/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/memory.hpp +12 -0
- 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 +8 -8
- data/lib/sassc/native.rb +4 -6
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +4 -4
- metadata +29 -15
- 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
@@ -4,68 +4,57 @@
|
|
4
4
|
// sass.hpp must go before all system headers to get the
|
5
5
|
// __EXTENSIONS__ fix on Solaris.
|
6
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"
|
7
|
+
#include "ast.hpp"
|
36
8
|
|
37
9
|
namespace Sass {
|
38
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
|
+
|
39
38
|
/////////////////////////////////////////
|
40
39
|
// Abstract base class for CSS selectors.
|
41
40
|
/////////////////////////////////////////
|
42
41
|
class Selector : public Expression {
|
43
|
-
// line break before list separator
|
44
|
-
ADD_PROPERTY(bool, has_line_feed)
|
45
|
-
// line break after list separator
|
46
|
-
ADD_PROPERTY(bool, has_line_break)
|
47
|
-
// maybe we have optional flag
|
48
|
-
ADD_PROPERTY(bool, is_optional)
|
49
|
-
// must not be a reference counted object
|
50
|
-
// otherwise we create circular references
|
51
|
-
ADD_PROPERTY(Media_Block*, media_block)
|
52
42
|
protected:
|
53
43
|
mutable size_t hash_;
|
54
44
|
public:
|
55
|
-
Selector(
|
45
|
+
Selector(SourceSpan pstate);
|
56
46
|
virtual ~Selector() = 0;
|
57
47
|
size_t hash() const override = 0;
|
58
|
-
virtual unsigned long specificity() const = 0;
|
59
|
-
virtual int unification_order() const = 0;
|
60
|
-
virtual void set_media_block(Media_Block* mb);
|
61
|
-
virtual bool has_parent_ref() const;
|
62
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(); }
|
63
55
|
// dispatch to correct handlers
|
64
|
-
|
65
|
-
|
66
|
-
bool operator>(const Selector& rhs) const { return rhs < *this; };
|
67
|
-
bool operator!=(const Selector& rhs) const { return !(rhs == *this); };
|
68
|
-
ATTACH_VIRTUAL_AST_OPERATIONS(Selector);
|
56
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(Selector)
|
57
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Selector)
|
69
58
|
};
|
70
59
|
inline Selector::~Selector() { }
|
71
60
|
|
@@ -74,19 +63,14 @@ namespace Sass {
|
|
74
63
|
// re-parsed into a normal selector class.
|
75
64
|
/////////////////////////////////////////////////////////////////////////
|
76
65
|
class Selector_Schema final : public AST_Node {
|
77
|
-
ADD_PROPERTY(
|
66
|
+
ADD_PROPERTY(String_Schema_Obj, contents)
|
78
67
|
ADD_PROPERTY(bool, connect_parent);
|
79
|
-
// must not be a reference counted object
|
80
|
-
// otherwise we create circular references
|
81
|
-
ADD_PROPERTY(Media_Block*, media_block)
|
82
68
|
// store computed hash
|
83
69
|
mutable size_t hash_;
|
84
70
|
public:
|
85
|
-
Selector_Schema(
|
86
|
-
|
71
|
+
Selector_Schema(SourceSpan pstate, String_Obj c);
|
72
|
+
|
87
73
|
bool has_real_parent_ref() const;
|
88
|
-
bool operator<(const Selector& rhs) const;
|
89
|
-
bool operator==(const Selector& rhs) const;
|
90
74
|
// selector schema is not yet a final selector, so we do not
|
91
75
|
// have a specificity for it yet. We need to
|
92
76
|
virtual unsigned long specificity() const;
|
@@ -98,30 +82,30 @@ namespace Sass {
|
|
98
82
|
////////////////////////////////////////////
|
99
83
|
// Abstract base class for simple selectors.
|
100
84
|
////////////////////////////////////////////
|
101
|
-
class
|
85
|
+
class SimpleSelector : public Selector {
|
102
86
|
public:
|
103
87
|
enum Simple_Type {
|
104
88
|
ID_SEL,
|
105
89
|
TYPE_SEL,
|
106
90
|
CLASS_SEL,
|
107
91
|
PSEUDO_SEL,
|
108
|
-
PARENT_SEL,
|
109
|
-
WRAPPED_SEL,
|
110
92
|
ATTRIBUTE_SEL,
|
111
93
|
PLACEHOLDER_SEL,
|
112
94
|
};
|
113
95
|
public:
|
114
|
-
HASH_CONSTREF(
|
115
|
-
HASH_CONSTREF(
|
96
|
+
HASH_CONSTREF(sass::string, ns)
|
97
|
+
HASH_CONSTREF(sass::string, name)
|
116
98
|
ADD_PROPERTY(Simple_Type, simple_type)
|
117
99
|
HASH_PROPERTY(bool, has_ns)
|
118
100
|
public:
|
119
|
-
|
120
|
-
|
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;
|
121
105
|
size_t hash() const override;
|
122
|
-
bool empty() const;
|
106
|
+
virtual bool empty() const;
|
123
107
|
// namespace compare functions
|
124
|
-
bool is_ns_eq(const
|
108
|
+
bool is_ns_eq(const SimpleSelector& r) const;
|
125
109
|
// namespace query functions
|
126
110
|
bool is_universal_ns() const;
|
127
111
|
bool is_empty_ns() const;
|
@@ -131,437 +115,407 @@ namespace Sass {
|
|
131
115
|
bool is_universal() const;
|
132
116
|
virtual bool has_placeholder();
|
133
117
|
|
134
|
-
virtual ~
|
135
|
-
virtual
|
118
|
+
virtual ~SimpleSelector() = 0;
|
119
|
+
virtual CompoundSelector* unifyWith(CompoundSelector*);
|
136
120
|
|
137
|
-
|
138
|
-
virtual
|
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; }
|
139
130
|
virtual bool is_pseudo_element() const;
|
140
|
-
virtual bool
|
131
|
+
virtual bool has_real_parent_ref() const override;
|
141
132
|
|
142
|
-
bool operator<(const Selector& rhs) const final override;
|
143
133
|
bool operator==(const Selector& rhs) const final override;
|
144
|
-
virtual bool operator<(const Selector_List& rhs) const;
|
145
|
-
virtual bool operator==(const Selector_List& rhs) const;
|
146
|
-
virtual bool operator<(const Complex_Selector& rhs) const;
|
147
|
-
virtual bool operator==(const Complex_Selector& rhs) const;
|
148
|
-
virtual bool operator<(const Compound_Selector& rhs) const;
|
149
|
-
virtual bool operator==(const Compound_Selector& rhs) const;
|
150
|
-
virtual bool operator<(const Simple_Selector& rhs) const;
|
151
|
-
virtual bool operator==(const Simple_Selector& rhs) const;
|
152
|
-
|
153
|
-
ATTACH_VIRTUAL_AST_OPERATIONS(Simple_Selector);
|
154
|
-
ATTACH_CRTP_PERFORM_METHODS();
|
155
134
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
//////////////////////////////////
|
160
|
-
// The Parent Selector Expression.
|
161
|
-
//////////////////////////////////
|
162
|
-
class Parent_Selector final : public Simple_Selector {
|
163
|
-
// a real parent selector is given by the user
|
164
|
-
// others are added implicitly to connect the
|
165
|
-
// selector scopes automatically when rendered
|
166
|
-
// a Parent_Reference is never seen in selectors
|
167
|
-
// and is only used in values (e.g. `prop: #{&};`)
|
168
|
-
ADD_PROPERTY(bool, real)
|
169
|
-
public:
|
170
|
-
Parent_Selector(ParserState pstate, bool r = true);
|
135
|
+
virtual bool operator==(const SelectorList& rhs) const;
|
136
|
+
virtual bool operator==(const ComplexSelector& rhs) const;
|
137
|
+
virtual bool operator==(const CompoundSelector& rhs) const;
|
171
138
|
|
172
|
-
|
173
|
-
|
139
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(SimpleSelector);
|
140
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(SimpleSelector);
|
141
|
+
ATTACH_CRTP_PERFORM_METHODS();
|
174
142
|
|
175
|
-
virtual unsigned long specificity() const override;
|
176
|
-
int unification_order() const override
|
177
|
-
{
|
178
|
-
throw std::runtime_error("unification_order for Parent_Selector is undefined");
|
179
|
-
}
|
180
|
-
std::string type() const override { return "selector"; }
|
181
|
-
static std::string type_name() { return "selector"; }
|
182
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
183
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
184
|
-
bool operator<(const Parent_Selector& rhs) const;
|
185
|
-
bool operator==(const Parent_Selector& rhs) const;
|
186
|
-
ATTACH_AST_OPERATIONS(Parent_Selector)
|
187
|
-
ATTACH_CRTP_PERFORM_METHODS()
|
188
143
|
};
|
189
|
-
|
144
|
+
inline SimpleSelector::~SimpleSelector() { }
|
190
145
|
|
191
146
|
/////////////////////////////////////////////////////////////////////////
|
192
147
|
// Placeholder selectors (e.g., "%foo") for use in extend-only selectors.
|
193
148
|
/////////////////////////////////////////////////////////////////////////
|
194
|
-
class
|
149
|
+
class PlaceholderSelector final : public SimpleSelector {
|
195
150
|
public:
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
{
|
200
|
-
return Constants::UnificationOrder_Placeholder;
|
201
|
-
}
|
202
|
-
virtual ~Placeholder_Selector() {};
|
151
|
+
PlaceholderSelector(SourceSpan pstate, sass::string n);
|
152
|
+
int getSortOrder() const override final { return 0; }
|
153
|
+
bool isInvisible() const override { return true; }
|
203
154
|
virtual unsigned long specificity() const override;
|
204
155
|
virtual bool has_placeholder() override;
|
205
|
-
bool operator
|
206
|
-
|
207
|
-
|
208
|
-
bool operator==(const Placeholder_Selector& rhs) const;
|
209
|
-
ATTACH_AST_OPERATIONS(Placeholder_Selector)
|
156
|
+
bool operator==(const SimpleSelector& rhs) const override;
|
157
|
+
ATTACH_CMP_OPERATIONS(PlaceholderSelector)
|
158
|
+
ATTACH_AST_OPERATIONS(PlaceholderSelector)
|
210
159
|
ATTACH_CRTP_PERFORM_METHODS()
|
211
160
|
};
|
212
161
|
|
213
162
|
/////////////////////////////////////////////////////////////////////
|
214
163
|
// Type selectors (and the universal selector) -- e.g., div, span, *.
|
215
164
|
/////////////////////////////////////////////////////////////////////
|
216
|
-
class
|
165
|
+
class TypeSelector final : public SimpleSelector {
|
217
166
|
public:
|
218
|
-
|
167
|
+
TypeSelector(SourceSpan pstate, sass::string n);
|
168
|
+
int getSortOrder() const override final { return 1; }
|
219
169
|
virtual unsigned long specificity() const override;
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
227
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
228
|
-
bool operator<(const Type_Selector& rhs) const;
|
229
|
-
bool operator==(const Type_Selector& rhs) const;
|
230
|
-
ATTACH_AST_OPERATIONS(Type_Selector)
|
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)
|
231
176
|
ATTACH_CRTP_PERFORM_METHODS()
|
232
177
|
};
|
233
178
|
|
234
179
|
////////////////////////////////////////////////
|
235
180
|
// Class selectors -- i.e., .foo.
|
236
181
|
////////////////////////////////////////////////
|
237
|
-
class
|
182
|
+
class ClassSelector final : public SimpleSelector {
|
238
183
|
public:
|
239
|
-
|
184
|
+
ClassSelector(SourceSpan pstate, sass::string n);
|
185
|
+
int getSortOrder() const override final { return 3; }
|
240
186
|
virtual unsigned long specificity() const override;
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
}
|
245
|
-
Compound_Selector* unify_with(Compound_Selector*) override;
|
246
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
247
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
248
|
-
bool operator<(const Class_Selector& rhs) const;
|
249
|
-
bool operator==(const Class_Selector& rhs) const;
|
250
|
-
ATTACH_AST_OPERATIONS(Class_Selector)
|
187
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
188
|
+
ATTACH_CMP_OPERATIONS(ClassSelector)
|
189
|
+
ATTACH_AST_OPERATIONS(ClassSelector)
|
251
190
|
ATTACH_CRTP_PERFORM_METHODS()
|
252
191
|
};
|
253
192
|
|
254
193
|
////////////////////////////////////////////////
|
255
194
|
// ID selectors -- i.e., #foo.
|
256
195
|
////////////////////////////////////////////////
|
257
|
-
class
|
196
|
+
class IDSelector final : public SimpleSelector {
|
258
197
|
public:
|
259
|
-
|
198
|
+
IDSelector(SourceSpan pstate, sass::string n);
|
199
|
+
int getSortOrder() const override final { return 2; }
|
260
200
|
virtual unsigned long specificity() const override;
|
261
|
-
|
262
|
-
{
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
267
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
268
|
-
bool operator<(const Id_Selector& rhs) const;
|
269
|
-
bool operator==(const Id_Selector& rhs) const;
|
270
|
-
ATTACH_AST_OPERATIONS(Id_Selector)
|
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)
|
271
206
|
ATTACH_CRTP_PERFORM_METHODS()
|
272
207
|
};
|
273
208
|
|
274
209
|
///////////////////////////////////////////////////
|
275
210
|
// Attribute selectors -- e.g., [src*=".jpg"], etc.
|
276
211
|
///////////////////////////////////////////////////
|
277
|
-
class
|
278
|
-
ADD_CONSTREF(
|
212
|
+
class AttributeSelector final : public SimpleSelector {
|
213
|
+
ADD_CONSTREF(sass::string, matcher)
|
279
214
|
// this cannot be changed to obj atm!!!!!!????!!!!!!!
|
280
215
|
ADD_PROPERTY(String_Obj, value) // might be interpolated
|
281
216
|
ADD_PROPERTY(char, modifier);
|
282
217
|
public:
|
283
|
-
|
218
|
+
AttributeSelector(SourceSpan pstate, sass::string n, sass::string m, String_Obj v, char o = 0);
|
219
|
+
int getSortOrder() const override final { return 4; }
|
284
220
|
size_t hash() const override;
|
285
221
|
virtual unsigned long specificity() const override;
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
}
|
290
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
291
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
292
|
-
bool operator<(const Attribute_Selector& rhs) const;
|
293
|
-
bool operator==(const Attribute_Selector& rhs) const;
|
294
|
-
ATTACH_AST_OPERATIONS(Attribute_Selector)
|
222
|
+
bool operator==(const SimpleSelector& rhs) const final override;
|
223
|
+
ATTACH_CMP_OPERATIONS(AttributeSelector)
|
224
|
+
ATTACH_AST_OPERATIONS(AttributeSelector)
|
295
225
|
ATTACH_CRTP_PERFORM_METHODS()
|
296
226
|
};
|
297
227
|
|
298
228
|
//////////////////////////////////////////////////////////////////
|
299
229
|
// Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc.
|
300
230
|
//////////////////////////////////////////////////////////////////
|
301
|
-
/* '::' starts a pseudo-element, ':' a pseudo-class */
|
302
|
-
/* Except :first-line, :first-letter, :before and :after */
|
303
|
-
/* Note that pseudo-elements are restricted to one per selector */
|
304
|
-
/* and occur only in the last simple_selector_sequence. */
|
305
|
-
inline bool is_pseudo_class_element(const std::string& name)
|
306
|
-
{
|
307
|
-
return name == ":before" ||
|
308
|
-
name == ":after" ||
|
309
|
-
name == ":first-line" ||
|
310
|
-
name == ":first-letter";
|
311
|
-
}
|
312
|
-
|
313
231
|
// Pseudo Selector cannot have any namespace?
|
314
|
-
class
|
315
|
-
ADD_PROPERTY(
|
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)
|
316
238
|
public:
|
317
|
-
|
239
|
+
PseudoSelector(SourceSpan pstate, sass::string n, bool element = false);
|
240
|
+
int getSortOrder() const override final { return 5; }
|
318
241
|
virtual bool is_pseudo_element() const override;
|
319
242
|
size_t hash() const override;
|
320
|
-
virtual unsigned long specificity() const override;
|
321
|
-
int unification_order() const override
|
322
|
-
{
|
323
|
-
if (is_pseudo_element())
|
324
|
-
return Constants::UnificationOrder_PseudoElement;
|
325
|
-
return Constants::UnificationOrder_PseudoClass;
|
326
|
-
}
|
327
|
-
bool operator<(const Simple_Selector& rhs) const final override;
|
328
|
-
bool operator==(const Simple_Selector& rhs) const final override;
|
329
|
-
bool operator<(const Pseudo_Selector& rhs) const;
|
330
|
-
bool operator==(const Pseudo_Selector& rhs) const;
|
331
|
-
Compound_Selector* unify_with(Compound_Selector*) override;
|
332
|
-
ATTACH_AST_OPERATIONS(Pseudo_Selector)
|
333
|
-
ATTACH_CRTP_PERFORM_METHODS()
|
334
|
-
};
|
335
243
|
|
336
|
-
|
337
|
-
|
338
|
-
/////////////////////////////////////////////////
|
339
|
-
class Wrapped_Selector final : public Simple_Selector {
|
340
|
-
ADD_PROPERTY(Selector_List_Obj, selector)
|
341
|
-
public:
|
342
|
-
Wrapped_Selector(ParserState pstate, std::string n, Selector_List_Obj sel);
|
343
|
-
using Simple_Selector::is_superselector_of;
|
344
|
-
bool is_superselector_of(const Wrapped_Selector* sub) const;
|
345
|
-
// Selectors inside the negation pseudo-class are counted like any
|
346
|
-
// other, but the negation itself does not count as a pseudo-class.
|
347
|
-
size_t hash() const override;
|
348
|
-
bool has_parent_ref() const override;
|
244
|
+
bool empty() const override;
|
245
|
+
|
349
246
|
bool has_real_parent_ref() const override;
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
bool
|
358
|
-
|
359
|
-
|
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)
|
360
264
|
void cloneChildren() override;
|
361
|
-
ATTACH_AST_OPERATIONS(Wrapped_Selector)
|
362
265
|
ATTACH_CRTP_PERFORM_METHODS()
|
363
266
|
};
|
364
267
|
|
268
|
+
|
365
269
|
////////////////////////////////////////////////////////////////////////////
|
366
|
-
//
|
367
|
-
//
|
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
|
368
274
|
////////////////////////////////////////////////////////////////////////////
|
369
|
-
class
|
370
|
-
|
371
|
-
|
372
|
-
ADD_PROPERTY(bool,
|
373
|
-
ADD_PROPERTY(bool, has_parent_reference);
|
374
|
-
protected:
|
375
|
-
void adjust_after_pushing(Simple_Selector_Obj s) override
|
376
|
-
{
|
377
|
-
// if (s->has_reference()) has_reference(true);
|
378
|
-
// if (s->has_placeholder()) has_placeholder(true);
|
379
|
-
}
|
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)
|
380
279
|
public:
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
bool has_parent_ref() const override;
|
389
|
-
bool has_real_parent_ref() const override;
|
390
|
-
Simple_Selector* base() const;
|
391
|
-
bool is_superselector_of(const Compound_Selector* sub, std::string wrapped = "") const;
|
392
|
-
bool is_superselector_of(const Complex_Selector* sub, std::string wrapped = "") const;
|
393
|
-
bool is_superselector_of(const Selector_List* sub, std::string wrapped = "") const;
|
280
|
+
ComplexSelector(SourceSpan pstate);
|
281
|
+
|
282
|
+
// Returns true if the first components
|
283
|
+
// is a compound selector and fullfills
|
284
|
+
// a few other criteria.
|
285
|
+
bool isInvisible() const;
|
286
|
+
|
394
287
|
size_t hash() const override;
|
288
|
+
void cloneChildren() override;
|
289
|
+
bool has_placeholder() const;
|
290
|
+
bool has_real_parent_ref() const override;
|
291
|
+
|
292
|
+
SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
|
395
293
|
virtual unsigned long specificity() const override;
|
396
|
-
virtual bool has_placeholder();
|
397
|
-
bool is_empty_reference();
|
398
|
-
int unification_order() const override
|
399
|
-
{
|
400
|
-
throw std::runtime_error("unification_order for Compound_Selector is undefined");
|
401
|
-
}
|
402
|
-
bool find ( bool (*f)(AST_Node_Obj) ) override;
|
403
294
|
|
404
|
-
|
295
|
+
SelectorList* unifyWith(ComplexSelector* rhs);
|
296
|
+
|
297
|
+
bool isSuperselectorOf(const ComplexSelector* sub) const;
|
298
|
+
|
299
|
+
SelectorListObj wrapInList();
|
300
|
+
|
301
|
+
size_t maxSpecificity() const override;
|
302
|
+
size_t minSpecificity() const override;
|
303
|
+
|
405
304
|
bool operator==(const Selector& rhs) const override;
|
406
|
-
bool operator
|
407
|
-
bool operator==(const
|
408
|
-
bool operator
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
bool operator<(const Simple_Selector& rhs) const;
|
413
|
-
bool operator==(const Simple_Selector& rhs) const;
|
414
|
-
|
415
|
-
ComplexSelectorSet& sources() { return sources_; }
|
416
|
-
void clearSources() { sources_.clear(); }
|
417
|
-
void mergeSources(ComplexSelectorSet& sources);
|
418
|
-
|
419
|
-
Compound_Selector* minus(Compound_Selector* rhs);
|
420
|
-
void cloneChildren() override;
|
421
|
-
ATTACH_AST_OPERATIONS(Compound_Selector)
|
305
|
+
bool operator==(const SelectorList& rhs) const;
|
306
|
+
bool operator==(const CompoundSelector& rhs) const;
|
307
|
+
bool operator==(const SimpleSelector& rhs) const;
|
308
|
+
|
309
|
+
ATTACH_CMP_OPERATIONS(ComplexSelector)
|
310
|
+
ATTACH_AST_OPERATIONS(ComplexSelector)
|
422
311
|
ATTACH_CRTP_PERFORM_METHODS()
|
423
312
|
};
|
424
313
|
|
425
314
|
////////////////////////////////////////////////////////////////////////////
|
426
|
-
//
|
427
|
-
|
428
|
-
|
315
|
+
// Base class for complex selector components
|
316
|
+
////////////////////////////////////////////////////////////////////////////
|
317
|
+
class SelectorComponent : public Selector {
|
318
|
+
// line break after list separator
|
319
|
+
ADD_PROPERTY(bool, hasPostLineBreak)
|
320
|
+
public:
|
321
|
+
SelectorComponent(SourceSpan pstate, bool postLineBreak = false);
|
322
|
+
size_t hash() const override = 0;
|
323
|
+
void cloneChildren() override;
|
324
|
+
|
325
|
+
|
326
|
+
// By default we consider instances not empty
|
327
|
+
virtual bool empty() const { return false; }
|
328
|
+
|
329
|
+
virtual bool has_placeholder() const = 0;
|
330
|
+
bool has_real_parent_ref() const override = 0;
|
331
|
+
|
332
|
+
ComplexSelector* wrapInComplex();
|
333
|
+
|
334
|
+
size_t maxSpecificity() const override { return 0; }
|
335
|
+
size_t minSpecificity() const override { return 0; }
|
336
|
+
|
337
|
+
virtual bool isCompound() const { return false; };
|
338
|
+
virtual bool isCombinator() const { return false; };
|
339
|
+
|
340
|
+
/* helper function for syntax sugar */
|
341
|
+
virtual CompoundSelector* getCompound() { return NULL; }
|
342
|
+
virtual SelectorCombinator* getCombinator() { return NULL; }
|
343
|
+
virtual const CompoundSelector* getCompound() const { return NULL; }
|
344
|
+
virtual const SelectorCombinator* getCombinator() const { return NULL; }
|
345
|
+
|
346
|
+
virtual unsigned long specificity() const override;
|
347
|
+
bool operator==(const Selector& rhs) const override = 0;
|
348
|
+
ATTACH_VIRTUAL_CMP_OPERATIONS(SelectorComponent);
|
349
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(SelectorComponent);
|
350
|
+
};
|
351
|
+
|
352
|
+
////////////////////////////////////////////////////////////////////////////
|
353
|
+
// A specific combinator between compound selectors
|
429
354
|
////////////////////////////////////////////////////////////////////////////
|
430
|
-
class
|
355
|
+
class SelectorCombinator final : public SelectorComponent {
|
431
356
|
public:
|
432
|
-
|
357
|
+
|
358
|
+
// Enumerate all possible selector combinators. There is some
|
359
|
+
// discrepancy with dart-sass. Opted to name them as in CSS33
|
360
|
+
enum Combinator { CHILD /* > */, GENERAL /* ~ */, ADJACENT /* + */};
|
361
|
+
|
433
362
|
private:
|
363
|
+
|
364
|
+
// Store the type of this combinator
|
434
365
|
HASH_CONSTREF(Combinator, combinator)
|
435
|
-
|
436
|
-
HASH_PROPERTY(Complex_Selector_Obj, tail)
|
437
|
-
HASH_PROPERTY(String_Obj, reference);
|
366
|
+
|
438
367
|
public:
|
439
|
-
bool
|
440
|
-
if (head() && head()->contains_placeholder()) return true;
|
441
|
-
if (tail() && tail()->contains_placeholder()) return true;
|
442
|
-
return false;
|
443
|
-
};
|
444
|
-
Complex_Selector(ParserState pstate,
|
445
|
-
Combinator c = ANCESTOR_OF,
|
446
|
-
Compound_Selector_Obj h = {},
|
447
|
-
Complex_Selector_Obj t = {},
|
448
|
-
String_Obj r = {});
|
368
|
+
SelectorCombinator(SourceSpan pstate, Combinator combinator, bool postLineBreak = false);
|
449
369
|
|
450
|
-
bool
|
370
|
+
bool has_real_parent_ref() const override { return false; }
|
371
|
+
bool has_placeholder() const override { return false; }
|
451
372
|
|
452
|
-
|
453
|
-
|
454
|
-
|
373
|
+
/* helper function for syntax sugar */
|
374
|
+
SelectorCombinator* getCombinator() final override { return this; }
|
375
|
+
const SelectorCombinator* getCombinator() const final override { return this; }
|
455
376
|
|
456
|
-
//
|
457
|
-
bool
|
377
|
+
// Query type of combinator
|
378
|
+
bool isCombinator() const override { return true; };
|
458
379
|
|
459
|
-
|
380
|
+
// Matches the right-hand selector if it's a direct child of the left-
|
381
|
+
// hand selector in the DOM tree. Dart-sass also calls this `child`
|
382
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Child_combinator
|
383
|
+
bool isChildCombinator() const { return combinator_ == CHILD; } // >
|
460
384
|
|
461
|
-
//
|
462
|
-
//
|
463
|
-
|
464
|
-
|
385
|
+
// Matches the right-hand selector if it comes after the left-hand
|
386
|
+
// selector in the DOM tree. Dart-sass class this `followingSibling`
|
387
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_combinator
|
388
|
+
bool isGeneralCombinator() const { return combinator_ == GENERAL; } // ~
|
465
389
|
|
466
|
-
//
|
467
|
-
|
468
|
-
|
390
|
+
// Matches the right-hand selector if it's immediately adjacent to the
|
391
|
+
// left-hand selector in the DOM tree. Dart-sass calls this `nextSibling`
|
392
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
|
393
|
+
bool isAdjacentCombinator() const { return combinator_ == ADJACENT; } // +
|
469
394
|
|
470
|
-
size_t
|
471
|
-
|
472
|
-
bool is_superselector_of(const Compound_Selector* sub, std::string wrapping = "") const;
|
473
|
-
bool is_superselector_of(const Complex_Selector* sub, std::string wrapping = "") const;
|
474
|
-
bool is_superselector_of(const Selector_List* sub, std::string wrapping = "") const;
|
475
|
-
Selector_List* unify_with(Complex_Selector* rhs);
|
476
|
-
Combinator clear_innermost();
|
477
|
-
void append(Complex_Selector_Obj, Backtraces& traces);
|
478
|
-
void set_innermost(Complex_Selector_Obj, Combinator);
|
395
|
+
size_t maxSpecificity() const override { return 0; }
|
396
|
+
size_t minSpecificity() const override { return 0; }
|
479
397
|
|
480
|
-
size_t hash() const override
|
398
|
+
size_t hash() const override {
|
399
|
+
return std::hash<int>()(combinator_);
|
400
|
+
}
|
401
|
+
void cloneChildren() override;
|
481
402
|
virtual unsigned long specificity() const override;
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
403
|
+
bool operator==(const Selector& rhs) const override;
|
404
|
+
bool operator==(const SelectorComponent& rhs) const override;
|
405
|
+
|
406
|
+
ATTACH_CMP_OPERATIONS(SelectorCombinator)
|
407
|
+
ATTACH_AST_OPERATIONS(SelectorCombinator)
|
408
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
409
|
+
};
|
410
|
+
|
411
|
+
////////////////////////////////////////////////////////////////////////////
|
412
|
+
// A compound selector consists of multiple simple selectors
|
413
|
+
////////////////////////////////////////////////////////////////////////////
|
414
|
+
class CompoundSelector final : public SelectorComponent, public Vectorized<SimpleSelectorObj> {
|
415
|
+
ADD_PROPERTY(bool, hasRealParent)
|
416
|
+
ADD_PROPERTY(bool, extended)
|
417
|
+
public:
|
418
|
+
CompoundSelector(SourceSpan pstate, bool postLineBreak = false);
|
419
|
+
|
420
|
+
// Returns true if this compound selector
|
421
|
+
// fullfills various criteria.
|
422
|
+
bool isInvisible() const;
|
423
|
+
|
424
|
+
bool empty() const override {
|
425
|
+
return Vectorized::empty();
|
487
426
|
}
|
488
|
-
bool find ( bool (*f)(AST_Node_Obj) ) override;
|
489
427
|
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
bool
|
498
|
-
bool operator<(const Simple_Selector& rhs) const;
|
499
|
-
bool operator==(const Simple_Selector& rhs) const;
|
500
|
-
|
501
|
-
const ComplexSelectorSet sources();
|
502
|
-
void addSources(ComplexSelectorSet& sources);
|
503
|
-
void clearSources();
|
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;
|
504
436
|
|
505
437
|
void cloneChildren() override;
|
506
|
-
|
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
|
+
|
458
|
+
ATTACH_CMP_OPERATIONS(CompoundSelector)
|
459
|
+
ATTACH_AST_OPERATIONS(CompoundSelector)
|
507
460
|
ATTACH_CRTP_PERFORM_METHODS()
|
508
461
|
};
|
509
462
|
|
510
463
|
///////////////////////////////////
|
511
464
|
// Comma-separated selector groups.
|
512
465
|
///////////////////////////////////
|
513
|
-
class
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
466
|
+
class SelectorList final : public Selector, public Vectorized<ComplexSelectorObj> {
|
467
|
+
private:
|
468
|
+
// maybe we have optional flag
|
469
|
+
// ToDo: should be at ExtendRule?
|
470
|
+
ADD_PROPERTY(bool, is_optional)
|
518
471
|
public:
|
519
|
-
|
520
|
-
|
521
|
-
// remove parent selector references
|
522
|
-
// basically unwraps parsed selectors
|
523
|
-
bool has_parent_ref() const override;
|
524
|
-
bool has_real_parent_ref() const override;
|
525
|
-
void remove_parent_selectors();
|
526
|
-
Selector_List* resolve_parent_refs(SelectorStack& pstack, Backtraces& traces, bool implicit_parent = true);
|
527
|
-
bool is_superselector_of(const Compound_Selector* sub, std::string wrapping = "") const;
|
528
|
-
bool is_superselector_of(const Complex_Selector* sub, std::string wrapping = "") const;
|
529
|
-
bool is_superselector_of(const Selector_List* sub, std::string wrapping = "") const;
|
530
|
-
Selector_List* unify_with(Selector_List*);
|
531
|
-
void populate_extends(Selector_List_Obj, Subset_Map&);
|
532
|
-
Selector_List_Obj eval(Eval& eval);
|
533
|
-
|
472
|
+
SelectorList(SourceSpan pstate, size_t s = 0);
|
473
|
+
sass::string type() const override { return "list"; }
|
534
474
|
size_t hash() const override;
|
475
|
+
|
476
|
+
SelectorList* unifyWith(SelectorList*);
|
477
|
+
|
478
|
+
// Returns true if all complex selectors
|
479
|
+
// can have real parents, meaning every
|
480
|
+
// first component does allow for it
|
481
|
+
bool isInvisible() const;
|
482
|
+
|
483
|
+
void cloneChildren() override;
|
484
|
+
bool has_real_parent_ref() const override;
|
485
|
+
SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
|
535
486
|
virtual unsigned long specificity() const override;
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
bool find ( bool (*f)(AST_Node_Obj) ) override;
|
543
|
-
bool operator<(const Selector& rhs) const override;
|
487
|
+
|
488
|
+
bool isSuperselectorOf(const SelectorList* sub) const;
|
489
|
+
|
490
|
+
size_t maxSpecificity() const override;
|
491
|
+
size_t minSpecificity() const override;
|
492
|
+
|
544
493
|
bool operator==(const Selector& rhs) const override;
|
545
|
-
bool operator
|
546
|
-
bool operator==(const
|
547
|
-
bool operator
|
548
|
-
bool operator==(const Complex_Selector& rhs) const;
|
549
|
-
bool operator<(const Compound_Selector& rhs) const;
|
550
|
-
bool operator==(const Compound_Selector& rhs) const;
|
551
|
-
bool operator<(const Simple_Selector& rhs) const;
|
552
|
-
bool operator==(const Simple_Selector& rhs) const;
|
494
|
+
bool operator==(const ComplexSelector& rhs) const;
|
495
|
+
bool operator==(const CompoundSelector& rhs) const;
|
496
|
+
bool operator==(const SimpleSelector& rhs) const;
|
553
497
|
// Selector Lists can be compared to comma lists
|
554
|
-
bool operator<(const Expression& rhs) const override;
|
555
498
|
bool operator==(const Expression& rhs) const override;
|
556
|
-
|
557
|
-
|
499
|
+
|
500
|
+
ATTACH_CMP_OPERATIONS(SelectorList)
|
501
|
+
ATTACH_AST_OPERATIONS(SelectorList)
|
558
502
|
ATTACH_CRTP_PERFORM_METHODS()
|
559
503
|
};
|
560
504
|
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
505
|
+
////////////////////////////////
|
506
|
+
// The Sass `@extend` directive.
|
507
|
+
////////////////////////////////
|
508
|
+
class ExtendRule final : public Statement {
|
509
|
+
ADD_PROPERTY(bool, isOptional)
|
510
|
+
// This should be a simple selector only!
|
511
|
+
ADD_PROPERTY(SelectorListObj, selector)
|
512
|
+
ADD_PROPERTY(Selector_Schema_Obj, schema)
|
513
|
+
public:
|
514
|
+
ExtendRule(SourceSpan pstate, SelectorListObj s);
|
515
|
+
ExtendRule(SourceSpan pstate, Selector_Schema_Obj s);
|
516
|
+
ATTACH_AST_OPERATIONS(ExtendRule)
|
517
|
+
ATTACH_CRTP_PERFORM_METHODS()
|
518
|
+
};
|
565
519
|
|
566
520
|
}
|
567
521
|
|