sassc4 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. metadata +396 -0
@@ -0,0 +1,523 @@
1
+ #ifndef SASS_AST_SEL_H
2
+ #define SASS_AST_SEL_H
3
+
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+ #include "ast.hpp"
8
+
9
+ namespace Sass {
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
+
38
+ /////////////////////////////////////////
39
+ // Abstract base class for CSS selectors.
40
+ /////////////////////////////////////////
41
+ class Selector : public Expression {
42
+ protected:
43
+ mutable size_t hash_;
44
+ public:
45
+ Selector(SourceSpan pstate);
46
+ virtual ~Selector() = 0;
47
+ size_t hash() const override = 0;
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(); }
55
+ // dispatch to correct handlers
56
+ ATTACH_VIRTUAL_CMP_OPERATIONS(Selector)
57
+ ATTACH_VIRTUAL_AST_OPERATIONS(Selector)
58
+ };
59
+ inline Selector::~Selector() { }
60
+
61
+ /////////////////////////////////////////////////////////////////////////
62
+ // Interpolated selectors -- the interpolated String will be expanded and
63
+ // re-parsed into a normal selector class.
64
+ /////////////////////////////////////////////////////////////////////////
65
+ class Selector_Schema final : public AST_Node {
66
+ ADD_PROPERTY(String_Schema_Obj, contents)
67
+ ADD_PROPERTY(bool, connect_parent);
68
+ // store computed hash
69
+ mutable size_t hash_;
70
+ public:
71
+ Selector_Schema(SourceSpan pstate, String_Obj c);
72
+
73
+ bool has_real_parent_ref() const;
74
+ // selector schema is not yet a final selector, so we do not
75
+ // have a specificity for it yet. We need to
76
+ virtual unsigned long specificity() const;
77
+ size_t hash() const override;
78
+ ATTACH_AST_OPERATIONS(Selector_Schema)
79
+ ATTACH_CRTP_PERFORM_METHODS()
80
+ };
81
+
82
+ ////////////////////////////////////////////
83
+ // Abstract base class for simple selectors.
84
+ ////////////////////////////////////////////
85
+ class SimpleSelector : public Selector {
86
+ public:
87
+ enum Simple_Type {
88
+ ID_SEL,
89
+ TYPE_SEL,
90
+ CLASS_SEL,
91
+ PSEUDO_SEL,
92
+ ATTRIBUTE_SEL,
93
+ PLACEHOLDER_SEL,
94
+ };
95
+ public:
96
+ HASH_CONSTREF(sass::string, ns)
97
+ HASH_CONSTREF(sass::string, name)
98
+ ADD_PROPERTY(Simple_Type, simple_type)
99
+ HASH_PROPERTY(bool, has_ns)
100
+ public:
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;
105
+ size_t hash() const override;
106
+ virtual bool empty() const;
107
+ // namespace compare functions
108
+ bool is_ns_eq(const SimpleSelector& r) const;
109
+ // namespace query functions
110
+ bool is_universal_ns() const;
111
+ bool is_empty_ns() const;
112
+ bool has_empty_ns() const;
113
+ bool has_qualified_ns() const;
114
+ // name query functions
115
+ bool is_universal() const;
116
+ virtual bool has_placeholder();
117
+
118
+ virtual ~SimpleSelector() = 0;
119
+ virtual CompoundSelector* unifyWith(CompoundSelector*);
120
+
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; }
130
+ virtual bool is_pseudo_element() const;
131
+ virtual bool has_real_parent_ref() const override;
132
+
133
+ bool operator==(const Selector& rhs) const final override;
134
+
135
+ virtual bool operator==(const SelectorList& rhs) const;
136
+ virtual bool operator==(const ComplexSelector& rhs) const;
137
+ virtual bool operator==(const CompoundSelector& rhs) const;
138
+
139
+ ATTACH_VIRTUAL_CMP_OPERATIONS(SimpleSelector);
140
+ ATTACH_VIRTUAL_AST_OPERATIONS(SimpleSelector);
141
+ ATTACH_CRTP_PERFORM_METHODS();
142
+
143
+ };
144
+ inline SimpleSelector::~SimpleSelector() { }
145
+
146
+ /////////////////////////////////////////////////////////////////////////
147
+ // Placeholder selectors (e.g., "%foo") for use in extend-only selectors.
148
+ /////////////////////////////////////////////////////////////////////////
149
+ class PlaceholderSelector final : public SimpleSelector {
150
+ public:
151
+ PlaceholderSelector(SourceSpan pstate, sass::string n);
152
+ int getSortOrder() const override final { return 0; }
153
+ bool isInvisible() const override { return true; }
154
+ virtual unsigned long specificity() const override;
155
+ virtual bool has_placeholder() override;
156
+ bool operator==(const SimpleSelector& rhs) const override;
157
+ ATTACH_CMP_OPERATIONS(PlaceholderSelector)
158
+ ATTACH_AST_OPERATIONS(PlaceholderSelector)
159
+ ATTACH_CRTP_PERFORM_METHODS()
160
+ };
161
+
162
+ /////////////////////////////////////////////////////////////////////
163
+ // Type selectors (and the universal selector) -- e.g., div, span, *.
164
+ /////////////////////////////////////////////////////////////////////
165
+ class TypeSelector final : public SimpleSelector {
166
+ public:
167
+ TypeSelector(SourceSpan pstate, sass::string n);
168
+ int getSortOrder() const override final { return 1; }
169
+ virtual unsigned long specificity() const override;
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)
176
+ ATTACH_CRTP_PERFORM_METHODS()
177
+ };
178
+
179
+ ////////////////////////////////////////////////
180
+ // Class selectors -- i.e., .foo.
181
+ ////////////////////////////////////////////////
182
+ class ClassSelector final : public SimpleSelector {
183
+ public:
184
+ ClassSelector(SourceSpan pstate, sass::string n);
185
+ int getSortOrder() const override final { return 2; }
186
+ virtual unsigned long specificity() const override;
187
+ bool operator==(const SimpleSelector& rhs) const final override;
188
+ ATTACH_CMP_OPERATIONS(ClassSelector)
189
+ ATTACH_AST_OPERATIONS(ClassSelector)
190
+ ATTACH_CRTP_PERFORM_METHODS()
191
+ };
192
+
193
+ ////////////////////////////////////////////////
194
+ // ID selectors -- i.e., #foo.
195
+ ////////////////////////////////////////////////
196
+ class IDSelector final : public SimpleSelector {
197
+ public:
198
+ IDSelector(SourceSpan pstate, sass::string n);
199
+ int getSortOrder() const override final { return 2; }
200
+ virtual unsigned long specificity() const override;
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)
206
+ ATTACH_CRTP_PERFORM_METHODS()
207
+ };
208
+
209
+ ///////////////////////////////////////////////////
210
+ // Attribute selectors -- e.g., [src*=".jpg"], etc.
211
+ ///////////////////////////////////////////////////
212
+ class AttributeSelector final : public SimpleSelector {
213
+ ADD_CONSTREF(sass::string, matcher)
214
+ // this cannot be changed to obj atm!!!!!!????!!!!!!!
215
+ ADD_PROPERTY(String_Obj, value) // might be interpolated
216
+ ADD_PROPERTY(char, modifier);
217
+ public:
218
+ AttributeSelector(SourceSpan pstate, sass::string n, sass::string m, String_Obj v, char o = 0);
219
+ int getSortOrder() const override final { return 2; }
220
+ size_t hash() const override;
221
+ virtual unsigned long specificity() const override;
222
+ bool operator==(const SimpleSelector& rhs) const final override;
223
+ ATTACH_CMP_OPERATIONS(AttributeSelector)
224
+ ATTACH_AST_OPERATIONS(AttributeSelector)
225
+ ATTACH_CRTP_PERFORM_METHODS()
226
+ };
227
+
228
+ //////////////////////////////////////////////////////////////////
229
+ // Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc.
230
+ //////////////////////////////////////////////////////////////////
231
+ // Pseudo Selector cannot have any namespace?
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)
238
+ public:
239
+ PseudoSelector(SourceSpan pstate, sass::string n, bool element = false);
240
+ int getSortOrder() const override final { return 3; }
241
+ virtual bool is_pseudo_element() const override;
242
+ size_t hash() const override;
243
+
244
+ bool empty() const override;
245
+
246
+ bool has_real_parent_ref() const override;
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)
264
+ void cloneChildren() override;
265
+ ATTACH_CRTP_PERFORM_METHODS()
266
+ };
267
+
268
+
269
+ ////////////////////////////////////////////////////////////////////////////
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
274
+ ////////////////////////////////////////////////////////////////////////////
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);
279
+ public:
280
+ ComplexSelector(SourceSpan pstate);
281
+
282
+ // Returns true if the first components
283
+ // is a compound selector and fulfills
284
+ // a few other criteria.
285
+ bool isInvisible() const;
286
+ bool isInvalidCss() const;
287
+
288
+ size_t hash() const override;
289
+ void cloneChildren() override;
290
+ bool has_placeholder() const;
291
+ bool has_real_parent_ref() const override;
292
+
293
+ SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
294
+ virtual unsigned long specificity() const override;
295
+
296
+ SelectorList* unifyWith(ComplexSelector* rhs);
297
+
298
+ bool isSuperselectorOf(const ComplexSelector* sub) const;
299
+
300
+ SelectorListObj wrapInList();
301
+
302
+ size_t maxSpecificity() const override;
303
+ size_t minSpecificity() const override;
304
+
305
+ bool operator==(const Selector& rhs) const override;
306
+ bool operator==(const SelectorList& rhs) const;
307
+ bool operator==(const CompoundSelector& rhs) const;
308
+ bool operator==(const SimpleSelector& rhs) const;
309
+
310
+ ATTACH_CMP_OPERATIONS(ComplexSelector)
311
+ ATTACH_AST_OPERATIONS(ComplexSelector)
312
+ ATTACH_CRTP_PERFORM_METHODS()
313
+ };
314
+
315
+ ////////////////////////////////////////////////////////////////////////////
316
+ // Base class for complex selector components
317
+ ////////////////////////////////////////////////////////////////////////////
318
+ class SelectorComponent : public Selector {
319
+ // line break after list separator
320
+ ADD_PROPERTY(bool, hasPostLineBreak)
321
+ public:
322
+ SelectorComponent(SourceSpan pstate, bool postLineBreak = false);
323
+ size_t hash() const override = 0;
324
+ void cloneChildren() override;
325
+
326
+
327
+ // By default we consider instances not empty
328
+ virtual bool empty() const { return false; }
329
+
330
+ virtual bool has_placeholder() const = 0;
331
+ bool has_real_parent_ref() const override = 0;
332
+
333
+ ComplexSelector* wrapInComplex();
334
+
335
+ size_t maxSpecificity() const override { return 0; }
336
+ size_t minSpecificity() const override { return 0; }
337
+
338
+ virtual bool isCompound() const { return false; };
339
+ virtual bool isCombinator() const { return false; };
340
+
341
+ /* helper function for syntax sugar */
342
+ virtual CompoundSelector* getCompound() { return NULL; }
343
+ virtual SelectorCombinator* getCombinator() { return NULL; }
344
+ virtual const CompoundSelector* getCompound() const { return NULL; }
345
+ virtual const SelectorCombinator* getCombinator() const { return NULL; }
346
+
347
+ virtual unsigned long specificity() const override;
348
+ bool operator==(const Selector& rhs) const override = 0;
349
+ ATTACH_VIRTUAL_CMP_OPERATIONS(SelectorComponent);
350
+ ATTACH_VIRTUAL_AST_OPERATIONS(SelectorComponent);
351
+ };
352
+
353
+ ////////////////////////////////////////////////////////////////////////////
354
+ // A specific combinator between compound selectors
355
+ ////////////////////////////////////////////////////////////////////////////
356
+ class SelectorCombinator final : public SelectorComponent {
357
+ public:
358
+
359
+ // Enumerate all possible selector combinators. There is some
360
+ // discrepancy with dart-sass. Opted to name them as in CSS33
361
+ enum Combinator { CHILD /* > */, GENERAL /* ~ */, ADJACENT /* + */};
362
+
363
+ private:
364
+
365
+ // Store the type of this combinator
366
+ HASH_CONSTREF(Combinator, combinator)
367
+
368
+ public:
369
+ SelectorCombinator(SourceSpan pstate, Combinator combinator, bool postLineBreak = false);
370
+
371
+ bool has_real_parent_ref() const override { return false; }
372
+ bool has_placeholder() const override { return false; }
373
+
374
+ /* helper function for syntax sugar */
375
+ SelectorCombinator* getCombinator() final override { return this; }
376
+ const SelectorCombinator* getCombinator() const final override { return this; }
377
+
378
+ // Query type of combinator
379
+ bool isCombinator() const override { return true; };
380
+
381
+ // Matches the right-hand selector if it's a direct child of the left-
382
+ // hand selector in the DOM tree. Dart-sass also calls this `child`
383
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Child_combinator
384
+ bool isChildCombinator() const { return combinator_ == CHILD; } // >
385
+
386
+ // Matches the right-hand selector if it comes after the left-hand
387
+ // selector in the DOM tree. Dart-sass class this `followingSibling`
388
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_combinator
389
+ bool isGeneralCombinator() const { return combinator_ == GENERAL; } // ~
390
+
391
+ // Matches the right-hand selector if it's immediately adjacent to the
392
+ // left-hand selector in the DOM tree. Dart-sass calls this `nextSibling`
393
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
394
+ bool isAdjacentCombinator() const { return combinator_ == ADJACENT; } // +
395
+
396
+ size_t maxSpecificity() const override { return 0; }
397
+ size_t minSpecificity() const override { return 0; }
398
+
399
+ size_t hash() const override {
400
+ return std::hash<int>()(combinator_);
401
+ }
402
+ void cloneChildren() override;
403
+ virtual unsigned long specificity() const override;
404
+ bool operator==(const Selector& rhs) const override;
405
+ bool operator==(const SelectorComponent& rhs) const override;
406
+
407
+ ATTACH_CMP_OPERATIONS(SelectorCombinator)
408
+ ATTACH_AST_OPERATIONS(SelectorCombinator)
409
+ ATTACH_CRTP_PERFORM_METHODS()
410
+ };
411
+
412
+ ////////////////////////////////////////////////////////////////////////////
413
+ // A compound selector consists of multiple simple selectors
414
+ ////////////////////////////////////////////////////////////////////////////
415
+ class CompoundSelector final : public SelectorComponent, public Vectorized<SimpleSelectorObj> {
416
+ ADD_PROPERTY(bool, hasRealParent)
417
+ public:
418
+ CompoundSelector(SourceSpan pstate, bool postLineBreak = false);
419
+
420
+ // Returns true if this compound selector
421
+ // fulfills various criteria.
422
+ bool isInvisible() const;
423
+
424
+ bool empty() const override {
425
+ return Vectorized::empty();
426
+ }
427
+
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;
436
+
437
+ void cloneChildren() override;
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
+ bool isInvalidCss() const;
458
+
459
+ ATTACH_CMP_OPERATIONS(CompoundSelector)
460
+ ATTACH_AST_OPERATIONS(CompoundSelector)
461
+ ATTACH_CRTP_PERFORM_METHODS()
462
+ };
463
+
464
+ ///////////////////////////////////
465
+ // Comma-separated selector groups.
466
+ ///////////////////////////////////
467
+ class SelectorList final : public Selector, public Vectorized<ComplexSelectorObj> {
468
+ private:
469
+ // maybe we have optional flag
470
+ // ToDo: should be at ExtendRule?
471
+ ADD_PROPERTY(bool, is_optional)
472
+ public:
473
+ SelectorList(SourceSpan pstate, size_t s = 0);
474
+ sass::string type() const override { return "list"; }
475
+ size_t hash() const override;
476
+
477
+ SelectorList* unifyWith(SelectorList*);
478
+
479
+ // Returns true if all complex selectors
480
+ // can have real parents, meaning every
481
+ // first component does allow for it
482
+ bool isInvisible() const;
483
+
484
+ void cloneChildren() override;
485
+ bool has_real_parent_ref() const override;
486
+ SelectorList* resolve_parent_refs(SelectorStack pstack, Backtraces& traces, bool implicit_parent = true);
487
+ virtual unsigned long specificity() const override;
488
+
489
+ bool isSuperselectorOf(const SelectorList* sub) const;
490
+
491
+ size_t maxSpecificity() const override;
492
+ size_t minSpecificity() const override;
493
+
494
+ bool operator==(const Selector& rhs) const override;
495
+ bool operator==(const ComplexSelector& rhs) const;
496
+ bool operator==(const CompoundSelector& rhs) const;
497
+ bool operator==(const SimpleSelector& rhs) const;
498
+ // Selector Lists can be compared to comma lists
499
+ bool operator==(const Expression& rhs) const override;
500
+
501
+ ATTACH_CMP_OPERATIONS(SelectorList)
502
+ ATTACH_AST_OPERATIONS(SelectorList)
503
+ ATTACH_CRTP_PERFORM_METHODS()
504
+ };
505
+
506
+ ////////////////////////////////
507
+ // The Sass `@extend` directive.
508
+ ////////////////////////////////
509
+ class ExtendRule final : public Statement {
510
+ ADD_PROPERTY(bool, isOptional)
511
+ // This should be a simple selector only!
512
+ ADD_PROPERTY(SelectorListObj, selector)
513
+ ADD_PROPERTY(Selector_Schema_Obj, schema)
514
+ public:
515
+ ExtendRule(SourceSpan pstate, SelectorListObj s);
516
+ ExtendRule(SourceSpan pstate, Selector_Schema_Obj s);
517
+ ATTACH_AST_OPERATIONS(ExtendRule)
518
+ ATTACH_CRTP_PERFORM_METHODS()
519
+ };
520
+
521
+ }
522
+
523
+ #endif
@@ -0,0 +1,114 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+ #include "ast.hpp"
5
+
6
+
7
+ namespace Sass {
8
+
9
+ /////////////////////////////////////////////////////////////////////////
10
+ /////////////////////////////////////////////////////////////////////////
11
+
12
+ SupportsRule::SupportsRule(SourceSpan pstate, SupportsConditionObj condition, Block_Obj block)
13
+ : ParentStatement(pstate, block), condition_(condition)
14
+ { statement_type(SUPPORTS); }
15
+ SupportsRule::SupportsRule(const SupportsRule* ptr)
16
+ : ParentStatement(ptr), condition_(ptr->condition_)
17
+ { statement_type(SUPPORTS); }
18
+ bool SupportsRule::bubbles() { return true; }
19
+
20
+ /////////////////////////////////////////////////////////////////////////
21
+ /////////////////////////////////////////////////////////////////////////
22
+
23
+ SupportsCondition::SupportsCondition(SourceSpan pstate)
24
+ : Expression(pstate)
25
+ { }
26
+
27
+ SupportsCondition::SupportsCondition(const SupportsCondition* ptr)
28
+ : Expression(ptr)
29
+ { }
30
+
31
+ /////////////////////////////////////////////////////////////////////////
32
+ /////////////////////////////////////////////////////////////////////////
33
+
34
+ SupportsOperation::SupportsOperation(SourceSpan pstate, SupportsConditionObj l, SupportsConditionObj r, Operand o)
35
+ : SupportsCondition(pstate), left_(l), right_(r), operand_(o)
36
+ { }
37
+ SupportsOperation::SupportsOperation(const SupportsOperation* ptr)
38
+ : SupportsCondition(ptr),
39
+ left_(ptr->left_),
40
+ right_(ptr->right_),
41
+ operand_(ptr->operand_)
42
+ { }
43
+
44
+ bool SupportsOperation::needs_parens(SupportsConditionObj cond) const
45
+ {
46
+ if (SupportsOperationObj op = Cast<SupportsOperation>(cond)) {
47
+ return op->operand() != operand();
48
+ }
49
+ return Cast<SupportsNegation>(cond) != NULL;
50
+ }
51
+
52
+ /////////////////////////////////////////////////////////////////////////
53
+ /////////////////////////////////////////////////////////////////////////
54
+
55
+ SupportsNegation::SupportsNegation(SourceSpan pstate, SupportsConditionObj c)
56
+ : SupportsCondition(pstate), condition_(c)
57
+ { }
58
+ SupportsNegation::SupportsNegation(const SupportsNegation* ptr)
59
+ : SupportsCondition(ptr), condition_(ptr->condition_)
60
+ { }
61
+
62
+ bool SupportsNegation::needs_parens(SupportsConditionObj cond) const
63
+ {
64
+ return Cast<SupportsNegation>(cond) ||
65
+ Cast<SupportsOperation>(cond);
66
+ }
67
+
68
+ /////////////////////////////////////////////////////////////////////////
69
+ /////////////////////////////////////////////////////////////////////////
70
+
71
+ SupportsDeclaration::SupportsDeclaration(SourceSpan pstate, ExpressionObj f, ExpressionObj v)
72
+ : SupportsCondition(pstate), feature_(f), value_(v)
73
+ { }
74
+ SupportsDeclaration::SupportsDeclaration(const SupportsDeclaration* ptr)
75
+ : SupportsCondition(ptr),
76
+ feature_(ptr->feature_),
77
+ value_(ptr->value_)
78
+ { }
79
+
80
+ bool SupportsDeclaration::needs_parens(SupportsConditionObj cond) const
81
+ {
82
+ return false;
83
+ }
84
+
85
+ /////////////////////////////////////////////////////////////////////////
86
+ /////////////////////////////////////////////////////////////////////////
87
+
88
+ Supports_Interpolation::Supports_Interpolation(SourceSpan pstate, ExpressionObj v)
89
+ : SupportsCondition(pstate), value_(v)
90
+ { }
91
+ Supports_Interpolation::Supports_Interpolation(const Supports_Interpolation* ptr)
92
+ : SupportsCondition(ptr),
93
+ value_(ptr->value_)
94
+ { }
95
+
96
+ bool Supports_Interpolation::needs_parens(SupportsConditionObj cond) const
97
+ {
98
+ return false;
99
+ }
100
+
101
+ /////////////////////////////////////////////////////////////////////////
102
+ /////////////////////////////////////////////////////////////////////////
103
+
104
+ IMPLEMENT_AST_OPERATORS(SupportsRule);
105
+ IMPLEMENT_AST_OPERATORS(SupportsCondition);
106
+ IMPLEMENT_AST_OPERATORS(SupportsOperation);
107
+ IMPLEMENT_AST_OPERATORS(SupportsNegation);
108
+ IMPLEMENT_AST_OPERATORS(SupportsDeclaration);
109
+ IMPLEMENT_AST_OPERATORS(Supports_Interpolation);
110
+
111
+ /////////////////////////////////////////////////////////////////////////
112
+ /////////////////////////////////////////////////////////////////////////
113
+
114
+ }