sassc 2.3.0 → 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 +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);
|