sassc4 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +97 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +51 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/contrib/plugin.cpp +60 -0
- data/ext/libsass/include/sass/base.h +97 -0
- data/ext/libsass/include/sass/context.h +174 -0
- data/ext/libsass/include/sass/functions.h +139 -0
- data/ext/libsass/include/sass/values.h +145 -0
- data/ext/libsass/include/sass/version.h +12 -0
- data/ext/libsass/include/sass.h +15 -0
- data/ext/libsass/include/sass2scss.h +120 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +953 -0
- data/ext/libsass/src/ast.hpp +1064 -0
- data/ext/libsass/src/ast2c.cpp +80 -0
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +140 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
- data/ext/libsass/src/ast_helpers.hpp +316 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1070 -0
- data/ext/libsass/src/ast_selectors.hpp +523 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/b64/cencode.h +32 -0
- data/ext/libsass/src/b64/encode.h +79 -0
- data/ext/libsass/src/backtrace.cpp +50 -0
- data/ext/libsass/src/backtrace.hpp +29 -0
- data/ext/libsass/src/base64vlq.cpp +47 -0
- data/ext/libsass/src/base64vlq.hpp +30 -0
- data/ext/libsass/src/bind.cpp +312 -0
- data/ext/libsass/src/bind.hpp +15 -0
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/c99func.c +54 -0
- data/ext/libsass/src/cencode.c +106 -0
- data/ext/libsass/src/check_nesting.cpp +393 -0
- data/ext/libsass/src/check_nesting.hpp +70 -0
- data/ext/libsass/src/color_maps.cpp +652 -0
- data/ext/libsass/src/color_maps.hpp +323 -0
- data/ext/libsass/src/color_spaces.cpp +241 -0
- data/ext/libsass/src/color_spaces.hpp +227 -0
- data/ext/libsass/src/constants.cpp +199 -0
- data/ext/libsass/src/constants.hpp +200 -0
- data/ext/libsass/src/context.cpp +870 -0
- data/ext/libsass/src/context.hpp +140 -0
- data/ext/libsass/src/cssize.cpp +521 -0
- data/ext/libsass/src/cssize.hpp +71 -0
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debug.hpp +43 -0
- data/ext/libsass/src/debugger.hpp +964 -0
- data/ext/libsass/src/emitter.cpp +297 -0
- data/ext/libsass/src/emitter.hpp +101 -0
- data/ext/libsass/src/environment.cpp +260 -0
- data/ext/libsass/src/environment.hpp +124 -0
- data/ext/libsass/src/error_handling.cpp +239 -0
- data/ext/libsass/src/error_handling.hpp +248 -0
- data/ext/libsass/src/eval.cpp +1543 -0
- data/ext/libsass/src/eval.hpp +110 -0
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +875 -0
- data/ext/libsass/src/expand.hpp +98 -0
- data/ext/libsass/src/extender.cpp +1226 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +531 -0
- data/ext/libsass/src/file.hpp +124 -0
- data/ext/libsass/src/fn_colors.cpp +836 -0
- data/ext/libsass/src/fn_colors.hpp +99 -0
- data/ext/libsass/src/fn_lists.cpp +285 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +248 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +246 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +159 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +1126 -0
- data/ext/libsass/src/inspect.hpp +101 -0
- data/ext/libsass/src/json.cpp +1436 -0
- data/ext/libsass/src/json.hpp +117 -0
- data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
- data/ext/libsass/src/lexer.cpp +122 -0
- data/ext/libsass/src/lexer.hpp +304 -0
- data/ext/libsass/src/listize.cpp +70 -0
- data/ext/libsass/src/listize.hpp +37 -0
- data/ext/libsass/src/mapping.hpp +19 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +223 -0
- data/ext/libsass/src/operators.cpp +267 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +320 -0
- data/ext/libsass/src/output.hpp +47 -0
- data/ext/libsass/src/parser.cpp +3059 -0
- data/ext/libsass/src/parser.hpp +395 -0
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +188 -0
- data/ext/libsass/src/plugins.hpp +57 -0
- data/ext/libsass/src/position.cpp +163 -0
- data/ext/libsass/src/position.hpp +147 -0
- data/ext/libsass/src/prelexer.cpp +1780 -0
- data/ext/libsass/src/prelexer.hpp +484 -0
- data/ext/libsass/src/remove_placeholders.cpp +86 -0
- data/ext/libsass/src/remove_placeholders.hpp +37 -0
- data/ext/libsass/src/sass.cpp +156 -0
- data/ext/libsass/src/sass.hpp +147 -0
- data/ext/libsass/src/sass2scss.cpp +895 -0
- data/ext/libsass/src/sass_context.cpp +742 -0
- data/ext/libsass/src/sass_context.hpp +129 -0
- data/ext/libsass/src/sass_functions.cpp +210 -0
- data/ext/libsass/src/sass_functions.hpp +50 -0
- data/ext/libsass/src/sass_values.cpp +362 -0
- data/ext/libsass/src/sass_values.hpp +82 -0
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +202 -0
- data/ext/libsass/src/source_map.hpp +65 -0
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +114 -0
- data/ext/libsass/src/to_value.hpp +46 -0
- data/ext/libsass/src/units.cpp +507 -0
- data/ext/libsass/src/units.hpp +110 -0
- data/ext/libsass/src/utf8/checked.h +336 -0
- data/ext/libsass/src/utf8/core.h +332 -0
- data/ext/libsass/src/utf8/unchecked.h +235 -0
- data/ext/libsass/src/utf8.h +34 -0
- data/ext/libsass/src/utf8_string.cpp +104 -0
- data/ext/libsass/src/utf8_string.hpp +38 -0
- data/ext/libsass/src/util.cpp +723 -0
- data/ext/libsass/src/util.hpp +105 -0
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +140 -0
- data/ext/libsass/src/values.hpp +12 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +141 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +73 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +159 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/native.rb +64 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script.rb +17 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/version.rb +5 -0
- data/lib/sassc.rb +57 -0
- data/sassc.gemspec +69 -0
- data/test/css_color_level4_test.rb +168 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +340 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +396 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include "ast.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
// ##########################################################################
|
|
10
|
+
// Returns the contents of a [SelectorList] that matches only
|
|
11
|
+
// elements that are matched by both [complex1] and [complex2].
|
|
12
|
+
// If no such list can be produced, returns `null`.
|
|
13
|
+
// ##########################################################################
|
|
14
|
+
// ToDo: fine-tune API to avoid unnecessary wrapper allocations
|
|
15
|
+
// ##########################################################################
|
|
16
|
+
sass::vector<sass::vector<SelectorComponentObj>> unifyComplex(
|
|
17
|
+
const sass::vector<sass::vector<SelectorComponentObj>>& complexes)
|
|
18
|
+
{
|
|
19
|
+
|
|
20
|
+
SASS_ASSERT(!complexes.empty(), "Can't unify empty list");
|
|
21
|
+
if (complexes.size() == 1) return complexes;
|
|
22
|
+
|
|
23
|
+
CompoundSelectorObj unifiedBase = SASS_MEMORY_NEW(CompoundSelector, SourceSpan("[unify]"));
|
|
24
|
+
for (auto complex : complexes) {
|
|
25
|
+
SelectorComponentObj base = complex.back();
|
|
26
|
+
if (CompoundSelector * comp = base->getCompound()) {
|
|
27
|
+
if (unifiedBase->empty()) {
|
|
28
|
+
unifiedBase->concat(comp);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
for (SimpleSelectorObj simple : comp->elements()) {
|
|
32
|
+
unifiedBase = simple->unifyWith(unifiedBase);
|
|
33
|
+
if (unifiedBase.isNull()) return {};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
sass::vector<sass::vector<SelectorComponentObj>> complexesWithoutBases;
|
|
43
|
+
for (size_t i = 0; i < complexes.size(); i += 1) {
|
|
44
|
+
sass::vector<SelectorComponentObj> sel = complexes[i];
|
|
45
|
+
sel.pop_back(); // remove last item (base) from the list
|
|
46
|
+
complexesWithoutBases.push_back(std::move(sel));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
complexesWithoutBases.back().push_back(unifiedBase);
|
|
50
|
+
|
|
51
|
+
return weave(complexesWithoutBases);
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
// EO unifyComplex
|
|
55
|
+
|
|
56
|
+
// ##########################################################################
|
|
57
|
+
// Returns a [CompoundSelector] that matches only elements
|
|
58
|
+
// that are matched by both [compound1] and [compound2].
|
|
59
|
+
// If no such selector can be produced, returns `null`.
|
|
60
|
+
// ##########################################################################
|
|
61
|
+
CompoundSelector* CompoundSelector::unifyWith(CompoundSelector* rhs)
|
|
62
|
+
{
|
|
63
|
+
if (empty()) return rhs;
|
|
64
|
+
CompoundSelectorObj unified = SASS_MEMORY_COPY(rhs);
|
|
65
|
+
for (const SimpleSelectorObj& sel : elements()) {
|
|
66
|
+
unified = sel->unifyWith(unified);
|
|
67
|
+
if (unified.isNull()) break;
|
|
68
|
+
}
|
|
69
|
+
return unified.detach();
|
|
70
|
+
}
|
|
71
|
+
// EO CompoundSelector::unifyWith(CompoundSelector*)
|
|
72
|
+
|
|
73
|
+
// ##########################################################################
|
|
74
|
+
// Returns the compoments of a [CompoundSelector] that matches only elements
|
|
75
|
+
// matched by both this and [compound]. By default, this just returns a copy
|
|
76
|
+
// of [compound] with this selector added to the end, or returns the original
|
|
77
|
+
// array if this selector already exists in it. Returns `null` if unification
|
|
78
|
+
// is impossible—for example, if there are multiple ID selectors.
|
|
79
|
+
// ##########################################################################
|
|
80
|
+
// This is implemented in `selector/simple.dart` as `SimpleSelector::unify`
|
|
81
|
+
// ##########################################################################
|
|
82
|
+
CompoundSelector* SimpleSelector::unifyWith(CompoundSelector* rhs)
|
|
83
|
+
{
|
|
84
|
+
|
|
85
|
+
if (rhs->length() == 1) {
|
|
86
|
+
if (rhs->get(0)->is_universal()) {
|
|
87
|
+
CompoundSelector* this_compound = SASS_MEMORY_NEW(CompoundSelector, pstate());
|
|
88
|
+
this_compound->append(SASS_MEMORY_COPY(this));
|
|
89
|
+
CompoundSelector* unified = rhs->get(0)->unifyWith(this_compound);
|
|
90
|
+
if (unified == nullptr || unified != this_compound) delete this_compound;
|
|
91
|
+
return unified;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const SimpleSelectorObj& sel : rhs->elements()) {
|
|
95
|
+
if (*this == *sel) {
|
|
96
|
+
return rhs;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
CompoundSelectorObj result = SASS_MEMORY_NEW(CompoundSelector, rhs->pstate());
|
|
101
|
+
|
|
102
|
+
bool addedThis = false;
|
|
103
|
+
for (auto simple : rhs->elements()) {
|
|
104
|
+
// Make sure pseudo selectors always come last.
|
|
105
|
+
if (!addedThis && simple->getPseudoSelector()) {
|
|
106
|
+
result->append(this);
|
|
107
|
+
addedThis = true;
|
|
108
|
+
}
|
|
109
|
+
result->append(simple);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!addedThis) {
|
|
113
|
+
result->append(this);
|
|
114
|
+
}
|
|
115
|
+
return result.detach();
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
// EO SimpleSelector::unifyWith(CompoundSelector*)
|
|
119
|
+
|
|
120
|
+
// ##########################################################################
|
|
121
|
+
// This is implemented in `selector/type.dart` as `PseudoSelector::unify`
|
|
122
|
+
// ##########################################################################
|
|
123
|
+
CompoundSelector* TypeSelector::unifyWith(CompoundSelector* rhs)
|
|
124
|
+
{
|
|
125
|
+
if (rhs->empty()) {
|
|
126
|
+
rhs->append(this);
|
|
127
|
+
return rhs;
|
|
128
|
+
}
|
|
129
|
+
TypeSelector* type = Cast<TypeSelector>(rhs->at(0));
|
|
130
|
+
if (type != nullptr) {
|
|
131
|
+
SimpleSelector* unified = unifyWith(type);
|
|
132
|
+
if (unified == nullptr) {
|
|
133
|
+
return nullptr;
|
|
134
|
+
}
|
|
135
|
+
rhs->elements()[0] = unified;
|
|
136
|
+
}
|
|
137
|
+
else if (!is_universal() || (has_ns_ && ns_ != "*")) {
|
|
138
|
+
rhs->insert(rhs->begin(), this);
|
|
139
|
+
}
|
|
140
|
+
return rhs;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ##########################################################################
|
|
144
|
+
// This is implemented in `selector/id.dart` as `PseudoSelector::unify`
|
|
145
|
+
// ##########################################################################
|
|
146
|
+
CompoundSelector* IDSelector::unifyWith(CompoundSelector* rhs)
|
|
147
|
+
{
|
|
148
|
+
for (const SimpleSelector* sel : rhs->elements()) {
|
|
149
|
+
if (const IDSelector* id_sel = Cast<IDSelector>(sel)) {
|
|
150
|
+
if (id_sel->name() != name()) return nullptr;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return SimpleSelector::unifyWith(rhs);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ##########################################################################
|
|
157
|
+
// This is implemented in `selector/pseudo.dart` as `PseudoSelector::unify`
|
|
158
|
+
// ##########################################################################
|
|
159
|
+
CompoundSelector* PseudoSelector::unifyWith(CompoundSelector* compound)
|
|
160
|
+
{
|
|
161
|
+
|
|
162
|
+
if (compound->length() == 1 && compound->first()->is_universal()) {
|
|
163
|
+
// std::cerr << "implement universal pseudo\n";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
for (const SimpleSelectorObj& sel : compound->elements()) {
|
|
167
|
+
if (*this == *sel) {
|
|
168
|
+
return compound;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
CompoundSelectorObj result = SASS_MEMORY_NEW(CompoundSelector, compound->pstate());
|
|
173
|
+
|
|
174
|
+
bool addedThis = false;
|
|
175
|
+
for (auto simple : compound->elements()) {
|
|
176
|
+
// Make sure pseudo selectors always come last.
|
|
177
|
+
if (PseudoSelectorObj pseudo = simple->getPseudoSelector()) {
|
|
178
|
+
if (pseudo->isElement()) {
|
|
179
|
+
// A given compound selector may only contain one pseudo element. If
|
|
180
|
+
// [compound] has a different one than [this], unification fails.
|
|
181
|
+
if (isElement()) {
|
|
182
|
+
return {};
|
|
183
|
+
}
|
|
184
|
+
// Otherwise, this is a pseudo selector and
|
|
185
|
+
// should come before pseduo elements.
|
|
186
|
+
result->append(this);
|
|
187
|
+
addedThis = true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
result->append(simple);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (!addedThis) {
|
|
194
|
+
result->append(this);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return result.detach();
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
// EO PseudoSelector::unifyWith(CompoundSelector*
|
|
201
|
+
|
|
202
|
+
// ##########################################################################
|
|
203
|
+
// This is implemented in `extend/functions.dart` as `unifyUniversalAndElement`
|
|
204
|
+
// Returns a [SimpleSelector] that matches only elements that are matched by
|
|
205
|
+
// both [selector1] and [selector2], which must both be either [UniversalSelector]s
|
|
206
|
+
// or [TypeSelector]s. If no such selector can be produced, returns `null`.
|
|
207
|
+
// Note: libsass handles universal selector directly within the type selector
|
|
208
|
+
// ##########################################################################
|
|
209
|
+
SimpleSelector* TypeSelector::unifyWith(const SimpleSelector* rhs)
|
|
210
|
+
{
|
|
211
|
+
bool rhs_ns = false;
|
|
212
|
+
if (!(is_ns_eq(*rhs) || rhs->is_universal_ns())) {
|
|
213
|
+
if (!is_universal_ns()) {
|
|
214
|
+
return nullptr;
|
|
215
|
+
}
|
|
216
|
+
rhs_ns = true;
|
|
217
|
+
}
|
|
218
|
+
bool rhs_name = false;
|
|
219
|
+
if (!(name_ == rhs->name() || rhs->is_universal())) {
|
|
220
|
+
if (!(is_universal())) {
|
|
221
|
+
return nullptr;
|
|
222
|
+
}
|
|
223
|
+
rhs_name = true;
|
|
224
|
+
}
|
|
225
|
+
if (rhs_ns) {
|
|
226
|
+
ns(rhs->ns());
|
|
227
|
+
has_ns(rhs->has_ns());
|
|
228
|
+
}
|
|
229
|
+
if (rhs_name) name(rhs->name());
|
|
230
|
+
return this;
|
|
231
|
+
}
|
|
232
|
+
// EO TypeSelector::unifyWith(const SimpleSelector*)
|
|
233
|
+
|
|
234
|
+
// ##########################################################################
|
|
235
|
+
// Unify two complex selectors. Internally calls `unifyComplex`
|
|
236
|
+
// and then wraps the result in newly create ComplexSelectors.
|
|
237
|
+
// ##########################################################################
|
|
238
|
+
SelectorList* ComplexSelector::unifyWith(ComplexSelector* rhs)
|
|
239
|
+
{
|
|
240
|
+
SelectorListObj list = SASS_MEMORY_NEW(SelectorList, pstate());
|
|
241
|
+
sass::vector<sass::vector<SelectorComponentObj>> rv =
|
|
242
|
+
unifyComplex({ elements(), rhs->elements() });
|
|
243
|
+
for (sass::vector<SelectorComponentObj> items : rv) {
|
|
244
|
+
ComplexSelectorObj sel = SASS_MEMORY_NEW(ComplexSelector, pstate());
|
|
245
|
+
sel->elements() = std::move(items);
|
|
246
|
+
list->append(sel);
|
|
247
|
+
}
|
|
248
|
+
return list.detach();
|
|
249
|
+
}
|
|
250
|
+
// EO ComplexSelector::unifyWith(ComplexSelector*)
|
|
251
|
+
|
|
252
|
+
// ##########################################################################
|
|
253
|
+
// only called from the sass function `selector-unify`
|
|
254
|
+
// ##########################################################################
|
|
255
|
+
SelectorList* SelectorList::unifyWith(SelectorList* rhs)
|
|
256
|
+
{
|
|
257
|
+
SelectorList* slist = SASS_MEMORY_NEW(SelectorList, pstate());
|
|
258
|
+
// Unify all of children with RHS's children,
|
|
259
|
+
// storing the results in `unified_complex_selectors`
|
|
260
|
+
for (ComplexSelectorObj& seq1 : elements()) {
|
|
261
|
+
for (ComplexSelectorObj& seq2 : rhs->elements()) {
|
|
262
|
+
if (SelectorListObj unified = seq1->unifyWith(seq2)) {
|
|
263
|
+
std::move(unified->begin(), unified->end(),
|
|
264
|
+
std::inserter(slist->elements(), slist->end()));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return slist;
|
|
269
|
+
}
|
|
270
|
+
// EO SelectorList::unifyWith(SelectorList*)
|
|
271
|
+
|
|
272
|
+
// ##########################################################################
|
|
273
|
+
// ##########################################################################
|
|
274
|
+
|
|
275
|
+
}
|