sassc 2.3.0 → 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 +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- 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 +17 -17
- 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/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- 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} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- 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/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- 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/units.cpp +19 -19
- 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 +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
@@ -13,14 +13,14 @@ namespace Sass {
|
|
13
13
|
// ##########################################################################
|
14
14
|
// ToDo: fine-tune API to avoid unnecessary wrapper allocations
|
15
15
|
// ##########################################################################
|
16
|
-
|
17
|
-
const
|
16
|
+
sass::vector<sass::vector<SelectorComponentObj>> unifyComplex(
|
17
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& complexes)
|
18
18
|
{
|
19
19
|
|
20
20
|
SASS_ASSERT(!complexes.empty(), "Can't unify empty list");
|
21
21
|
if (complexes.size() == 1) return complexes;
|
22
22
|
|
23
|
-
CompoundSelectorObj unifiedBase = SASS_MEMORY_NEW(CompoundSelector,
|
23
|
+
CompoundSelectorObj unifiedBase = SASS_MEMORY_NEW(CompoundSelector, SourceSpan("[phony]"));
|
24
24
|
for (auto complex : complexes) {
|
25
25
|
SelectorComponentObj base = complex.back();
|
26
26
|
if (CompoundSelector * comp = base->getCompound()) {
|
@@ -39,9 +39,9 @@ namespace Sass {
|
|
39
39
|
}
|
40
40
|
}
|
41
41
|
|
42
|
-
|
42
|
+
sass::vector<sass::vector<SelectorComponentObj>> complexesWithoutBases;
|
43
43
|
for (size_t i = 0; i < complexes.size(); i += 1) {
|
44
|
-
|
44
|
+
sass::vector<SelectorComponentObj> sel = complexes[i];
|
45
45
|
sel.pop_back(); // remove last item (base) from the list
|
46
46
|
complexesWithoutBases.push_back(std::move(sel));
|
47
47
|
}
|
@@ -120,13 +120,13 @@ namespace Sass {
|
|
120
120
|
// ##########################################################################
|
121
121
|
// This is implemented in `selector/type.dart` as `PseudoSelector::unify`
|
122
122
|
// ##########################################################################
|
123
|
-
CompoundSelector*
|
123
|
+
CompoundSelector* TypeSelector::unifyWith(CompoundSelector* rhs)
|
124
124
|
{
|
125
125
|
if (rhs->empty()) {
|
126
126
|
rhs->append(this);
|
127
127
|
return rhs;
|
128
128
|
}
|
129
|
-
|
129
|
+
TypeSelector* type = Cast<TypeSelector>(rhs->at(0));
|
130
130
|
if (type != nullptr) {
|
131
131
|
SimpleSelector* unified = unifyWith(type);
|
132
132
|
if (unified == nullptr) {
|
@@ -143,10 +143,10 @@ namespace Sass {
|
|
143
143
|
// ##########################################################################
|
144
144
|
// This is implemented in `selector/id.dart` as `PseudoSelector::unify`
|
145
145
|
// ##########################################################################
|
146
|
-
CompoundSelector*
|
146
|
+
CompoundSelector* IDSelector::unifyWith(CompoundSelector* rhs)
|
147
147
|
{
|
148
148
|
for (const SimpleSelector* sel : rhs->elements()) {
|
149
|
-
if (const
|
149
|
+
if (const IDSelector* id_sel = Cast<IDSelector>(sel)) {
|
150
150
|
if (id_sel->name() != name()) return nullptr;
|
151
151
|
}
|
152
152
|
}
|
@@ -156,7 +156,7 @@ namespace Sass {
|
|
156
156
|
// ##########################################################################
|
157
157
|
// This is implemented in `selector/pseudo.dart` as `PseudoSelector::unify`
|
158
158
|
// ##########################################################################
|
159
|
-
CompoundSelector*
|
159
|
+
CompoundSelector* PseudoSelector::unifyWith(CompoundSelector* compound)
|
160
160
|
{
|
161
161
|
|
162
162
|
if (compound->length() == 1 && compound->first()->is_universal()) {
|
@@ -174,7 +174,7 @@ namespace Sass {
|
|
174
174
|
bool addedThis = false;
|
175
175
|
for (auto simple : compound->elements()) {
|
176
176
|
// Make sure pseudo selectors always come last.
|
177
|
-
if (
|
177
|
+
if (PseudoSelectorObj pseudo = simple->getPseudoSelector()) {
|
178
178
|
if (pseudo->isElement()) {
|
179
179
|
// A given compound selector may only contain one pseudo element. If
|
180
180
|
// [compound] has a different one than [this], unification fails.
|
@@ -197,7 +197,7 @@ namespace Sass {
|
|
197
197
|
return result.detach();
|
198
198
|
|
199
199
|
}
|
200
|
-
// EO
|
200
|
+
// EO PseudoSelector::unifyWith(CompoundSelector*
|
201
201
|
|
202
202
|
// ##########################################################################
|
203
203
|
// This is implemented in `extend/functions.dart` as `unifyUniversalAndElement`
|
@@ -206,7 +206,7 @@ namespace Sass {
|
|
206
206
|
// or [TypeSelector]s. If no such selector can be produced, returns `null`.
|
207
207
|
// Note: libsass handles universal selector directly within the type selector
|
208
208
|
// ##########################################################################
|
209
|
-
SimpleSelector*
|
209
|
+
SimpleSelector* TypeSelector::unifyWith(const SimpleSelector* rhs)
|
210
210
|
{
|
211
211
|
bool rhs_ns = false;
|
212
212
|
if (!(is_ns_eq(*rhs) || rhs->is_universal_ns())) {
|
@@ -229,7 +229,7 @@ namespace Sass {
|
|
229
229
|
if (rhs_name) name(rhs->name());
|
230
230
|
return this;
|
231
231
|
}
|
232
|
-
// EO
|
232
|
+
// EO TypeSelector::unifyWith(const SimpleSelector*)
|
233
233
|
|
234
234
|
// ##########################################################################
|
235
235
|
// Unify two complex selectors. Internally calls `unifyComplex`
|
@@ -238,9 +238,9 @@ namespace Sass {
|
|
238
238
|
SelectorList* ComplexSelector::unifyWith(ComplexSelector* rhs)
|
239
239
|
{
|
240
240
|
SelectorListObj list = SASS_MEMORY_NEW(SelectorList, pstate());
|
241
|
-
|
241
|
+
sass::vector<sass::vector<SelectorComponentObj>> rv =
|
242
242
|
unifyComplex({ elements(), rhs->elements() });
|
243
|
-
for (
|
243
|
+
for (sass::vector<SelectorComponentObj> items : rv) {
|
244
244
|
ComplexSelectorObj sel = SASS_MEMORY_NEW(ComplexSelector, pstate());
|
245
245
|
sel->elements() = std::move(items);
|
246
246
|
list->append(sel);
|
@@ -24,8 +24,8 @@ namespace Sass {
|
|
24
24
|
// ##########################################################################
|
25
25
|
bool isUnique(const SimpleSelector* simple)
|
26
26
|
{
|
27
|
-
if (Cast<
|
28
|
-
if (const
|
27
|
+
if (Cast<IDSelector>(simple)) return true;
|
28
|
+
if (const PseudoSelector * pseudo = Cast<PseudoSelector>(simple)) {
|
29
29
|
if (pseudo->is_pseudo_element()) return true;
|
30
30
|
}
|
31
31
|
return false;
|
@@ -38,11 +38,11 @@ namespace Sass {
|
|
38
38
|
// selectors contain the same unique simple selector, such as an ID.
|
39
39
|
// ##########################################################################
|
40
40
|
bool mustUnify(
|
41
|
-
const
|
42
|
-
const
|
41
|
+
const sass::vector<SelectorComponentObj>& complex1,
|
42
|
+
const sass::vector<SelectorComponentObj>& complex2)
|
43
43
|
{
|
44
44
|
|
45
|
-
|
45
|
+
sass::vector<const SimpleSelector*> uniqueSelectors1;
|
46
46
|
for (const SelectorComponent* component : complex1) {
|
47
47
|
if (const CompoundSelector * compound = component->getCompound()) {
|
48
48
|
for (const SimpleSelector* sel : compound->elements()) {
|
@@ -76,9 +76,9 @@ namespace Sass {
|
|
76
76
|
// Helper function used by `weaveParents`
|
77
77
|
// ##########################################################################
|
78
78
|
bool cmpGroups(
|
79
|
-
const
|
80
|
-
const
|
81
|
-
|
79
|
+
const sass::vector<SelectorComponentObj>& group1,
|
80
|
+
const sass::vector<SelectorComponentObj>& group2,
|
81
|
+
sass::vector<SelectorComponentObj>& select)
|
82
82
|
{
|
83
83
|
|
84
84
|
if (group1.size() == group2.size() && std::equal(group1.begin(), group1.end(), group2.begin(), PtrObjEqualityFn<SelectorComponent>)) {
|
@@ -109,7 +109,7 @@ namespace Sass {
|
|
109
109
|
return false;
|
110
110
|
}
|
111
111
|
|
112
|
-
|
112
|
+
sass::vector<sass::vector<SelectorComponentObj>> unified
|
113
113
|
= unifyComplex({ group1, group2 });
|
114
114
|
if (unified.empty()) return false;
|
115
115
|
if (unified.size() > 1) return false;
|
@@ -131,8 +131,8 @@ namespace Sass {
|
|
131
131
|
// Helper function used by `weaveParents`
|
132
132
|
// ##########################################################################
|
133
133
|
bool cmpChunkForEmptySequence(
|
134
|
-
const
|
135
|
-
const
|
134
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& seq,
|
135
|
+
const sass::vector<SelectorComponentObj>& group)
|
136
136
|
{
|
137
137
|
return seq.empty();
|
138
138
|
}
|
@@ -142,8 +142,8 @@ namespace Sass {
|
|
142
142
|
// Helper function used by `weaveParents`
|
143
143
|
// ##########################################################################
|
144
144
|
bool cmpChunkForParentSuperselector(
|
145
|
-
const
|
146
|
-
const
|
145
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& seq,
|
146
|
+
const sass::vector<SelectorComponentObj>& group)
|
147
147
|
{
|
148
148
|
return seq.empty() || complexIsParentSuperselector(seq.front(), group);
|
149
149
|
}
|
@@ -159,18 +159,18 @@ namespace Sass {
|
|
159
159
|
// (1 2 A B C)]`. The queues would then contain `(D E)` and `(3 4 5)`.
|
160
160
|
// ##########################################################################
|
161
161
|
template <class T>
|
162
|
-
|
163
|
-
|
164
|
-
const T& group, bool(*done)(const
|
162
|
+
sass::vector<sass::vector<T>> getChunks(
|
163
|
+
sass::vector<T>& queue1, sass::vector<T>& queue2,
|
164
|
+
const T& group, bool(*done)(const sass::vector<T>&, const T&)
|
165
165
|
) {
|
166
166
|
|
167
|
-
|
167
|
+
sass::vector<T> chunk1;
|
168
168
|
while (!done(queue1, group)) {
|
169
169
|
chunk1.push_back(queue1.front());
|
170
170
|
queue1.erase(queue1.begin());
|
171
171
|
}
|
172
172
|
|
173
|
-
|
173
|
+
sass::vector<T> chunk2;
|
174
174
|
while (!done(queue2, group)) {
|
175
175
|
chunk2.push_back(queue2.front());
|
176
176
|
queue2.erase(queue2.begin());
|
@@ -180,7 +180,7 @@ namespace Sass {
|
|
180
180
|
else if (chunk1.empty()) return { chunk2 };
|
181
181
|
else if (chunk2.empty()) return { chunk1 };
|
182
182
|
|
183
|
-
|
183
|
+
sass::vector<T> choice1(chunk1), choice2(chunk2);
|
184
184
|
std::move(std::begin(chunk2), std::end(chunk2),
|
185
185
|
std::inserter(choice1, std::end(choice1)));
|
186
186
|
std::move(std::begin(chunk1), std::end(chunk1),
|
@@ -193,7 +193,7 @@ namespace Sass {
|
|
193
193
|
// If the first element of [queue] has a `::root`
|
194
194
|
// selector, removes and returns that element.
|
195
195
|
// ##########################################################################
|
196
|
-
CompoundSelectorObj getFirstIfRoot(
|
196
|
+
CompoundSelectorObj getFirstIfRoot(sass::vector<SelectorComponentObj>& queue) {
|
197
197
|
if (queue.empty()) return {};
|
198
198
|
SelectorComponent* first = queue.front();
|
199
199
|
if (CompoundSelector* sel = Cast<CompoundSelector>(first)) {
|
@@ -210,12 +210,12 @@ namespace Sass {
|
|
210
210
|
// contains two adjacent [ComplexSelector]s. For example,
|
211
211
|
// `(A B > C D + E ~ > G)` is grouped into `[(A) (B > C) (D + E ~ > G)]`.
|
212
212
|
// ##########################################################################
|
213
|
-
|
214
|
-
const
|
213
|
+
sass::vector<sass::vector<SelectorComponentObj>> groupSelectors(
|
214
|
+
const sass::vector<SelectorComponentObj>& components)
|
215
215
|
{
|
216
216
|
bool lastWasCompound = false;
|
217
|
-
|
218
|
-
|
217
|
+
sass::vector<SelectorComponentObj> group;
|
218
|
+
sass::vector<sass::vector<SelectorComponentObj>> groups;
|
219
219
|
for (size_t i = 0; i < components.size(); i += 1) {
|
220
220
|
if (CompoundSelector* compound = components[i]->getCompound()) {
|
221
221
|
if (lastWasCompound) {
|
@@ -244,19 +244,19 @@ namespace Sass {
|
|
244
244
|
// If the combinators can't be merged, returns `null`.
|
245
245
|
// ##########################################################################
|
246
246
|
bool mergeInitialCombinators(
|
247
|
-
|
248
|
-
|
249
|
-
|
247
|
+
sass::vector<SelectorComponentObj>& components1,
|
248
|
+
sass::vector<SelectorComponentObj>& components2,
|
249
|
+
sass::vector<SelectorComponentObj>& result)
|
250
250
|
{
|
251
251
|
|
252
|
-
|
252
|
+
sass::vector<SelectorComponentObj> combinators1;
|
253
253
|
while (!components1.empty() && Cast<SelectorCombinator>(components1.front())) {
|
254
254
|
SelectorCombinatorObj front = Cast<SelectorCombinator>(components1.front());
|
255
255
|
components1.erase(components1.begin());
|
256
256
|
combinators1.push_back(front);
|
257
257
|
}
|
258
258
|
|
259
|
-
|
259
|
+
sass::vector<SelectorComponentObj> combinators2;
|
260
260
|
while (!components2.empty() && Cast<SelectorCombinator>(components2.front())) {
|
261
261
|
SelectorCombinatorObj front = Cast<SelectorCombinator>(components2.front());
|
262
262
|
components2.erase(components2.begin());
|
@@ -265,7 +265,7 @@ namespace Sass {
|
|
265
265
|
|
266
266
|
// If neither sequence of combinators is a subsequence
|
267
267
|
// of the other, they cannot be merged successfully.
|
268
|
-
|
268
|
+
sass::vector<SelectorComponentObj> LCS = lcs<SelectorComponentObj>(combinators1, combinators2);
|
269
269
|
|
270
270
|
if (ListEquality(LCS, combinators1, PtrObjEqualityFn<SelectorComponent>)) {
|
271
271
|
result = combinators2;
|
@@ -288,9 +288,9 @@ namespace Sass {
|
|
288
288
|
// empty list. If the sequences can't be merged, returns `null`.
|
289
289
|
// ##########################################################################
|
290
290
|
bool mergeFinalCombinators(
|
291
|
-
|
292
|
-
|
293
|
-
|
291
|
+
sass::vector<SelectorComponentObj>& components1,
|
292
|
+
sass::vector<SelectorComponentObj>& components2,
|
293
|
+
sass::vector<sass::vector<sass::vector<SelectorComponentObj>>>& result)
|
294
294
|
{
|
295
295
|
|
296
296
|
if (components1.empty() || !Cast<SelectorCombinator>(components1.back())) {
|
@@ -299,14 +299,14 @@ namespace Sass {
|
|
299
299
|
}
|
300
300
|
}
|
301
301
|
|
302
|
-
|
302
|
+
sass::vector<SelectorComponentObj> combinators1;
|
303
303
|
while (!components1.empty() && Cast<SelectorCombinator>(components1.back())) {
|
304
304
|
SelectorCombinatorObj back = Cast<SelectorCombinator>(components1.back());
|
305
305
|
components1.erase(components1.end() - 1);
|
306
306
|
combinators1.push_back(back);
|
307
307
|
}
|
308
308
|
|
309
|
-
|
309
|
+
sass::vector<SelectorComponentObj> combinators2;
|
310
310
|
while (!components2.empty() && Cast<SelectorCombinator>(components2.back())) {
|
311
311
|
SelectorCombinatorObj back = Cast<SelectorCombinator>(components2.back());
|
312
312
|
components2.erase(components2.end() - 1);
|
@@ -356,7 +356,7 @@ namespace Sass {
|
|
356
356
|
result.push_back({ { compound1, combinator1 } });
|
357
357
|
}
|
358
358
|
else {
|
359
|
-
|
359
|
+
sass::vector<sass::vector<SelectorComponentObj>> choices;
|
360
360
|
choices.push_back({ compound1, combinator1, compound2, combinator2 });
|
361
361
|
choices.push_back({ compound2, combinator2, compound1, combinator1 });
|
362
362
|
if (CompoundSelector* unified = compound1->unifyWith(compound2)) {
|
@@ -378,7 +378,7 @@ namespace Sass {
|
|
378
378
|
}
|
379
379
|
else {
|
380
380
|
CompoundSelectorObj unified = compound1->unifyWith(compound2);
|
381
|
-
|
381
|
+
sass::vector<sass::vector<SelectorComponentObj>> items;
|
382
382
|
|
383
383
|
if (!unified.isNull()) {
|
384
384
|
items.push_back({
|
@@ -463,10 +463,10 @@ namespace Sass {
|
|
463
463
|
// exponential output for very little gain. The selector `.D (.A .B)`
|
464
464
|
// is represented as the list `[[.D], [.A, .B]]`.
|
465
465
|
// ##########################################################################
|
466
|
-
|
467
|
-
const
|
466
|
+
sass::vector<sass::vector<SelectorComponentObj>> weave(
|
467
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& complexes) {
|
468
468
|
|
469
|
-
|
469
|
+
sass::vector<sass::vector<SelectorComponentObj>> prefixes;
|
470
470
|
|
471
471
|
prefixes.push_back(complexes.at(0));
|
472
472
|
|
@@ -475,7 +475,7 @@ namespace Sass {
|
|
475
475
|
if (complexes[i].empty()) {
|
476
476
|
continue;
|
477
477
|
}
|
478
|
-
const
|
478
|
+
const sass::vector<SelectorComponentObj>& complex = complexes[i];
|
479
479
|
SelectorComponent* target = complex.back();
|
480
480
|
if (complex.size() == 1) {
|
481
481
|
for (auto& prefix : prefixes) {
|
@@ -484,13 +484,13 @@ namespace Sass {
|
|
484
484
|
continue;
|
485
485
|
}
|
486
486
|
|
487
|
-
|
487
|
+
sass::vector<SelectorComponentObj> parents(complex);
|
488
488
|
|
489
489
|
parents.pop_back();
|
490
490
|
|
491
|
-
|
492
|
-
for (
|
493
|
-
|
491
|
+
sass::vector<sass::vector<SelectorComponentObj>> newPrefixes;
|
492
|
+
for (sass::vector<SelectorComponentObj> prefix : prefixes) {
|
493
|
+
sass::vector<sass::vector<SelectorComponentObj>>
|
494
494
|
parentPrefixes = weaveParents(prefix, parents);
|
495
495
|
if (parentPrefixes.empty()) continue;
|
496
496
|
for (auto& parentPrefix : parentPrefixes) {
|
@@ -519,13 +519,13 @@ namespace Sass {
|
|
519
519
|
// elements matched by `A X` and all elements matched by `B X`. Some `AB_i`
|
520
520
|
// are elided to reduce the size of the output.
|
521
521
|
// ##########################################################################
|
522
|
-
|
523
|
-
|
524
|
-
|
522
|
+
sass::vector<sass::vector<SelectorComponentObj>> weaveParents(
|
523
|
+
sass::vector<SelectorComponentObj> queue1,
|
524
|
+
sass::vector<SelectorComponentObj> queue2)
|
525
525
|
{
|
526
526
|
|
527
|
-
|
528
|
-
|
527
|
+
sass::vector<SelectorComponentObj> leads;
|
528
|
+
sass::vector<sass::vector<sass::vector<SelectorComponentObj>>> trails;
|
529
529
|
if (!mergeInitialCombinators(queue1, queue2, leads)) return {};
|
530
530
|
if (!mergeFinalCombinators(queue1, queue2, trails)) return {};
|
531
531
|
// list comes out in reverse order for performance
|
@@ -550,27 +550,27 @@ namespace Sass {
|
|
550
550
|
}
|
551
551
|
|
552
552
|
// group into sub-lists so no sub-list contains two adjacent ComplexSelectors.
|
553
|
-
|
554
|
-
|
553
|
+
sass::vector<sass::vector<SelectorComponentObj>> groups1 = groupSelectors(queue1);
|
554
|
+
sass::vector<sass::vector<SelectorComponentObj>> groups2 = groupSelectors(queue2);
|
555
555
|
|
556
556
|
// The main array to store our choices that will be permutated
|
557
|
-
|
557
|
+
sass::vector<sass::vector<sass::vector<SelectorComponentObj>>> choices;
|
558
558
|
|
559
559
|
// append initial combinators
|
560
560
|
choices.push_back({ leads });
|
561
561
|
|
562
|
-
|
563
|
-
lcs<
|
562
|
+
sass::vector<sass::vector<SelectorComponentObj>> LCS =
|
563
|
+
lcs<sass::vector<SelectorComponentObj>>(groups1, groups2, cmpGroups);
|
564
564
|
|
565
565
|
for (auto group : LCS) {
|
566
566
|
|
567
567
|
// Create junks from groups1 and groups2
|
568
|
-
|
569
|
-
chunks = getChunks<
|
568
|
+
sass::vector<sass::vector<sass::vector<SelectorComponentObj>>>
|
569
|
+
chunks = getChunks<sass::vector<SelectorComponentObj>>(
|
570
570
|
groups1, groups2, group, cmpChunkForParentSuperselector);
|
571
571
|
|
572
572
|
// Create expanded array by flattening chunks2 inner
|
573
|
-
|
573
|
+
sass::vector<sass::vector<SelectorComponentObj>>
|
574
574
|
expanded = flattenInner(chunks);
|
575
575
|
|
576
576
|
// Prepare data structures
|
@@ -586,8 +586,8 @@ namespace Sass {
|
|
586
586
|
}
|
587
587
|
|
588
588
|
// Create junks from groups1 and groups2
|
589
|
-
|
590
|
-
chunks = getChunks<
|
589
|
+
sass::vector<sass::vector<sass::vector<SelectorComponentObj>>>
|
590
|
+
chunks = getChunks<sass::vector<SelectorComponentObj>>(
|
591
591
|
groups1, groups2, {}, cmpChunkForEmptySequence);
|
592
592
|
|
593
593
|
// Append chunks with inner arrays flattened
|
@@ -599,10 +599,10 @@ namespace Sass {
|
|
599
599
|
|
600
600
|
// move all non empty items to the front, then erase the trailing ones
|
601
601
|
choices.erase(std::remove_if(choices.begin(), choices.end(), checkForEmptyChild
|
602
|
-
<
|
602
|
+
<sass::vector<sass::vector<SelectorComponentObj>>>), choices.end());
|
603
603
|
|
604
604
|
// permutate all possible paths through selectors
|
605
|
-
|
605
|
+
sass::vector<sass::vector<SelectorComponentObj>>
|
606
606
|
results = flattenInner(permutate(choices));
|
607
607
|
|
608
608
|
return results;
|
@@ -11,7 +11,7 @@ namespace Sass {
|
|
11
11
|
/////////////////////////////////////////////////////////////////////////
|
12
12
|
/////////////////////////////////////////////////////////////////////////
|
13
13
|
|
14
|
-
Selector::Selector(
|
14
|
+
Selector::Selector(SourceSpan pstate)
|
15
15
|
: Expression(pstate),
|
16
16
|
hash_(0)
|
17
17
|
{ concrete_type(SELECTOR); }
|
@@ -30,7 +30,7 @@ namespace Sass {
|
|
30
30
|
/////////////////////////////////////////////////////////////////////////
|
31
31
|
/////////////////////////////////////////////////////////////////////////
|
32
32
|
|
33
|
-
Selector_Schema::Selector_Schema(
|
33
|
+
Selector_Schema::Selector_Schema(SourceSpan pstate, String_Obj c)
|
34
34
|
: AST_Node(pstate),
|
35
35
|
contents_(c),
|
36
36
|
connect_parent_(true),
|
@@ -69,12 +69,12 @@ namespace Sass {
|
|
69
69
|
/////////////////////////////////////////////////////////////////////////
|
70
70
|
/////////////////////////////////////////////////////////////////////////
|
71
71
|
|
72
|
-
SimpleSelector::SimpleSelector(
|
72
|
+
SimpleSelector::SimpleSelector(SourceSpan pstate, sass::string n)
|
73
73
|
: Selector(pstate), ns_(""), name_(n), has_ns_(false)
|
74
74
|
{
|
75
75
|
size_t pos = n.find('|');
|
76
76
|
// found some namespace
|
77
|
-
if (pos !=
|
77
|
+
if (pos != sass::string::npos) {
|
78
78
|
has_ns_ = true;
|
79
79
|
ns_ = n.substr(0, pos);
|
80
80
|
name_ = n.substr(pos + 1);
|
@@ -87,7 +87,7 @@ namespace Sass {
|
|
87
87
|
has_ns_(ptr->has_ns_)
|
88
88
|
{ }
|
89
89
|
|
90
|
-
|
90
|
+
sass::string SimpleSelector::ns_name() const
|
91
91
|
{
|
92
92
|
if (!has_ns_) return name_;
|
93
93
|
else return ns_ + "|" + name_;
|
@@ -174,31 +174,31 @@ namespace Sass {
|
|
174
174
|
/////////////////////////////////////////////////////////////////////////
|
175
175
|
/////////////////////////////////////////////////////////////////////////
|
176
176
|
|
177
|
-
|
177
|
+
PlaceholderSelector::PlaceholderSelector(SourceSpan pstate, sass::string n)
|
178
178
|
: SimpleSelector(pstate, n)
|
179
179
|
{ simple_type(PLACEHOLDER_SEL); }
|
180
|
-
|
180
|
+
PlaceholderSelector::PlaceholderSelector(const PlaceholderSelector* ptr)
|
181
181
|
: SimpleSelector(ptr)
|
182
182
|
{ simple_type(PLACEHOLDER_SEL); }
|
183
|
-
unsigned long
|
183
|
+
unsigned long PlaceholderSelector::specificity() const
|
184
184
|
{
|
185
185
|
return Constants::Specificity_Base;
|
186
186
|
}
|
187
|
-
bool
|
187
|
+
bool PlaceholderSelector::has_placeholder() {
|
188
188
|
return true;
|
189
189
|
}
|
190
190
|
|
191
191
|
/////////////////////////////////////////////////////////////////////////
|
192
192
|
/////////////////////////////////////////////////////////////////////////
|
193
193
|
|
194
|
-
|
194
|
+
TypeSelector::TypeSelector(SourceSpan pstate, sass::string n)
|
195
195
|
: SimpleSelector(pstate, n)
|
196
196
|
{ simple_type(TYPE_SEL); }
|
197
|
-
|
197
|
+
TypeSelector::TypeSelector(const TypeSelector* ptr)
|
198
198
|
: SimpleSelector(ptr)
|
199
199
|
{ simple_type(TYPE_SEL); }
|
200
200
|
|
201
|
-
unsigned long
|
201
|
+
unsigned long TypeSelector::specificity() const
|
202
202
|
{
|
203
203
|
if (name() == "*") return 0;
|
204
204
|
else return Constants::Specificity_Element;
|
@@ -207,14 +207,14 @@ namespace Sass {
|
|
207
207
|
/////////////////////////////////////////////////////////////////////////
|
208
208
|
/////////////////////////////////////////////////////////////////////////
|
209
209
|
|
210
|
-
|
210
|
+
ClassSelector::ClassSelector(SourceSpan pstate, sass::string n)
|
211
211
|
: SimpleSelector(pstate, n)
|
212
212
|
{ simple_type(CLASS_SEL); }
|
213
|
-
|
213
|
+
ClassSelector::ClassSelector(const ClassSelector* ptr)
|
214
214
|
: SimpleSelector(ptr)
|
215
215
|
{ simple_type(CLASS_SEL); }
|
216
216
|
|
217
|
-
unsigned long
|
217
|
+
unsigned long ClassSelector::specificity() const
|
218
218
|
{
|
219
219
|
return Constants::Specificity_Class;
|
220
220
|
}
|
@@ -222,14 +222,14 @@ namespace Sass {
|
|
222
222
|
/////////////////////////////////////////////////////////////////////////
|
223
223
|
/////////////////////////////////////////////////////////////////////////
|
224
224
|
|
225
|
-
|
225
|
+
IDSelector::IDSelector(SourceSpan pstate, sass::string n)
|
226
226
|
: SimpleSelector(pstate, n)
|
227
227
|
{ simple_type(ID_SEL); }
|
228
|
-
|
228
|
+
IDSelector::IDSelector(const IDSelector* ptr)
|
229
229
|
: SimpleSelector(ptr)
|
230
230
|
{ simple_type(ID_SEL); }
|
231
231
|
|
232
|
-
unsigned long
|
232
|
+
unsigned long IDSelector::specificity() const
|
233
233
|
{
|
234
234
|
return Constants::Specificity_ID;
|
235
235
|
}
|
@@ -237,27 +237,27 @@ namespace Sass {
|
|
237
237
|
/////////////////////////////////////////////////////////////////////////
|
238
238
|
/////////////////////////////////////////////////////////////////////////
|
239
239
|
|
240
|
-
|
240
|
+
AttributeSelector::AttributeSelector(SourceSpan pstate, sass::string n, sass::string m, String_Obj v, char o)
|
241
241
|
: SimpleSelector(pstate, n), matcher_(m), value_(v), modifier_(o)
|
242
242
|
{ simple_type(ATTRIBUTE_SEL); }
|
243
|
-
|
243
|
+
AttributeSelector::AttributeSelector(const AttributeSelector* ptr)
|
244
244
|
: SimpleSelector(ptr),
|
245
245
|
matcher_(ptr->matcher_),
|
246
246
|
value_(ptr->value_),
|
247
247
|
modifier_(ptr->modifier_)
|
248
248
|
{ simple_type(ATTRIBUTE_SEL); }
|
249
249
|
|
250
|
-
size_t
|
250
|
+
size_t AttributeSelector::hash() const
|
251
251
|
{
|
252
252
|
if (hash_ == 0) {
|
253
253
|
hash_combine(hash_, SimpleSelector::hash());
|
254
|
-
hash_combine(hash_, std::hash<
|
254
|
+
hash_combine(hash_, std::hash<sass::string>()(matcher()));
|
255
255
|
if (value_) hash_combine(hash_, value_->hash());
|
256
256
|
}
|
257
257
|
return hash_;
|
258
258
|
}
|
259
259
|
|
260
|
-
unsigned long
|
260
|
+
unsigned long AttributeSelector::specificity() const
|
261
261
|
{
|
262
262
|
return Constants::Specificity_Attr;
|
263
263
|
}
|
@@ -265,7 +265,7 @@ namespace Sass {
|
|
265
265
|
/////////////////////////////////////////////////////////////////////////
|
266
266
|
/////////////////////////////////////////////////////////////////////////
|
267
267
|
|
268
|
-
|
268
|
+
PseudoSelector::PseudoSelector(SourceSpan pstate, sass::string name, bool element)
|
269
269
|
: SimpleSelector(pstate, name),
|
270
270
|
normalized_(Util::unvendor(name)),
|
271
271
|
argument_({}),
|
@@ -273,7 +273,7 @@ namespace Sass {
|
|
273
273
|
isSyntacticClass_(!element),
|
274
274
|
isClass_(!element && !isFakePseudoElement(normalized_))
|
275
275
|
{ simple_type(PSEUDO_SEL); }
|
276
|
-
|
276
|
+
PseudoSelector::PseudoSelector(const PseudoSelector* ptr)
|
277
277
|
: SimpleSelector(ptr),
|
278
278
|
normalized_(ptr->normalized()),
|
279
279
|
argument_(ptr->argument()),
|
@@ -290,12 +290,12 @@ namespace Sass {
|
|
290
290
|
// in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and
|
291
291
|
// :after). This compatibility is not allowed for the new pseudo-elements
|
292
292
|
// introduced in this specification.
|
293
|
-
bool
|
293
|
+
bool PseudoSelector::is_pseudo_element() const
|
294
294
|
{
|
295
295
|
return isElement();
|
296
296
|
}
|
297
297
|
|
298
|
-
size_t
|
298
|
+
size_t PseudoSelector::hash() const
|
299
299
|
{
|
300
300
|
if (hash_ == 0) {
|
301
301
|
hash_combine(hash_, SimpleSelector::hash());
|
@@ -305,34 +305,34 @@ namespace Sass {
|
|
305
305
|
return hash_;
|
306
306
|
}
|
307
307
|
|
308
|
-
unsigned long
|
308
|
+
unsigned long PseudoSelector::specificity() const
|
309
309
|
{
|
310
310
|
if (is_pseudo_element())
|
311
311
|
return Constants::Specificity_Element;
|
312
312
|
return Constants::Specificity_Pseudo;
|
313
313
|
}
|
314
314
|
|
315
|
-
|
315
|
+
PseudoSelectorObj PseudoSelector::withSelector(SelectorListObj selector)
|
316
316
|
{
|
317
|
-
|
317
|
+
PseudoSelectorObj pseudo = SASS_MEMORY_COPY(this);
|
318
318
|
pseudo->selector(selector);
|
319
319
|
return pseudo;
|
320
320
|
}
|
321
321
|
|
322
|
-
bool
|
322
|
+
bool PseudoSelector::empty() const
|
323
323
|
{
|
324
324
|
// Only considered empty if selector is
|
325
325
|
// available but has no items in it.
|
326
326
|
return selector() && selector()->empty();
|
327
327
|
}
|
328
328
|
|
329
|
-
void
|
329
|
+
void PseudoSelector::cloneChildren()
|
330
330
|
{
|
331
331
|
if (selector().isNull()) selector({});
|
332
332
|
else selector(SASS_MEMORY_CLONE(selector()));
|
333
333
|
}
|
334
334
|
|
335
|
-
bool
|
335
|
+
bool PseudoSelector::has_real_parent_ref() const {
|
336
336
|
if (!selector()) return false;
|
337
337
|
return selector()->has_real_parent_ref();
|
338
338
|
}
|
@@ -340,7 +340,7 @@ namespace Sass {
|
|
340
340
|
/////////////////////////////////////////////////////////////////////////
|
341
341
|
/////////////////////////////////////////////////////////////////////////
|
342
342
|
|
343
|
-
SelectorList::SelectorList(
|
343
|
+
SelectorList::SelectorList(SourceSpan pstate, size_t s)
|
344
344
|
: Selector(pstate),
|
345
345
|
Vectorized<ComplexSelectorObj>(s),
|
346
346
|
is_optional_(false)
|
@@ -391,7 +391,7 @@ namespace Sass {
|
|
391
391
|
/////////////////////////////////////////////////////////////////////////
|
392
392
|
/////////////////////////////////////////////////////////////////////////
|
393
393
|
|
394
|
-
ComplexSelector::ComplexSelector(
|
394
|
+
ComplexSelector::ComplexSelector(SourceSpan pstate)
|
395
395
|
: Selector(pstate),
|
396
396
|
Vectorized<SelectorComponentObj>(),
|
397
397
|
chroots_(false),
|
@@ -469,7 +469,7 @@ namespace Sass {
|
|
469
469
|
/////////////////////////////////////////////////////////////////////////
|
470
470
|
/////////////////////////////////////////////////////////////////////////
|
471
471
|
|
472
|
-
SelectorComponent::SelectorComponent(
|
472
|
+
SelectorComponent::SelectorComponent(SourceSpan pstate, bool postLineBreak)
|
473
473
|
: Selector(pstate),
|
474
474
|
hasPostLineBreak_(postLineBreak)
|
475
475
|
{
|
@@ -500,7 +500,7 @@ namespace Sass {
|
|
500
500
|
/////////////////////////////////////////////////////////////////////////
|
501
501
|
/////////////////////////////////////////////////////////////////////////
|
502
502
|
|
503
|
-
SelectorCombinator::SelectorCombinator(
|
503
|
+
SelectorCombinator::SelectorCombinator(SourceSpan pstate, SelectorCombinator::Combinator combinator, bool postLineBreak)
|
504
504
|
: SelectorComponent(pstate, postLineBreak),
|
505
505
|
combinator_(combinator)
|
506
506
|
{
|
@@ -522,7 +522,7 @@ namespace Sass {
|
|
522
522
|
/////////////////////////////////////////////////////////////////////////
|
523
523
|
/////////////////////////////////////////////////////////////////////////
|
524
524
|
|
525
|
-
CompoundSelector::CompoundSelector(
|
525
|
+
CompoundSelector::CompoundSelector(SourceSpan pstate, bool postLineBreak)
|
526
526
|
: SelectorComponent(pstate, postLineBreak),
|
527
527
|
Vectorized<SimpleSelectorObj>(),
|
528
528
|
hasRealParent_(false),
|
@@ -549,7 +549,7 @@ namespace Sass {
|
|
549
549
|
{
|
550
550
|
if (hasRealParent()) return true;
|
551
551
|
// ToDo: dart sass has another check?
|
552
|
-
// if (Cast<
|
552
|
+
// if (Cast<TypeSelector>(front)) {
|
553
553
|
// if (front->ns() != "") return false;
|
554
554
|
// }
|
555
555
|
for (const SimpleSelector* s : elements()) {
|
@@ -590,7 +590,7 @@ namespace Sass {
|
|
590
590
|
return true;
|
591
591
|
}
|
592
592
|
|
593
|
-
bool CompoundSelector::isSuperselectorOf(const CompoundSelector* sub,
|
593
|
+
bool CompoundSelector::isSuperselectorOf(const CompoundSelector* sub, sass::string wrapped) const
|
594
594
|
{
|
595
595
|
CompoundSelector* rhs2 = const_cast<CompoundSelector*>(sub);
|
596
596
|
CompoundSelector* lhs2 = const_cast<CompoundSelector*>(this);
|
@@ -600,15 +600,15 @@ namespace Sass {
|
|
600
600
|
/////////////////////////////////////////////////////////////////////////
|
601
601
|
/////////////////////////////////////////////////////////////////////////
|
602
602
|
|
603
|
-
MediaRule::MediaRule(
|
604
|
-
|
603
|
+
MediaRule::MediaRule(SourceSpan pstate, Block_Obj block) :
|
604
|
+
ParentStatement(pstate, block),
|
605
605
|
schema_({})
|
606
606
|
{
|
607
607
|
statement_type(MEDIA);
|
608
608
|
}
|
609
609
|
|
610
610
|
MediaRule::MediaRule(const MediaRule* ptr) :
|
611
|
-
|
611
|
+
ParentStatement(ptr),
|
612
612
|
schema_(ptr->schema_)
|
613
613
|
{
|
614
614
|
statement_type(MEDIA);
|
@@ -617,21 +617,21 @@ namespace Sass {
|
|
617
617
|
/////////////////////////////////////////////////////////////////////////
|
618
618
|
/////////////////////////////////////////////////////////////////////////
|
619
619
|
|
620
|
-
CssMediaRule::CssMediaRule(
|
621
|
-
|
620
|
+
CssMediaRule::CssMediaRule(SourceSpan pstate, Block_Obj block) :
|
621
|
+
ParentStatement(pstate, block),
|
622
622
|
Vectorized()
|
623
623
|
{
|
624
624
|
statement_type(MEDIA);
|
625
625
|
}
|
626
626
|
|
627
627
|
CssMediaRule::CssMediaRule(const CssMediaRule* ptr) :
|
628
|
-
|
628
|
+
ParentStatement(ptr),
|
629
629
|
Vectorized(*ptr)
|
630
630
|
{
|
631
631
|
statement_type(MEDIA);
|
632
632
|
}
|
633
633
|
|
634
|
-
CssMediaQuery::CssMediaQuery(
|
634
|
+
CssMediaQuery::CssMediaQuery(SourceSpan pstate) :
|
635
635
|
AST_Node(pstate),
|
636
636
|
modifier_(""),
|
637
637
|
type_(""),
|
@@ -653,26 +653,26 @@ namespace Sass {
|
|
653
653
|
CssMediaQuery_Obj CssMediaQuery::merge(CssMediaQuery_Obj& other)
|
654
654
|
{
|
655
655
|
|
656
|
-
|
656
|
+
sass::string ourType = this->type();
|
657
657
|
Util::ascii_str_tolower(&ourType);
|
658
658
|
|
659
|
-
|
659
|
+
sass::string theirType = other->type();
|
660
660
|
Util::ascii_str_tolower(&theirType);
|
661
661
|
|
662
|
-
|
662
|
+
sass::string ourModifier = this->modifier();
|
663
663
|
Util::ascii_str_tolower(&ourModifier);
|
664
664
|
|
665
|
-
|
665
|
+
sass::string theirModifier = other->modifier();
|
666
666
|
Util::ascii_str_tolower(&theirModifier);
|
667
667
|
|
668
|
-
|
669
|
-
|
670
|
-
|
668
|
+
sass::string type;
|
669
|
+
sass::string modifier;
|
670
|
+
sass::vector<sass::string> features;
|
671
671
|
|
672
672
|
if (ourType.empty() && theirType.empty()) {
|
673
673
|
CssMediaQuery_Obj query = SASS_MEMORY_NEW(CssMediaQuery, pstate());
|
674
|
-
|
675
|
-
|
674
|
+
sass::vector<sass::string> f1(this->features());
|
675
|
+
sass::vector<sass::string> f2(other->features());
|
676
676
|
features.insert(features.end(), f1.begin(), f1.end());
|
677
677
|
features.insert(features.end(), f2.begin(), f2.end());
|
678
678
|
query->features(features);
|
@@ -681,9 +681,9 @@ namespace Sass {
|
|
681
681
|
|
682
682
|
if ((ourModifier == "not") != (theirModifier == "not")) {
|
683
683
|
if (ourType == theirType) {
|
684
|
-
|
684
|
+
sass::vector<sass::string> negativeFeatures =
|
685
685
|
ourModifier == "not" ? this->features() : other->features();
|
686
|
-
|
686
|
+
sass::vector<sass::string> positiveFeatures =
|
687
687
|
ourModifier == "not" ? other->features() : this->features();
|
688
688
|
|
689
689
|
// If the negative features are a subset of the positive features, the
|
@@ -747,16 +747,16 @@ namespace Sass {
|
|
747
747
|
// Omit the type if either input query did, since that indicates that they
|
748
748
|
// aren't targeting a browser that requires "all and".
|
749
749
|
type = (other->matchesAllTypes() && ourType.empty()) ? "" : theirType;
|
750
|
-
|
751
|
-
|
750
|
+
sass::vector<sass::string> f1(this->features());
|
751
|
+
sass::vector<sass::string> f2(other->features());
|
752
752
|
features.insert(features.end(), f1.begin(), f1.end());
|
753
753
|
features.insert(features.end(), f2.begin(), f2.end());
|
754
754
|
}
|
755
755
|
else if (other->matchesAllTypes()) {
|
756
756
|
modifier = ourModifier;
|
757
757
|
type = ourType;
|
758
|
-
|
759
|
-
|
758
|
+
sass::vector<sass::string> f1(this->features());
|
759
|
+
sass::vector<sass::string> f2(other->features());
|
760
760
|
features.insert(features.end(), f1.begin(), f1.end());
|
761
761
|
features.insert(features.end(), f2.begin(), f2.end());
|
762
762
|
}
|
@@ -766,8 +766,8 @@ namespace Sass {
|
|
766
766
|
else {
|
767
767
|
modifier = ourModifier.empty() ? theirModifier : ourModifier;
|
768
768
|
type = ourType;
|
769
|
-
|
770
|
-
|
769
|
+
sass::vector<sass::string> f1(this->features());
|
770
|
+
sass::vector<sass::string> f2(other->features());
|
771
771
|
features.insert(features.end(), f1.begin(), f1.end());
|
772
772
|
features.insert(features.end(), f2.begin(), f2.end());
|
773
773
|
}
|
@@ -850,15 +850,15 @@ namespace Sass {
|
|
850
850
|
// ToDo: this might be done easier with new selector format
|
851
851
|
/////////////////////////////////////////////////////////////////////////
|
852
852
|
|
853
|
-
|
853
|
+
sass::vector<ComplexSelectorObj>
|
854
854
|
CompoundSelector::resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent)
|
855
855
|
{
|
856
856
|
|
857
857
|
auto parent = pstack.back();
|
858
|
-
|
858
|
+
sass::vector<ComplexSelectorObj> rv;
|
859
859
|
|
860
860
|
for (SimpleSelectorObj simple : elements()) {
|
861
|
-
if (
|
861
|
+
if (PseudoSelector * pseudo = Cast<PseudoSelector>(simple)) {
|
862
862
|
if (SelectorList* sel = Cast<SelectorList>(pseudo->selector())) {
|
863
863
|
if (parent) {
|
864
864
|
pseudo->selector(sel->resolve_parent_refs(
|
@@ -887,7 +887,7 @@ namespace Sass {
|
|
887
887
|
SimpleSelectorObj back = tail->last();
|
888
888
|
SimpleSelectorObj front = first();
|
889
889
|
auto simple_back = Cast<SimpleSelector>(back);
|
890
|
-
auto simple_front = Cast<
|
890
|
+
auto simple_front = Cast<TypeSelector>(front);
|
891
891
|
if (simple_front && simple_back) {
|
892
892
|
simple_back = SASS_MEMORY_COPY(simple_back);
|
893
893
|
auto name = simple_back->name();
|
@@ -940,11 +940,21 @@ namespace Sass {
|
|
940
940
|
|
941
941
|
}
|
942
942
|
|
943
|
-
|
943
|
+
bool cmpSimpleSelectors(SimpleSelector* a, SimpleSelector* b)
|
944
|
+
{
|
945
|
+
return (a->getSortOrder() < b->getSortOrder());
|
946
|
+
}
|
947
|
+
|
948
|
+
void CompoundSelector::sortChildren()
|
949
|
+
{
|
950
|
+
std::sort(begin(), end(), cmpSimpleSelectors);
|
951
|
+
}
|
952
|
+
|
953
|
+
/* better return sass::vector? only - is empty container anyway? */
|
944
954
|
SelectorList* ComplexSelector::resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent)
|
945
955
|
{
|
946
956
|
|
947
|
-
|
957
|
+
sass::vector<sass::vector<ComplexSelectorObj>> vars;
|
948
958
|
|
949
959
|
auto parent = pstack.back();
|
950
960
|
|
@@ -977,7 +987,7 @@ namespace Sass {
|
|
977
987
|
}
|
978
988
|
|
979
989
|
// Need complex selectors to preserve linefeeds
|
980
|
-
|
990
|
+
sass::vector<sass::vector<ComplexSelectorObj>> res = permutateAlt(vars);
|
981
991
|
|
982
992
|
// std::reverse(std::begin(res), std::end(res));
|
983
993
|
|
@@ -1019,12 +1029,12 @@ namespace Sass {
|
|
1019
1029
|
/////////////////////////////////////////////////////////////////////////
|
1020
1030
|
|
1021
1031
|
IMPLEMENT_AST_OPERATORS(Selector_Schema);
|
1022
|
-
IMPLEMENT_AST_OPERATORS(
|
1023
|
-
IMPLEMENT_AST_OPERATORS(
|
1024
|
-
IMPLEMENT_AST_OPERATORS(
|
1025
|
-
IMPLEMENT_AST_OPERATORS(
|
1026
|
-
IMPLEMENT_AST_OPERATORS(
|
1027
|
-
IMPLEMENT_AST_OPERATORS(
|
1032
|
+
IMPLEMENT_AST_OPERATORS(PlaceholderSelector);
|
1033
|
+
IMPLEMENT_AST_OPERATORS(AttributeSelector);
|
1034
|
+
IMPLEMENT_AST_OPERATORS(TypeSelector);
|
1035
|
+
IMPLEMENT_AST_OPERATORS(ClassSelector);
|
1036
|
+
IMPLEMENT_AST_OPERATORS(IDSelector);
|
1037
|
+
IMPLEMENT_AST_OPERATORS(PseudoSelector);
|
1028
1038
|
IMPLEMENT_AST_OPERATORS(SelectorCombinator);
|
1029
1039
|
IMPLEMENT_AST_OPERATORS(CompoundSelector);
|
1030
1040
|
IMPLEMENT_AST_OPERATORS(ComplexSelector);
|