sassc 2.1.0.pre3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +2 -4
  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.hpp +12 -0
  81. data/ext/libsass/src/memory/allocator.cpp +48 -0
  82. data/ext/libsass/src/memory/allocator.hpp +138 -0
  83. data/ext/libsass/src/memory/config.hpp +20 -0
  84. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  85. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  86. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  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 +11 -13
  132. data/lib/sassc/native.rb +9 -7
  133. data/lib/sassc/script.rb +4 -6
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +38 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +31 -18
  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