sassc 2.2.1 → 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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +18 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory/allocator.cpp +48 -0
  81. data/ext/libsass/src/memory/allocator.hpp +138 -0
  82. data/ext/libsass/src/memory/config.hpp +20 -0
  83. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  84. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  85. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  86. data/ext/libsass/src/memory.hpp +12 -0
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +8 -8
  132. data/lib/sassc/native.rb +4 -6
  133. data/lib/sassc/script.rb +4 -4
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +18 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +29 -15
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
@@ -4,68 +4,57 @@
4
4
  // sass.hpp must go before all system headers to get the
5
5
  // __EXTENSIONS__ fix on Solaris.
6
6
  #include "sass.hpp"
7
-
8
- #include <set>
9
- #include <deque>
10
- #include <vector>
11
- #include <string>
12
- #include <sstream>
13
- #include <iostream>
14
- #include <typeinfo>
15
- #include <algorithm>
16
- #include "sass/base.h"
17
- #include "ast_fwd_decl.hpp"
18
-
19
- #include "util.hpp"
20
- #include "units.hpp"
21
- #include "context.hpp"
22
- #include "position.hpp"
23
- #include "constants.hpp"
24
- #include "operation.hpp"
25
- #include "position.hpp"
26
- #include "inspect.hpp"
27
- #include "source_map.hpp"
28
- #include "environment.hpp"
29
- #include "error_handling.hpp"
30
- #include "ast_def_macros.hpp"
31
- #include "ast_fwd_decl.hpp"
32
- #include "source_map.hpp"
33
- #include "fn_utils.hpp"
34
-
35
- #include "sass.h"
7
+ #include "ast.hpp"
36
8
 
