Coverage Report

Created: 2025-09-04 06:47

/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