/src/libsass/src/ast_helpers.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | #ifndef SASS_AST_HELPERS_H |
2 | | #define SASS_AST_HELPERS_H |
3 | | |
4 | | // sass.hpp must go before all system headers to get the |
5 | | // __EXTENSIONS__ fix on Solaris. |
6 | | #include "sass.hpp" |
7 | | #include <algorithm> |
8 | | #include <functional> |
9 | | #include "util_string.hpp" |
10 | | |
11 | | namespace Sass { |
12 | | |
13 | | // ########################################################################### |
14 | | // ########################################################################### |
15 | | |
16 | | // easier to search with name |
17 | | const bool DELAYED = true; |
18 | | |
19 | | // ToDo: should this really be hardcoded |
20 | | // Note: most methods follow precision option |
21 | | const double NUMBER_EPSILON = 1e-12; |
22 | | |
23 | | // macro to test if numbers are equal within a small error margin |
24 | 0 | #define NEAR_EQUAL(lhs, rhs) std::fabs(lhs - rhs) < NUMBER_EPSILON |
25 | | |
26 | | // ########################################################################### |
27 | | // We define various functions and functors here. |
28 | | // Functions satisfy the BinaryPredicate requirement |
29 | | // Functors are structs used for e.g. unordered_map |
30 | | // ########################################################################### |
31 | | |
32 | | // ########################################################################### |
33 | | // Implement compare and hashing operations for raw pointers |
34 | | // ########################################################################### |
35 | | |
36 | | template <class T> |
37 | 4 | size_t PtrHashFn(const T* ptr) { |
38 | 4 | return std::hash<std::size_t>()((size_t)ptr); |
39 | 4 | } unsigned long Sass::PtrHashFn<Sass::ComplexSelector>(Sass::ComplexSelector const*) Line | Count | Source | 37 | 2 | size_t PtrHashFn(const T* ptr) { | 38 | 2 | return std::hash<std::size_t>()((size_t)ptr); | 39 | 2 | } |
unsigned long Sass::PtrHashFn<Sass::SelectorList>(Sass::SelectorList const*) Line | Count | Source | 37 | 2 | size_t PtrHashFn(const T* ptr) { | 38 | 2 | return std::hash<std::size_t>()((size_t)ptr); | 39 | 2 | } |
Unexecuted instantiation: unsigned long Sass::PtrHashFn<Sass::SimpleSelector>(Sass::SimpleSelector const*) |
40 | | |
41 | | struct PtrHash { |
42 | | template <class T> |
43 | | size_t operator() (const T* ptr) const { |
44 | | return PtrHashFn(ptr); |
45 | | } |
46 | | }; |
47 | | |
48 | | template <class T> |
49 | 0 | bool PtrEqualityFn(const T* lhs, const T* rhs) { |
50 | 0 | return lhs == rhs; // compare raw pointers |
51 | 0 | } Unexecuted instantiation: bool Sass::PtrEqualityFn<Sass::ComplexSelector>(Sass::ComplexSelector const*, Sass::ComplexSelector const*) Unexecuted instantiation: bool Sass::PtrEqualityFn<Sass::SelectorList>(Sass::SelectorList const*, Sass::SelectorList const*) Unexecuted instantiation: bool Sass::PtrEqualityFn<Sass::SimpleSelector>(Sass::SimpleSelector const*, Sass::SimpleSelector const*) Unexecuted instantiation: bool Sass::PtrEqualityFn<Sass::Block>(Sass::Block const*, Sass::Block const*) |
52 | | |
53 | | struct PtrEquality { |
54 | | template <class T> |
55 | | bool operator() (const T* lhs, const T* rhs) const { |
56 | | return PtrEqualityFn<T>(lhs, rhs); |
57 | | } |
58 | | }; |
59 | | |
60 | | // ########################################################################### |
61 | | // Implement compare and hashing operations for AST Nodes |
62 | | // ########################################################################### |
63 | | |
64 | | // TODO: get rid of functions and use ObjEquality<T> |
65 | | |
66 | | template <class T> |
67 | | // Hash the raw pointer instead of object |
68 | 4 | size_t ObjPtrHashFn(const T& obj) { |
69 | 4 | return PtrHashFn(obj.ptr()); |
70 | 4 | } unsigned long Sass::ObjPtrHashFn<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&) Line | Count | Source | 68 | 2 | size_t ObjPtrHashFn(const T& obj) { | 69 | 2 | return PtrHashFn(obj.ptr()); | 70 | 2 | } |
unsigned long Sass::ObjPtrHashFn<Sass::SharedImpl<Sass::SelectorList> >(Sass::SharedImpl<Sass::SelectorList> const&) Line | Count | Source | 68 | 2 | size_t ObjPtrHashFn(const T& obj) { | 69 | 2 | return PtrHashFn(obj.ptr()); | 70 | 2 | } |
Unexecuted instantiation: unsigned long Sass::ObjPtrHashFn<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&) |
71 | | |
72 | | struct ObjPtrHash { |
73 | | template <class T> |
74 | | // Hash the raw pointer instead of object |
75 | 4 | size_t operator() (const T& obj) const { |
76 | 4 | return ObjPtrHashFn(obj); |
77 | 4 | } unsigned long Sass::ObjPtrHash::operator()<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&) const Line | Count | Source | 75 | 2 | size_t operator() (const T& obj) const { | 76 | 2 | return ObjPtrHashFn(obj); | 77 | 2 | } |
unsigned long Sass::ObjPtrHash::operator()<Sass::SharedImpl<Sass::SelectorList> >(Sass::SharedImpl<Sass::SelectorList> const&) const Line | Count | Source | 75 | 2 | size_t operator() (const T& obj) const { | 76 | 2 | return ObjPtrHashFn(obj); | 77 | 2 | } |
Unexecuted instantiation: unsigned long Sass::ObjPtrHash::operator()<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&) const |
78 | | }; |
79 | | |
80 | | template <class T> |
81 | | // Hash the object and its content |
82 | 4 | size_t ObjHashFn(const T& obj) { |
83 | 4 | return obj ? obj->hash() : 0; |
84 | 4 | } Unexecuted instantiation: unsigned long Sass::ObjHashFn<Sass::SharedImpl<Sass::Expression> >(Sass::SharedImpl<Sass::Expression> const&) Unexecuted instantiation: unsigned long Sass::ObjHashFn<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&) unsigned long Sass::ObjHashFn<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&) Line | Count | Source | 82 | 4 | size_t ObjHashFn(const T& obj) { | 83 | 4 | return obj ? obj->hash() : 0; | 84 | 4 | } |
|
85 | | |
86 | | struct ObjHash { |
87 | | template <class T> |
88 | | // Hash the object and its content |
89 | 4 | size_t operator() (const T& obj) const { |
90 | 4 | return ObjHashFn(obj); |
91 | 4 | } Unexecuted instantiation: unsigned long Sass::ObjHash::operator()<Sass::SharedImpl<Sass::Expression> >(Sass::SharedImpl<Sass::Expression> const&) const Unexecuted instantiation: unsigned long Sass::ObjHash::operator()<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&) const unsigned long Sass::ObjHash::operator()<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&) const Line | Count | Source | 89 | 4 | size_t operator() (const T& obj) const { | 90 | 4 | return ObjHashFn(obj); | 91 | 4 | } |
|
92 | | }; |
93 | | |
94 | | template <class T> |
95 | | // Hash the object behind pointer |
96 | 0 | size_t PtrObjHashFn(const T* obj) { |
97 | 0 | return obj ? obj->hash() : 0; |
98 | 0 | } Unexecuted instantiation: unsigned long Sass::PtrObjHashFn<Sass::ComplexSelector>(Sass::ComplexSelector const*) Unexecuted instantiation: unsigned long Sass::PtrObjHashFn<Sass::SimpleSelector>(Sass::SimpleSelector const*) |
99 | | |
100 | | struct PtrObjHash { |
101 | | template <class T> |
102 | | // Hash the object behind pointer |
103 | 0 | size_t operator() (const T* obj) const { |
104 | 0 | return PtrObjHashFn(obj); |
105 | 0 | } Unexecuted instantiation: unsigned long Sass::PtrObjHash::operator()<Sass::ComplexSelector>(Sass::ComplexSelector const*) const Unexecuted instantiation: unsigned long Sass::PtrObjHash::operator()<Sass::SimpleSelector>(Sass::SimpleSelector const*) const |
106 | | }; |
107 | | |
108 | | template <class T> |
109 | | // Compare raw pointers to the object |
110 | 0 | bool ObjPtrEqualityFn(const T& lhs, const T& rhs) { |
111 | 0 | return PtrEqualityFn(lhs.ptr(), rhs.ptr()); |
112 | 0 | } Unexecuted instantiation: bool Sass::ObjPtrEqualityFn<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&, Sass::SharedImpl<Sass::ComplexSelector> const&) Unexecuted instantiation: bool Sass::ObjPtrEqualityFn<Sass::SharedImpl<Sass::SelectorList> >(Sass::SharedImpl<Sass::SelectorList> const&, Sass::SharedImpl<Sass::SelectorList> const&) Unexecuted instantiation: bool Sass::ObjPtrEqualityFn<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&, Sass::SharedImpl<Sass::SimpleSelector> const&) Unexecuted instantiation: bool Sass::ObjPtrEqualityFn<Sass::SharedImpl<Sass::Block> >(Sass::SharedImpl<Sass::Block> const&, Sass::SharedImpl<Sass::Block> const&) |
113 | | |
114 | | struct ObjPtrEquality { |
115 | | template <class T> |
116 | | // Compare raw pointers to the object |
117 | 0 | bool operator() (const T& lhs, const T& rhs) const { |
118 | 0 | return ObjPtrEqualityFn<T>(lhs, rhs); |
119 | 0 | } Unexecuted instantiation: bool Sass::ObjPtrEquality::operator()<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&, Sass::SharedImpl<Sass::ComplexSelector> const&) const Unexecuted instantiation: bool Sass::ObjPtrEquality::operator()<Sass::SharedImpl<Sass::SelectorList> >(Sass::SharedImpl<Sass::SelectorList> const&, Sass::SharedImpl<Sass::SelectorList> const&) const Unexecuted instantiation: bool Sass::ObjPtrEquality::operator()<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&, Sass::SharedImpl<Sass::SimpleSelector> const&) const |
120 | | }; |
121 | | |
122 | | template <class T> |
123 | | // Compare the objects behind the pointers |
124 | 0 | bool PtrObjEqualityFn(const T* lhs, const T* rhs) { |
125 | 0 | if (lhs == nullptr) return rhs == nullptr; |
126 | 0 | else if (rhs == nullptr) return false; |
127 | 0 | else return *lhs == *rhs; |
128 | 0 | } Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::CssMediaQuery>(Sass::CssMediaQuery const*, Sass::CssMediaQuery const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::Expression>(Sass::Expression const*, Sass::Expression const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::SimpleSelector>(Sass::SimpleSelector const*, Sass::SimpleSelector const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::SelectorList>(Sass::SelectorList const*, Sass::SelectorList const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::ComplexSelector>(Sass::ComplexSelector const*, Sass::ComplexSelector const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::String>(Sass::String const*, Sass::String const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::CssMediaRule>(Sass::CssMediaRule const*, Sass::CssMediaRule const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::PseudoSelector>(Sass::PseudoSelector const*, Sass::PseudoSelector const*) Unexecuted instantiation: bool Sass::PtrObjEqualityFn<Sass::SelectorComponent>(Sass::SelectorComponent const*, Sass::SelectorComponent const*) |
129 | | |
130 | | struct PtrObjEquality { |
131 | | template <class T> |
132 | | // Compare the objects behind the pointers |
133 | 0 | bool operator() (const T* lhs, const T* rhs) const { |
134 | 0 | return PtrObjEqualityFn<T>(lhs, rhs); |
135 | 0 | } Unexecuted instantiation: bool Sass::PtrObjEquality::operator()<Sass::ComplexSelector>(Sass::ComplexSelector const*, Sass::ComplexSelector const*) const Unexecuted instantiation: bool Sass::PtrObjEquality::operator()<Sass::SimpleSelector>(Sass::SimpleSelector const*, Sass::SimpleSelector const*) const Unexecuted instantiation: bool Sass::PtrObjEquality::operator()<Sass::String>(Sass::String const*, Sass::String const*) const Unexecuted instantiation: bool Sass::PtrObjEquality::operator()<Sass::SelectorList>(Sass::SelectorList const*, Sass::SelectorList const*) const |
136 | | }; |
137 | | |
138 | | template <class T> |
139 | | // Compare the objects and its contents |
140 | 0 | bool ObjEqualityFn(const T& lhs, const T& rhs) { |
141 | 0 | return PtrObjEqualityFn(lhs.ptr(), rhs.ptr()); |
142 | 0 | } Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::CssMediaQuery> >(Sass::SharedImpl<Sass::CssMediaQuery> const&, Sass::SharedImpl<Sass::CssMediaQuery> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::Expression> >(Sass::SharedImpl<Sass::Expression> const&, Sass::SharedImpl<Sass::Expression> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&, Sass::SharedImpl<Sass::SimpleSelector> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::SelectorList> >(Sass::SharedImpl<Sass::SelectorList> const&, Sass::SharedImpl<Sass::SelectorList> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&, Sass::SharedImpl<Sass::ComplexSelector> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::String> >(Sass::SharedImpl<Sass::String> const&, Sass::SharedImpl<Sass::String> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::CssMediaRule> >(Sass::SharedImpl<Sass::CssMediaRule> const&, Sass::SharedImpl<Sass::CssMediaRule> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::PseudoSelector> >(Sass::SharedImpl<Sass::PseudoSelector> const&, Sass::SharedImpl<Sass::PseudoSelector> const&) Unexecuted instantiation: bool Sass::ObjEqualityFn<Sass::SharedImpl<Sass::SelectorComponent> >(Sass::SharedImpl<Sass::SelectorComponent> const&, Sass::SharedImpl<Sass::SelectorComponent> const&) |
143 | | |
144 | | struct ObjEquality { |
145 | | template <class T> |
146 | | // Compare the objects and its contents |
147 | 0 | bool operator() (const T& lhs, const T& rhs) const { |
148 | 0 | return ObjEqualityFn<T>(lhs, rhs); |
149 | 0 | } Unexecuted instantiation: bool Sass::ObjEquality::operator()<Sass::SharedImpl<Sass::ComplexSelector> >(Sass::SharedImpl<Sass::ComplexSelector> const&, Sass::SharedImpl<Sass::ComplexSelector> const&) const Unexecuted instantiation: bool Sass::ObjEquality::operator()<Sass::SharedImpl<Sass::SimpleSelector> >(Sass::SharedImpl<Sass::SimpleSelector> const&, Sass::SharedImpl<Sass::SimpleSelector> const&) const Unexecuted instantiation: bool Sass::ObjEquality::operator()<Sass::SharedImpl<Sass::String> >(Sass::SharedImpl<Sass::String> const&, Sass::SharedImpl<Sass::String> const&) const |
150 | | }; |
151 | | |
152 | | // ########################################################################### |
153 | | // Special compare function only for hashes. |
154 | | // We need to make sure to not have objects equal that |
155 | | // have different hashes. This is currently an issue, |
156 | | // since `1px` is equal to `1` but have different hashes. |
157 | | // This goes away once we remove unitless equality. |
158 | | // ########################################################################### |
159 | | |
160 | | template <class T> |
161 | | // Compare the objects and its hashes |
162 | 0 | bool ObjHashEqualityFn(const T& lhs, const T& rhs) { |
163 | 0 | if (lhs == nullptr) return rhs == nullptr; |
164 | 0 | else if (rhs == nullptr) return false; |
165 | 0 | else return lhs->hash() == rhs->hash(); |
166 | 0 | } |
167 | | struct ObjHashEquality { |
168 | | template <class T> |
169 | | // Compare the objects and its contents and hashes |
170 | 0 | bool operator() (const T& lhs, const T& rhs) const { |
171 | 0 | return ObjEqualityFn<T>(lhs, rhs) && |
172 | 0 | ObjHashEqualityFn(lhs, rhs); |
173 | 0 | } |
174 | | }; |
175 | | |
176 | | // ########################################################################### |
177 | | // Implement ordering operations for AST Nodes |
178 | | // ########################################################################### |
179 | | |
180 | | template <class T> |
181 | | // Compare the objects behind pointers |
182 | | bool PtrObjLessThanFn(const T* lhs, const T* rhs) { |
183 | | if (lhs == nullptr) return rhs != nullptr; |
184 | | else if (rhs == nullptr) return false; |
185 | | else return *lhs < *rhs; |
186 | | } |
187 | | |
188 | | struct PtrObjLessThan { |
189 | | template <class T> |
190 | | // Compare the objects behind pointers |
191 | | bool operator() (const T* lhs, const T* rhs) const { |
192 | | return PtrObjLessThanFn<T>(lhs, rhs); |
193 | | } |
194 | | }; |
195 | | |
196 | | template <class T> |
197 | | // Compare the objects and its content |
198 | | bool ObjLessThanFn(const T& lhs, const T& rhs) { |
199 | | return PtrObjLessThanFn(lhs.ptr(), rhs.ptr()); |
200 | | }; |
201 | | |
202 | | struct ObjLessThan { |
203 | | template <class T> |
204 | | // Compare the objects and its content |
205 | | bool operator() (const T& lhs, const T& rhs) const { |
206 | | return ObjLessThanFn<T>(lhs, rhs); |
207 | | } |
208 | | }; |
209 | | |
210 | | // ########################################################################### |
211 | | // Some STL helper functions |
212 | | // ########################################################################### |
213 | | |
214 | | // Check if all elements are equal |
215 | | template <class X, class Y, |
216 | | typename XT = typename X::value_type, |
217 | | typename YT = typename Y::value_type> |
218 | | bool ListEquality(const X& lhs, const Y& rhs, |
219 | | bool(*cmp)(const XT*, const YT*)) |
220 | 0 | { |
221 | 0 | return lhs.size() == rhs.size() && |
222 | 0 | std::equal(lhs.begin(), lhs.end(), |
223 | 0 | rhs.begin(), cmp); |
224 | 0 | } |
225 | | |
226 | | // Return if Vector is empty |
227 | | template <class T> |
228 | 6 | bool listIsEmpty(T* cnt) { |
229 | 6 | return cnt && cnt->empty(); |
230 | 6 | } bool Sass::listIsEmpty<Sass::SimpleSelector>(Sass::SimpleSelector*) Line | Count | Source | 228 | 2 | bool listIsEmpty(T* cnt) { | 229 | 2 | return cnt && cnt->empty(); | 230 | 2 | } |
bool Sass::listIsEmpty<Sass::SelectorComponent>(Sass::SelectorComponent*) Line | Count | Source | 228 | 2 | bool listIsEmpty(T* cnt) { | 229 | 2 | return cnt && cnt->empty(); | 230 | 2 | } |
bool Sass::listIsEmpty<Sass::ComplexSelector>(Sass::ComplexSelector*) Line | Count | Source | 228 | 2 | bool listIsEmpty(T* cnt) { | 229 | 2 | return cnt && cnt->empty(); | 230 | 2 | } |
|
231 | | |
232 | | // Erase items from vector that match predicate |
233 | | template<class T, class UnaryPredicate> |
234 | | void listEraseItemIf(T& vec, UnaryPredicate* predicate) |
235 | 6 | { |
236 | 6 | vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end()); |
237 | 6 | } void Sass::listEraseItemIf<std::__1::vector<Sass::SharedImpl<Sass::SimpleSelector>, std::__1::allocator<Sass::SharedImpl<Sass::SimpleSelector> > >, bool (Sass::SimpleSelector*)>(std::__1::vector<Sass::SharedImpl<Sass::SimpleSelector>, std::__1::allocator<Sass::SharedImpl<Sass::SimpleSelector> > >&, bool (*)(Sass::SimpleSelector*)) Line | Count | Source | 235 | 2 | { | 236 | 2 | vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end()); | 237 | 2 | } |
void Sass::listEraseItemIf<std::__1::vector<Sass::SharedImpl<Sass::SelectorComponent>, std::__1::allocator<Sass::SharedImpl<Sass::SelectorComponent> > >, bool (Sass::SelectorComponent*)>(std::__1::vector<Sass::SharedImpl<Sass::SelectorComponent>, std::__1::allocator<Sass::SharedImpl<Sass::SelectorComponent> > >&, bool (*)(Sass::SelectorComponent*)) Line | Count | Source | 235 | 2 | { | 236 | 2 | vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end()); | 237 | 2 | } |
void Sass::listEraseItemIf<std::__1::vector<Sass::SharedImpl<Sass::ComplexSelector>, std::__1::allocator<Sass::SharedImpl<Sass::ComplexSelector> > >, bool (Sass::ComplexSelector*)>(std::__1::vector<Sass::SharedImpl<Sass::ComplexSelector>, std::__1::allocator<Sass::SharedImpl<Sass::ComplexSelector> > >&, bool (*)(Sass::ComplexSelector*)) Line | Count | Source | 235 | 2 | { | 236 | 2 | vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end()); | 237 | 2 | } |
|
238 | | |
239 | | // Check that every item in `lhs` is also in `rhs` |
240 | | // Note: this works by comparing the raw pointers |
241 | | template <typename T> |
242 | 0 | bool listIsSubsetOrEqual(const T& lhs, const T& rhs) { |
243 | 0 | for (const auto& item : lhs) { |
244 | 0 | if (std::find(rhs.begin(), rhs.end(), item) == rhs.end()) |
245 | 0 | return false; |
246 | 0 | } |
247 | 0 | return true; |
248 | 0 | } |
249 | | |
250 | | // ########################################################################## |
251 | | // Returns whether [name] is the name of a pseudo-element |
252 | | // that can be written with pseudo-class syntax (CSS2 vs CSS3): |
253 | | // `:before`, `:after`, `:first-line`, or `:first-letter` |
254 | | // ########################################################################## |
255 | | inline bool isFakePseudoElement(const sass::string& name) |
256 | 5.80k | { |
257 | 5.80k | return Util::equalsLiteral("after", name) |
258 | 5.80k | || Util::equalsLiteral("before", name) |
259 | 5.80k | || Util::equalsLiteral("first-line", name) |
260 | 5.80k | || Util::equalsLiteral("first-letter", name); |
261 | 5.80k | } |
262 | | |
263 | | // ########################################################################## |
264 | | // Names of pseudo selectors that take selectors as arguments, |
265 | | // and that are subselectors of their arguments. |
266 | | // For example, `.foo` is a superselector of `:matches(.foo)`. |
267 | | // ########################################################################## |
268 | | inline bool isSubselectorPseudo(const sass::string& norm) |
269 | 0 | { |
270 | 0 | return Util::equalsLiteral("any", norm) |
271 | 0 | || Util::equalsLiteral("matches", norm) |
272 | 0 | || Util::equalsLiteral("nth-child", norm) |
273 | 0 | || Util::equalsLiteral("nth-last-child", norm); |
274 | 0 | } |
275 | | // EO isSubselectorPseudo |
276 | | |
277 | | // ########################################################################### |
278 | | // Pseudo-class selectors that take unadorned selectors as arguments. |
279 | | // ########################################################################### |
280 | | inline bool isSelectorPseudoClass(const sass::string& test) |
281 | 0 | { |
282 | 0 | return Util::equalsLiteral("not", test) |
283 | 0 | || Util::equalsLiteral("matches", test) |
284 | 0 | || Util::equalsLiteral("current", test) |
285 | 0 | || Util::equalsLiteral("any", test) |
286 | 0 | || Util::equalsLiteral("has", test) |
287 | 0 | || Util::equalsLiteral("host", test) |
288 | 0 | || Util::equalsLiteral("host-context", test); |
289 | 0 | } |
290 | | // EO isSelectorPseudoClass |
291 | | |
292 | | // ########################################################################### |
293 | | // Pseudo-element selectors that take unadorned selectors as arguments. |
294 | | // ########################################################################### |
295 | | inline bool isSelectorPseudoElement(const sass::string& test) |
296 | 0 | { |
297 | 0 | return Util::equalsLiteral("slotted", test); |
298 | 0 | } |
299 | | // EO isSelectorPseudoElement |
300 | | |
301 | | // ########################################################################### |
302 | | // Pseudo-element selectors that has binominals |
303 | | // ########################################################################### |
304 | | inline bool isSelectorPseudoBinominal(const sass::string& test) |
305 | 0 | { |
306 | 0 | return Util::equalsLiteral("nth-child", test) |
307 | 0 | || Util::equalsLiteral("nth-last-child", test); |
308 | 0 | } |
309 | | // isSelectorPseudoBinominal |
310 | | |
311 | | // ########################################################################### |
312 | | // ########################################################################### |
313 | | |
314 | | } |
315 | | |
316 | | #endif |