37
9
  namespace Sass {
38
10
 
11
+ /////////////////////////////////////////////////////////////////////////
12
+ // Some helper functions
13
+ /////////////////////////////////////////////////////////////////////////
14
+
15
+ bool compoundIsSuperselector(
16
+ const CompoundSelectorObj& compound1,
17
+ const CompoundSelectorObj& compound2,
18
+ const sass::vector<SelectorComponentObj>& parents);
19
+
20
+ bool complexIsParentSuperselector(
21
+ const sass::vector<SelectorComponentObj>& complex1,
22
+ const sass::vector<SelectorComponentObj>& complex2);
23
+
24
+ sass::vector<sass::vector<SelectorComponentObj>> weave(
25
+ const sass::vector<sass::vector<SelectorComponentObj>>& complexes);
26
+
27
+ sass::vector<sass::vector<SelectorComponentObj>> weaveParents(
28
+ sass::vector<SelectorComponentObj> parents1,
29
+ sass::vector<SelectorComponentObj> parents2);
30
+
31
+ sass::vector<SimpleSelectorObj> unifyCompound(
32
+ const sass::vector<SimpleSelectorObj>& compound1,
33
+ const sass::vector<SimpleSelectorObj>& compound2);
34
+
35
+ sass::vector<sass::vector<SelectorComponentObj>> unifyComplex(
36
+ const sass::vector<sass::vector<SelectorComponentObj>>& complexes);
37
+
39
38
  /////////////////////////////////////////
40
39
  // Abstract base class for CSS selectors.
41
40
  /////////////////////////////////////////
42
41
  class Selector : public Expression {
43
- // line break before list separator
44
- ADD_PROPERTY(bool, has_line_feed)
45
- // line break after list separator
46
- ADD_PROPERTY(bool, has_line_break)
47
- // maybe we have optional flag
48
- ADD_PROPERTY(bool, is_optional)
49
- // must not be a reference counted object
50
- // otherwise we create circular references
51
- ADD_PROPERTY(Media_Block*, media_block)
52
42
  protected:
53
43
  mutable size_t hash_;
54
44
  public:
55
- Selector(ParserState pstate);
45
+ Selector(SourceSpan pstate);
56
46
  virtual ~Selector() = 0;
57
47
  size_t hash() const override = 0;
58
- virtual unsigned long specificity() const = 0;
59
- virtual int unification_order() const = 0;
60
- virtual void set_media_block(Media_Block* mb);
61
- virtual bool has_parent_ref() const;
62
48
  virtual bool has_real_parent_ref() const;
49
+ // you should reset this to null on containers
50
+ virtual unsigned long specificity() const = 0;
51
+ // by default we return the regular specificity
52
+ // you must override this for all containers
53
+ virtual size_t maxSpecificity() const { return specificity(); }
54
+ virtual size_t minSpecificity() const { return specificity(); }
63
55
  // dispatch to correct handlers
64
- virtual bool operator<(const Selector& rhs) const = 0;
65
- virtual bool operator==(const Selector& rhs) const = 0;
66
- bool operator>(const Selector& rhs) const { return rhs < *this; };
67
- bool operator!=(const Selector& rhs) const { return !(rhs == *this); };
68
- ATTACH_VIRTUAL_AST_OPERATIONS(Selector);
56
+ ATTACH_VIRTUAL_CMP_OPERATIONS(Selector)
57
+ ATTACH_VIRTUAL_AST_OPERATIONS(Selector)
69
58
  };
70
59
  inline Selector::~Selector() { }
71
60
 
@@ -74,19 +63,14 @@ namespace Sass {
74
63
  // re-parsed into a normal selector class.
75
64
  /////////////////////////////////////////////////////////////////////////
76
65
  class Selector_Schema final : public AST_Node {
77
- ADD_PROPERTY(String_Obj, contents)
66
+ ADD_PROPERTY(String_Schema_Obj, contents)
78
67
  ADD_PROPERTY(bool, connect_parent);
79
- // must not be a reference counted object
80
- // otherwise we create circular references
81
- ADD_PROPERTY(Media_Block*, media_block)
82
68
  // store computed hash
83
69
  mutable size_t hash_;
84
70
  public:
85
- Selector_Schema(ParserState pstate, String_Obj c);
86
- bool has_parent_ref() const;
71
+ Selector_Schema(SourceSpan pstate, String_Obj c);
72
+
87
73
  bool has_real_parent_ref() const;
88
- bool operator<(const Selector& rhs) const;
89
- bool operator==(const Selector& rhs) const;
90
74
  // selector schema is not yet a final selector, so we do not
91
75
  // have a specificity for it yet. We need to
92
76
  virtual unsigned long specificity() const;
@@ -98,30 +82,30 @@ namespace Sass {
98
82
  ////////////////////////////////////////////
99
83
  // Abstract base class for simple selectors.
100
84
  ////////////////////////////////////////////
101
- class Simple_Selector : public Selector {
85
+ class SimpleSelector : public Selector {
102
86
  public:
103
87
  enum Simple_Type {
104
88
  ID_SEL,
105
89
  TYPE_SEL,
106
90
  CLASS_SEL,
107
91
  PSEUDO_SEL,
108
- PARENT_SEL,
109
- WRAPPED_SEL,
110
92
  ATTRIBUTE_SEL,
111
93
  PLACEHOLDER_SEL,
112
94
  };
113
95
  public:
114
- HASH_CONSTREF(std::string, ns)
115
- HASH_CONSTREF(std::string, name)
96
+ HASH_CONSTREF(sass::string, ns)
97
+ HASH_CONSTREF(sass::string, name)
116
98
  ADD_PROPERTY(Simple_Type, simple_type)
117
99
  HASH_PROPERTY(bool, has_ns)
118
100
  public:
119
- Simple_Selector(ParserState pstate, std::string n = "");
120
- virtual std::string ns_name() const;
101
+ SimpleSelector(SourceSpan pstate, sass::string n = "");
102
+ // ordering within parent (peudos go last)
103
+ virtual int getSortOrder() const = 0;
104
+ virtual sass::string ns_name() const;
121
105
  size_t hash() const override;
122
- bool empty() const;
106
+ virtual bool empty() const;
123
107
  // namespace compare functions
124
- bool is_ns_eq(const Simple_Selector& r) const;
108
+ bool is_ns_eq(const SimpleSelector& r) const;
125
109
  // namespace query functions
126
110
  bool is_universal_ns() const;
127
111
  bool is_empty_ns() const;
@@ -131,437 +115,407 @@ namespace Sass {
131
115
  bool is_universal() const;
132
116
  virtual bool has_placeholder();
133
117
 
134
- virtual ~Simple_Selector() = 0;
135
- virtual Compound_Selector* unify_with(Compound_Selector*);
118
+ virtual ~SimpleSelector() = 0;
119
+ virtual CompoundSelector* unifyWith(CompoundSelector*);
136
120
 
137
- virtual bool has_parent_ref() const override;
138
- virtual bool has_real_parent_ref() const override;
121
+ /* helper function for syntax sugar */
122
+ virtual IDSelector* getIdSelector() { return NULL; }
123
+ virtual TypeSelector* getTypeSelector() { return NULL; }
124
+ virtual PseudoSelector* getPseudoSelector() { return NULL; }
125
+
126
+ ComplexSelectorObj wrapInComplex();
127
+ CompoundSelectorObj wrapInCompound();
128
+
129
+ virtual bool isInvisible() const { return false; }
139
130
  virtual bool is_pseudo_element() const;
140
- virtual bool is_superselector_of(const Compound_Selector* sub) const;
131
+ virtual bool has_real_parent_ref() const override;
141
132
 
142
- bool operator<(const Selector& rhs) const final override;
143
133
  bool operator==(const Selector& rhs) const final override;
144
- virtual bool operator<(const Selector_List& rhs) const;
145
- virtual bool operator==(const Selector_List& rhs) const;
146
- virtual bool operator<(const Complex_Selector& rhs) const;
147
- virtual bool operator==(const Complex_Selector& rhs) const;
148
- virtual bool operator<(const Compound_Selector& rhs) const;
149
- virtual bool operator==(const Compound_Selector& rhs) const;
150
- virtual bool operator<(const Simple_Selector& rhs) const;
151
- virtual bool operator==(const Simple_Selector& rhs) const;
152
-
153
- ATTACH_VIRTUAL_AST_OPERATIONS(Simple_Selector);
154
- ATTACH_CRTP_PERFORM_METHODS();
155
134
 
156
- };
157
- inline Simple_Selector::~Simple_Selector() { }
158
-
159
- //////////////////////////////////
160
- // The Parent Selector Expression.
161
- //////////////////////////////////
162
- class Parent_Selector final : public Simple_Selector {
163
- // a real parent selector is given by the user
164
- // others are added implicitly to connect the
165
- // selector scopes automatically when rendered
166
- // a Parent_Reference is never seen in selectors
167
- // and is only used in values (e.g. `prop: #{&};`)
168
- ADD_PROPERTY(bool, real)
169
- public:
170
- Parent_Selector(ParserState pstate, bool r = true);
135
+ virtual bool operator==(const SelectorList& rhs) const;
136
+ virtual bool operator==(const ComplexSelector& rhs) const;
137
+ virtual bool operator==(const CompoundSelector& rhs) const;
171
138
 
172
- virtual bool has_parent_ref() const override;
173
- virtual bool has_real_parent_ref() const override;
139
+ ATTACH_VIRTUAL_CMP_OPERATIONS(SimpleSelector);
140
+ ATTACH_VIRTUAL_AST_OPERATIONS(SimpleSelector);
141
+ ATTACH_CRTP_PERFORM_METHODS();
174
142
 
175
- virtual unsigned long specificity() const override;
176
- int unification_order() const override
177
- {
178
- throw std::runtime_error("unification_order for Parent_Selector is undefined");
179
- }
180
- std::string type() const override { return "selector"; }
181
- static std::string type_name() { return "selector"; }
182
- bool operator<(const Simple_Selector& rhs) const final override;
183
- bool operator==(const Simple_Selector& rhs) const final override;
184
- bool operator<(const Parent_Selector& rhs) const;
185
- bool operator==(const Parent_Selector& rhs) const;
186
- ATTACH_AST_OPERATIONS(Parent_Selector)
187
- ATTACH_CRTP_PERFORM_METHODS()
188
143
  };
189
-
144
+ inline SimpleSelector::~SimpleSelector() { }
190
145
 
191
146
  /////////////////////////////////////////////////////////////////////////
192
147
  // Placeholder selectors (e.g., "%foo") for use in extend-only selectors.
193
148
  /////////////////////////////////////////////////////////////////////////
194
- class Placeholder_Selector final : public Simple_Selector {
149
+ class PlaceholderSelector final : public SimpleSelector {
195
150
  public:
196
- Placeholder_Selector(ParserState pstate, std::string n);
197
-
198
- int unification_order() const override
199
- {
200
- return Constants::UnificationOrder_Placeholder;
201
- }
202
- virtual ~Placeholder_Selector() {};
151
+ PlaceholderSelector(SourceSpan pstate, sass::string n);
152
+ int getSortOrder() const override final { return 0; }
153
+ bool isInvisible() const override { return true; }
203
154
  virtual unsigned long specificity() const override;
204
155
  virtual bool has_placeholder() override;
205
- bool operator<(const Simple_Selector& rhs) const override;
206
- bool operator==(const Simple_Selector& rhs) const override;
207
- bool operator<(const Placeholder_Selector& rhs) const;
208
- bool operator==(const Placeholder_Selector& rhs) const;
209
- ATTACH_AST_OPERATIONS(Placeholder_Selector)
156
+ bool operator==(const SimpleSelector& rhs) const override;
157
+ ATTACH_CMP_OPERATIONS(PlaceholderSelector)
158
+ ATTACH_AST_OPERATIONS(PlaceholderSelector)
210
159
  ATTACH_CRTP_PERFORM_METHODS()
211
160
  };
212
161
 
213
162
  /////////////////////////////////////////////////////////////////////
214
163
  // Type selectors (and the universal selector) -- e.g., div, span, *.
215
164
  /////////////////////////////////////////////////////////////////////
216
- class Type_Selector final : public Simple_Selector {
165
+ class TypeSelector final : public SimpleSelector {
217
166
  public:
218
- Type_Selector(ParserState pstate, std::string n);
167
+ TypeSelector(SourceSpan pstate, sass::string n);
168
+ int getSortOrder() const override final { return 1; }
219
169
  virtual unsigned long specificity() const override;
220
- int unification_order() const override
221
- {
222
- return Constants::UnificationOrder_Element;
223
- }
224
- Simple_Selector* unify_with(Simple_Selector*);
225
- Compound_Selector* unify_with(Compound_Selector*) override;
226
- bool operator<(const Simple_Selector& rhs) const final override;
227
- bool operator==(const Simple_Selector& rhs) const final override;
228
- bool operator<(const Type_Selector& rhs) const;
229
- bool operator==(const Type_Selector& rhs) const;
230
- ATTACH_AST_OPERATIONS(Type_Selector)
170
+ SimpleSelector* unifyWith(const SimpleSelector*);
171
+ CompoundSelector* unifyWith(CompoundSelector*) override;
172
+ TypeSelector* getTypeSelector() override { return this; }
173
+ bool operator==(const SimpleSelector& rhs) const final override;
174
+ ATTACH_CMP_OPERATIONS(TypeSelector)
175
+ ATTACH_AST_OPERATIONS(TypeSelector)
231
176
  ATTACH_CRTP_PERFORM_METHODS()
232
177
  };
233
178
 
234
179
  ////////////////////////////////////////////////
235
180
  // Class selectors -- i.e., .foo.
236
181
  ////////////////////////////////////////////////
237
- class Class_Selector final : public Simple_Selector {
182
+ class ClassSelector final : public SimpleSelector {
238
183
  public:
239
- Class_Selector(ParserState pstate, std::string n);
184
+ ClassSelector(SourceSpan pstate, sass::string n);
185
+ int getSortOrder() const override final { return 3; }
240
186
  virtual unsigned long specificity() const override;
241
- int unification_order() const override
242
- {
243
- return Constants::UnificationOrder_Class;
244
- }
245
- Compound_Selector* unify_with(Compound_Selector*) override;
246
- bool operator<(const Simple_Selector& rhs) const final override;
247
- bool operator==(const Simple_Selector& rhs) const final override;
248
- bool operator<(const Class_Selector& rhs) const;
249
- bool operator==(const Class_Selector& rhs) const;
250
- ATTACH_AST_OPERATIONS(Class_Selector)
187
+ bool operator==(const SimpleSelector& rhs) const final override;
188
+ ATTACH_CMP_OPERATIONS(ClassSelector)
189
+ ATTACH_AST_OPERATIONS(ClassSelector)
251
190
  ATTACH_CRTP_PERFORM_METHODS()
252
191
  };
253
192
 
254
193
  ////////////////////////////////////////////////
255
194
  // ID selectors -- i.e., #foo.
256
195
  ////////////////////////////////////////////////
257
- class Id_Selector final : public Simple_Selector {
196
+ class IDSelector final : public SimpleSelector {
258
197
  public:
259
- Id_Selector(ParserState pstate, std::string n);
198
+ IDSelector(SourceSpan pstate, sass::string n);
199
+ int getSortOrder() const override final { return 2; }
260
200
  virtual unsigned long specificity() const override;
261
- int unification_order() const override
262
- {
263
- return Constants::UnificationOrder_Id;
264
- }
265
- Compound_Selector* unify_with(Compound_Selector*) override;
266
- bool operator<(const Simple_Selector& rhs) const final override;
267
- bool operator==(const Simple_Selector& rhs) const final override;
268
- bool operator<(const Id_Selector& rhs) const;
269
- bool operator==(const Id_Selector& rhs) const;
270
- ATTACH_AST_OPERATIONS(Id_Selector)
201
+ CompoundSelector* unifyWith(CompoundSelector*) override;
202
+ IDSelector* getIdSelector() final override { return this; }
203
+ bool operator==(const SimpleSelector& rhs) const final override;
204
+ ATTACH_CMP_OPERATIONS(IDSelector)
205
+ ATTACH_AST_OPERATIONS(IDSelector)
271
206
  ATTACH_CRTP_PERFORM_METHODS()
272
207
  };
273
208
 
274
209
  ///////////////////////////////////////////////////
275
210
  // Attribute selectors -- e.g., [src*=".jpg"], etc.
276
211
  ///////////////////////////////////////////////////
277
- class Attribute_Selector final : public Simple_Selector {
278
- ADD_CONSTREF(std::string, matcher)
212
+ class AttributeSelector final : public SimpleSelector {
213
+ ADD_CONSTREF(sass::string, matcher)
279
214
  // this cannot be changed to obj atm!!!!!!????!!!!!!!
280
215
  ADD_PROPERTY(String_Obj, value) // might be interpolated
281
216
  ADD_PROPERTY(char, modifier);
282
217
  public:
283
- Attribute_Selector(ParserState pstate, std::string n, std::string m, String_Obj v, char o = 0);
218
+ AttributeSelector(SourceSpan pstate, sass::string n, sass::string m, String_Obj v, char o = 0);
219
+ int getSortOrder() const override final { return 4; }
284
220
  size_t hash() const override;
285
221
  virtual unsigned long specificity() const override;
286
- int unification_order() const override
287
- {
288
- return Constants::UnificationOrder_Attribute;
289
- }
290
- bool operator<(const Simple_Selector& rhs) const final override;
291
- bool operator==(const Simple_Selector& rhs) const final override;
292
- bool operator<(const Attribute_Selector& rhs) const;
293
- bool operator==(const Attribute_Selector& rhs) const;
294
- ATTACH_AST_OPERATIONS(Attribute_Selector)
222
+ bool operator==(const SimpleSelector& rhs) const final override;
223
+ ATTACH_CMP_OPERATIONS(AttributeSelector)
224
+ ATTACH_AST_OPERATIONS(AttributeSelector)
295
225
  ATTACH_CRTP_PERFORM_METHODS()
296
226
  };
297
227
 
298
228
  //////////////////////////////////////////////////////////////////
299
229
  // Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc.
300
230
  //////////////////////////////////////////////////////////////////
301
- /* '::' starts a pseudo-element, ':' a pseudo-class */
302
- /* Except :first-line, :first-letter, :before and :after */
303
- /* Note that pseudo-elements are restricted to one per selector */
304
- /* and occur only in the last simple_selector_sequence. */
305
- inline bool is_pseudo_class_element(const std::string& name)
306
- {
307
- return name == ":before" ||
308
- name == ":after" ||
309
- name == ":first-line" ||
310
- name == ":first-letter";
311
- }
312
-
313
231
  // Pseudo Selector cannot have any namespace?
314
- class Pseudo_Selector final : public Simple_Selector {
315
- ADD_PROPERTY(String_Obj, expression)
232
+ class PseudoSelector final : public SimpleSelector {
233
+ ADD_PROPERTY(sass::string, normalized)
234
+ ADD_PROPERTY(String_Obj, argument)
235
+ ADD_PROPERTY(SelectorListObj, selector)
236
+ ADD_PROPERTY(bool, isSyntacticClass)
237
+ ADD_PROPERTY(bool, isClass)
316
238
  public:
317
- Pseudo_Selector(ParserState pstate, std::string n, String_Obj expr = {});
239
+ PseudoSelector(SourceSpan pstate, sass::string n, bool element = false);
240
+ int getSortOrder() const override final { return 5; }
318
241
  virtual bool is_pseudo_element() const override;
319
242
  size_t hash() const override;
320
- virtual unsigned long specificity() const override;
321
- int unification_order() const override
322
- {
323
- if (is_pseudo_element())
324
- return Constants::UnificationOrder_PseudoElement;
325
- return Constants::UnificationOrder_PseudoClass;
326
- }
327
- bool operator<(const Simple_Selector& rhs) const final override;
328
- bool operator==(const Simple_Selector& rhs) const final override;
329
- bool operator<(const Pseudo_Selector& rhs) const;
330
- bool operator==(const Pseudo_Selector& rhs) const;
331
- Compound_Selector* unify_with(Compound_Selector*) override;
332
- ATTACH_AST_OPERATIONS(Pseudo_Selector)
333
- ATTACH_CRTP_PERFORM_METHODS()
334
- };
335
243
 
336
- /////////////////////////////////////////////////
337
- // Wrapped selector -- pseudo selector that takes a list of selectors as argument(s) e.g., :not(:first-of-type), :-moz-any(ol p.blah, ul, menu, dir)
338
- /////////////////////////////////////////////////
339
- class Wrapped_Selector final : public Simple_Selector {
340
- ADD_PROPERTY(Selector_List_Obj, selector)
341
- public:
342
- Wrapped_Selector(ParserState pstate, std::string n, Selector_List_Obj sel);
343
- using Simple_Selector::is_superselector_of;
344
- bool is_superselector_of(const Wrapped_Selector* sub) const;
345
- // Selectors inside the negation pseudo-class are counted like any
346
- // other, but the negation itself does not count as a pseudo-class.
347
- size_t hash() const override;
348
- bool has_parent_ref() const override;
244
+ bool empty() const override;
245
+
349
246
  bool has_real_parent_ref() const override;
350
- unsigned long specificity() const override;
351
- int unification_order() const override
352
- {
353
- return Constants::UnificationOrder_Wrapped;
354
- }
355
- bool find ( bool (*f)(AST_Node_Obj) ) override;
356
- bool operator<(const Simple_Selector& rhs) const final override;
357
- bool operator==(const Simple_Selector& rhs) const final override;
358
- bool operator<(const Wrapped_Selector& rhs) const;
359
- bool operator==(const Wrapped_Selector& rhs) const;
247
+
248
+ // Whether this is a pseudo-element selector.
249
+ // This is `true` if and only if [isClass] is `false`.
250
+ bool isElement() const { return !isClass(); }
251
+
252
+ // Whether this is syntactically a pseudo-element selector.
253
+ // This is `true` if and only if [isSyntacticClass] is `false`.
254
+ bool isSyntacticElement() const { return !isSyntacticClass(); }
255
+
256
+ virtual unsigned long specificity() const override;
257
+ PseudoSelectorObj withSelector(SelectorListObj selector);
258
+
259
+ CompoundSelector* unifyWith(CompoundSelector*) override;
260
+ PseudoSelector* getPseudoSelector() final override { return this; }
261
+ bool operator==(const SimpleSelector& rhs) const final override;
262
+ ATTACH_CMP_OPERATIONS(PseudoSelector)
263
+ ATTACH_AST_OPERATIONS(PseudoSelector)
360
264
  void cloneChildren() override;
361
- ATTACH_AST_OPERATIONS(Wrapped_Selector)
362
265
  ATTACH_CRTP_PERFORM_METHODS()
363
266
  };
364
267
 
268
+
365
269
  ////////////////////////////////////////////////////////////////////////////
366
- // Simple selector sequences. Maintains flags indicating whether it contains
367
- // any parent references or placeholders, to simplify expansion.
270
+ // Complex Selectors are the most important class of selectors.
271
+ // A Selector List consists of Complex Selectors (separated by comma)
272
+ // Complex Selectors are itself a list of Compounds and Combinators
273
+ // Between each item there is an implicit ancestor of combinator
368
274
  ////////////////////////////////////////////////////////////////////////////
369
- class Compound_Selector final : public Selector, public Vectorized<Simple_Selector_Obj> {
370
- private:
371
- ComplexSelectorSet sources_;
372
- ADD_PROPERTY(bool, extended);
373
- ADD_PROPERTY(bool, has_parent_reference);
374
- protected:
375
- void adjust_after_pushing(Simple_Selector_Obj s) override
376
- {
377
- // if (s->has_reference()) has_reference(true);
378
- // if (s->has_placeholder()) has_placeholder(true);
379
- }
275
+ class ComplexSelector final : public Selector, public Vectorized<SelectorComponentObj> {
276
+ ADD_PROPERTY(bool, chroots)
277
+ // line break before list separator
278
+ ADD_PROPERTY(bool, hasPreLineFeed)
380
279
  public:
381
- Compound_Selector(ParserState pstate, size_t s = 0);
382
- bool contains_placeholder();
383
- void append(Simple_Selector_Obj element) override;
384
- bool is_universal() const;
385
- Complex_Selector_Obj to_complex();
386
- Compound_Selector* unify_with(Compound_Selector* rhs);
387
- // virtual Placeholder_Selector* find_placeholder();
388
- bool has_parent_ref() const override;
389
- bool has_real_parent_ref() const override;
390
- Simple_Selector* base() const;
391
- bool is_superselector_of(const Compound_Selector* sub, std::string wrapped = "") const;
392
- bool is_superselector_of(const Complex_Selector* sub, std::string wrapped = "") const;
393
- bool is_superselector_of(const Selector_List* sub, std::string wrapped = "") const;
280
+ ComplexSelector(SourceSpan pstate);
281
+
282
+ // Returns true if the first components
283
+ // is a compound selector and fullfills
284
+ // a few other criteria.
285
+ bool isInvisible() const;
286
+
394
287
  size_t hash() const override;
288
+ void cloneChildren() override;
289
+ bool has_placeholder() const;
290
+ bool has_real_parent_ref() const override;
291
+
292
+ SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
395
293
  virtual unsigned long specificity() const override;
396
- virtual bool has_placeholder();
397
- bool is_empty_reference();
398
- int unification_order() const override
399
- {
400
- throw std::runtime_error("unification_order for Compound_Selector is undefined");
401
- }
402
- bool find ( bool (*f)(AST_Node_Obj) ) override;
403
294
 
404
- bool operator<(const Selector& rhs) const override;
295
+ SelectorList* unifyWith(ComplexSelector* rhs);
296
+
297
+ bool isSuperselectorOf(const ComplexSelector* sub) const;
298
+
299
+ SelectorListObj wrapInList();
300
+
301
+ size_t maxSpecificity() const override;
302
+ size_t minSpecificity() const override;
303
+
405
304
  bool operator==(const Selector& rhs) const override;
406
- bool operator<(const Selector_List& rhs) const;
407
- bool operator==(const Selector_List& rhs) const;
408
- bool operator<(const Complex_Selector& rhs) const;
409
- bool operator==(const Complex_Selector& rhs) const;
410
- bool operator<(const Compound_Selector& rhs) const;
411
- bool operator==(const Compound_Selector& rhs) const;
412
- bool operator<(const Simple_Selector& rhs) const;
413
- bool operator==(const Simple_Selector& rhs) const;
414
-
415
- ComplexSelectorSet& sources() { return sources_; }
416
- void clearSources() { sources_.clear(); }
417
- void mergeSources(ComplexSelectorSet& sources);
418
-
419
- Compound_Selector* minus(Compound_Selector* rhs);
420
- void cloneChildren() override;
421
- ATTACH_AST_OPERATIONS(Compound_Selector)
305
+ bool operator==(const SelectorList& rhs) const;
306
+ bool operator==(const CompoundSelector& rhs) const;
307
+ bool operator==(const SimpleSelector& rhs) const;
308
+
309
+ ATTACH_CMP_OPERATIONS(ComplexSelector)
310
+ ATTACH_AST_OPERATIONS(ComplexSelector)
422
311
  ATTACH_CRTP_PERFORM_METHODS()
423
312
  };
424
313
 
425
314
  ////////////////////////////////////////////////////////////////////////////
426
- // General selectors -- i.e., simple sequences combined with one of the four
427
- // CSS selector combinators (">", "+", "~", and whitespace). Essentially a
428
- // linked list.
315
+ // Base class for complex selector components
316
+ ////////////////////////////////////////////////////////////////////////////
317
+ class SelectorComponent : public Selector {
318
+ // line break after list separator
319
+ ADD_PROPERTY(bool, hasPostLineBreak)
320
+ public:
321
+ SelectorComponent(SourceSpan pstate, bool postLineBreak = false);
322
+ size_t hash() const override = 0;
323
+ void cloneChildren() override;
324
+
325
+
326
+ // By default we consider instances not empty
327
+ virtual bool empty() const { return false; }
328
+
329
+ virtual bool has_placeholder() const = 0;
330
+ bool has_real_parent_ref() const override = 0;
331
+
332
+ ComplexSelector* wrapInComplex();
333
+
334
+ size_t maxSpecificity() const override { return 0; }
335
+ size_t minSpecificity() const override { return 0; }
336
+
337
+ virtual bool isCompound() const { return false; };
338
+ virtual bool isCombinator() const { return false; };
339
+
340
+ /* helper function for syntax sugar */
341
+ virtual CompoundSelector* getCompound() { return NULL; }
342
+ virtual SelectorCombinator* getCombinator() { return NULL; }
343
+ virtual const CompoundSelector* getCompound() const { return NULL; }
344
+ virtual const SelectorCombinator* getCombinator() const { return NULL; }
345
+
346
+ virtual unsigned long specificity() const override;
347
+ bool operator==(const Selector& rhs) const override = 0;
348
+ ATTACH_VIRTUAL_CMP_OPERATIONS(SelectorComponent);
349
+ ATTACH_VIRTUAL_AST_OPERATIONS(SelectorComponent);
350
+ };
351
+
352
+ ////////////////////////////////////////////////////////////////////////////
353
+ // A specific combinator between compound selectors
429
354
  ////////////////////////////////////////////////////////////////////////////
430
- class Complex_Selector final : public Selector {
355
+ class SelectorCombinator final : public SelectorComponent {
431
356
  public:
432
- enum Combinator { ANCESTOR_OF, PARENT_OF, PRECEDES, ADJACENT_TO, REFERENCE };
357
+
358
+ // Enumerate all possible selector combinators. There is some
359
+ // discrepancy with dart-sass. Opted to name them as in CSS33
360
+ enum Combinator { CHILD /* > */, GENERAL /* ~ */, ADJACENT /* + */};
361
+
433
362
  private:
363
+
364
+ // Store the type of this combinator
434
365
  HASH_CONSTREF(Combinator, combinator)
435
- HASH_PROPERTY(Compound_Selector_Obj, head)
436
- HASH_PROPERTY(Complex_Selector_Obj, tail)
437
- HASH_PROPERTY(String_Obj, reference);
366
+
438
367
  public:
439
- bool contains_placeholder() {
440
- if (head() && head()->contains_placeholder()) return true;
441
- if (tail() && tail()->contains_placeholder()) return true;
442
- return false;
443
- };
444
- Complex_Selector(ParserState pstate,
445
- Combinator c = ANCESTOR_OF,
446
- Compound_Selector_Obj h = {},
447
- Complex_Selector_Obj t = {},
448
- String_Obj r = {});
368
+ SelectorCombinator(SourceSpan pstate, Combinator combinator, bool postLineBreak = false);
449
369
 
450
- bool empty() const;
370
+ bool has_real_parent_ref() const override { return false; }
371
+ bool has_placeholder() const override { return false; }
451
372
 
452
- bool has_parent_ref() const override;
453
- bool has_real_parent_ref() const override;
454
- Complex_Selector_Obj skip_empty_reference();
373
+ /* helper function for syntax sugar */
374
+ SelectorCombinator* getCombinator() final override { return this; }
375
+ const SelectorCombinator* getCombinator() const final override { return this; }
455
376
 
456
- // can still have a tail
457
- bool is_empty_ancestor() const;
377
+ // Query type of combinator
378
+ bool isCombinator() const override { return true; };
458
379
 
459
- Selector_List* tails(Selector_List* tails);
380
+ // Matches the right-hand selector if it's a direct child of the left-
381
+ // hand selector in the DOM tree. Dart-sass also calls this `child`
382
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Child_combinator
383
+ bool isChildCombinator() const { return combinator_ == CHILD; } // >
460
384
 
461
- // front returns the first real tail
462
- // skips over parent and empty ones
463
- const Complex_Selector* first() const;
464
- Complex_Selector* mutable_first();
385
+ // Matches the right-hand selector if it comes after the left-hand
386
+ // selector in the DOM tree. Dart-sass class this `followingSibling`
387
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_combinator
388
+ bool isGeneralCombinator() const { return combinator_ == GENERAL; } // ~
465
389
 
466
- // last returns the last real tail
467
- const Complex_Selector* last() const;
468
- Complex_Selector* mutable_last();
390
+ // Matches the right-hand selector if it's immediately adjacent to the
391
+ // left-hand selector in the DOM tree. Dart-sass calls this `nextSibling`
392
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
393
+ bool isAdjacentCombinator() const { return combinator_ == ADJACENT; } // +
469
394
 
470
- size_t length() const;
471
- Selector_List* resolve_parent_refs(SelectorStack& pstack, Backtraces& traces, bool implicit_parent = true);
472
- bool is_superselector_of(const Compound_Selector* sub, std::string wrapping = "") const;
473
- bool is_superselector_of(const Complex_Selector* sub, std::string wrapping = "") const;
474
- bool is_superselector_of(const Selector_List* sub, std::string wrapping = "") const;
475
- Selector_List* unify_with(Complex_Selector* rhs);
476
- Combinator clear_innermost();
477
- void append(Complex_Selector_Obj, Backtraces& traces);
478
- void set_innermost(Complex_Selector_Obj, Combinator);
395
+ size_t maxSpecificity() const override { return 0; }
396
+ size_t minSpecificity() const override { return 0; }
479
397
 
480
- size_t hash() const override;
398
+ size_t hash() const override {
399
+ return std::hash<int>()(combinator_);
400
+ }
401
+ void cloneChildren() override;
481
402
  virtual unsigned long specificity() const override;
482
- virtual void set_media_block(Media_Block* mb) override;
483
- virtual bool has_placeholder();
484
- int unification_order() const override
485
- {
486
- throw std::runtime_error("unification_order for Complex_Selector is undefined");
403
+ bool operator==(const Selector& rhs) const override;
404
+ bool operator==(const SelectorComponent& rhs) const override;
405
+
406
+ ATTACH_CMP_OPERATIONS(SelectorCombinator)
407
+ ATTACH_AST_OPERATIONS(SelectorCombinator)
408
+ ATTACH_CRTP_PERFORM_METHODS()
409
+ };
410
+
411
+ ////////////////////////////////////////////////////////////////////////////
412
+ // A compound selector consists of multiple simple selectors
413
+ ////////////////////////////////////////////////////////////////////////////
414
+ class CompoundSelector final : public SelectorComponent, public Vectorized<SimpleSelectorObj> {
415
+ ADD_PROPERTY(bool, hasRealParent)
416
+ ADD_PROPERTY(bool, extended)
417
+ public:
418
+ CompoundSelector(SourceSpan pstate, bool postLineBreak = false);
419
+
420
+ // Returns true if this compound selector
421
+ // fullfills various criteria.
422
+ bool isInvisible() const;
423
+
424
+ bool empty() const override {
425
+ return Vectorized::empty();
487
426
  }
488
- bool find ( bool (*f)(AST_Node_Obj) ) override;
489
427
 
490
- bool operator<(const Selector& rhs) const override;
491
- bool operator==(const Selector& rhs) const override;
492
- bool operator<(const Selector_List& rhs) const;
493
- bool operator==(const Selector_List& rhs) const;
494
- bool operator<(const Complex_Selector& rhs) const;
495
- bool operator==(const Complex_Selector& rhs) const;
496
- bool operator<(const Compound_Selector& rhs) const;
497
- bool operator==(const Compound_Selector& rhs) const;
498
- bool operator<(const Simple_Selector& rhs) const;
499
- bool operator==(const Simple_Selector& rhs) const;
500
-
501
- const ComplexSelectorSet sources();
502
- void addSources(ComplexSelectorSet& sources);
503
- void clearSources();
428
+ size_t hash() const override;
429
+ CompoundSelector* unifyWith(CompoundSelector* rhs);
430
+
431
+ /* helper function for syntax sugar */
432
+ CompoundSelector* getCompound() final override { return this; }
433
+ const CompoundSelector* getCompound() const final override { return this; }
434
+
435
+ bool isSuperselectorOf(const CompoundSelector* sub, sass::string wrapped = "") const;
504
436
 
505
437
  void cloneChildren() override;
506
- ATTACH_AST_OPERATIONS(Complex_Selector)
438
+ bool has_real_parent_ref() const override;
439
+ bool has_placeholder() const override;
440
+ sass::vector<ComplexSelectorObj> resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
441
+
442
+ virtual bool isCompound() const override { return true; };
443
+ virtual unsigned long specificity() const override;
444
+
445
+ size_t maxSpecificity() const override;
446
+ size_t minSpecificity() const override;
447
+
448
+ bool operator==(const Selector& rhs) const override;
449
+
450
+ bool operator==(const SelectorComponent& rhs) const override;
451
+
452
+ bool operator==(const SelectorList& rhs) const;
453
+ bool operator==(const ComplexSelector& rhs) const;
454
+ bool operator==(const SimpleSelector& rhs) const;
455
+
456
+ void sortChildren();
457
+
458
+ ATTACH_CMP_OPERATIONS(CompoundSelector)
459
+ ATTACH_AST_OPERATIONS(CompoundSelector)
507
460
  ATTACH_CRTP_PERFORM_METHODS()
508
461
  };
509
462
 
510
463
  ///////////////////////////////////
511
464
  // Comma-separated selector groups.
512
465
  ///////////////////////////////////
513
- class Selector_List final : public Selector, public Vectorized<Complex_Selector_Obj> {
514
- ADD_PROPERTY(Selector_Schema_Obj, schema)
515
- ADD_CONSTREF(std::vector<std::string>, wspace)
516
- protected:
517
- void adjust_after_pushing(Complex_Selector_Obj c) override;
466
+ class SelectorList final : public Selector, public Vectorized<ComplexSelectorObj> {
467
+ private:
468
+ // maybe we have optional flag
469
+ // ToDo: should be at ExtendRule?
470
+ ADD_PROPERTY(bool, is_optional)
518
471
  public:
519
- Selector_List(ParserState pstate, size_t s = 0);
520
- std::string type() const override { return "list"; }
521
- // remove parent selector references
522
- // basically unwraps parsed selectors
523
- bool has_parent_ref() const override;
524
- bool has_real_parent_ref() const override;
525
- void remove_parent_selectors();
526
- Selector_List* resolve_parent_refs(SelectorStack& pstack, Backtraces& traces, bool implicit_parent = true);
527
- bool is_superselector_of(const Compound_Selector* sub, std::string wrapping = "") const;
528
- bool is_superselector_of(const Complex_Selector* sub, std::string wrapping = "") const;
529
- bool is_superselector_of(const Selector_List* sub, std::string wrapping = "") const;
530
- Selector_List* unify_with(Selector_List*);
531
- void populate_extends(Selector_List_Obj, Subset_Map&);
532
- Selector_List_Obj eval(Eval& eval);
533
-
472
+ SelectorList(SourceSpan pstate, size_t s = 0);
473
+ sass::string type() const override { return "list"; }
534
474
  size_t hash() const override;
475
+
476
+ SelectorList* unifyWith(SelectorList*);
477
+
478
+ // Returns true if all complex selectors
479
+ // can have real parents, meaning every
480
+ // first component does allow for it
481
+ bool isInvisible() const;
482
+
483
+ void cloneChildren() override;
484
+ bool has_real_parent_ref() const override;
485
+ SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
535
486
  virtual unsigned long specificity() const override;
536
- virtual void set_media_block(Media_Block* mb) override;
537
- virtual bool has_placeholder();
538
- int unification_order() const override
539
- {
540
- throw std::runtime_error("unification_order for Selector_List is undefined");
541
- }
542
- bool find ( bool (*f)(AST_Node_Obj) ) override;
543
- bool operator<(const Selector& rhs) const override;
487
+
488
+ bool isSuperselectorOf(const SelectorList* sub) const;
489
+
490
+ size_t maxSpecificity() const override;
491
+ size_t minSpecificity() const override;
492
+
544
493
  bool operator==(const Selector& rhs) const override;
545
- bool operator<(const Selector_List& rhs) const;
546
- bool operator==(const Selector_List& rhs) const;
547
- bool operator<(const Complex_Selector& rhs) const;
548
- bool operator==(const Complex_Selector& rhs) const;
549
- bool operator<(const Compound_Selector& rhs) const;
550
- bool operator==(const Compound_Selector& rhs) const;
551
- bool operator<(const Simple_Selector& rhs) const;
552
- bool operator==(const Simple_Selector& rhs) const;
494
+ bool operator==(const ComplexSelector& rhs) const;
495
+ bool operator==(const CompoundSelector& rhs) const;
496
+ bool operator==(const SimpleSelector& rhs) const;
553
497
  // Selector Lists can be compared to comma lists
554
- bool operator<(const Expression& rhs) const override;
555
498
  bool operator==(const Expression& rhs) const override;
556
- void cloneChildren() override;
557
- ATTACH_AST_OPERATIONS(Selector_List)
499
+
500
+ ATTACH_CMP_OPERATIONS(SelectorList)
501
+ ATTACH_AST_OPERATIONS(SelectorList)
558
502
  ATTACH_CRTP_PERFORM_METHODS()
559
503
  };
560
504
 
561
- // compare function for sorting and probably other other uses
562
- struct cmp_complex_selector { inline bool operator() (const Complex_Selector_Obj l, const Complex_Selector_Obj r) { return (*l < *r); } };
563
- struct cmp_compound_selector { inline bool operator() (const Compound_Selector_Obj l, const Compound_Selector_Obj r) { return (*l < *r); } };
564
- struct cmp_simple_selector { inline bool operator() (const Simple_Selector_Obj l, const Simple_Selector_Obj r) { return (*l < *r); } };
505
+ ////////////////////////////////
506
+ // The Sass `@extend` directive.
507
+ ////////////////////////////////
508
+ class ExtendRule final : public Statement {
509
+ ADD_PROPERTY(bool, isOptional)
510
+ // This should be a simple selector only!
511
+ ADD_PROPERTY(SelectorListObj, selector)
512
+ ADD_PROPERTY(Selector_Schema_Obj, schema)
513
+ public:
514
+ ExtendRule(SourceSpan pstate, SelectorListObj s);
515
+ ExtendRule(SourceSpan pstate, Selector_Schema_Obj s);
516
+ ATTACH_AST_OPERATIONS(ExtendRule)
517
+ ATTACH_CRTP_PERFORM_METHODS()
518
+ };
565
519
 
566
520
  }
567
521