1 #ifndef SASS_AST_FWD_DECL_H
2 #define SASS_AST_FWD_DECL_H
11 #include <unordered_map>
12 #include <unordered_set>
13 #include "memory/SharedPtr.hpp"
15 /////////////////////////////////////////////
16 // Forward declarations for the AST visitors.
17 /////////////////////////////////////////////
21 typedef AST_Node* AST_Node_Ptr;
22 typedef AST_Node const* AST_Node_Ptr_Const;
25 typedef Has_Block* Has_Block_Ptr;
26 typedef Has_Block const* Has_Block_Ptr_Const;
28 class Simple_Selector;
29 typedef Simple_Selector* Simple_Selector_Ptr;
30 typedef Simple_Selector const* Simple_Selector_Ptr_Const;
33 typedef PreValue* PreValue_Ptr;
34 typedef PreValue const* PreValue_Ptr_Const;
36 typedef Thunk* Thunk_Ptr;
37 typedef Thunk const* Thunk_Ptr_Const;
39 typedef Block* Block_Ptr;
40 typedef Block const* Block_Ptr_Const;
42 typedef Expression* Expression_Ptr;
43 typedef Expression const* Expression_Ptr_Const;
45 typedef Statement* Statement_Ptr;
46 typedef Statement const* Statement_Ptr_Const;
48 typedef Value* Value_Ptr;
49 typedef Value const* Value_Ptr_Const;
51 typedef Declaration* Declaration_Ptr;
52 typedef Declaration const* Declaration_Ptr_Const;
54 typedef Ruleset* Ruleset_Ptr;
55 typedef Ruleset const* Ruleset_Ptr_Const;
57 typedef Bubble* Bubble_Ptr;
58 typedef Bubble const* Bubble_Ptr_Const;
60 typedef Trace* Trace_Ptr;
61 typedef Trace const* Trace_Ptr_Const;
64 typedef Media_Block* Media_Block_Ptr;
65 typedef Media_Block const* Media_Block_Ptr_Const;
67 typedef Supports_Block* Supports_Block_Ptr;
68 typedef Supports_Block const* Supports_Block_Ptr_Const;
70 typedef Directive* Directive_Ptr;
71 typedef Directive const* Directive_Ptr_Const;
75 typedef Keyframe_Rule* Keyframe_Rule_Ptr;
76 typedef Keyframe_Rule const* Keyframe_Rule_Ptr_Const;
78 typedef At_Root_Block* At_Root_Block_Ptr;
79 typedef At_Root_Block const* At_Root_Block_Ptr_Const;
81 typedef Assignment* Assignment_Ptr;
82 typedef Assignment const* Assignment_Ptr_Const;
85 typedef Import* Import_Ptr;
86 typedef Import const* Import_Ptr_Const;
88 typedef Import_Stub* Import_Stub_Ptr;
89 typedef Import_Stub const* Import_Stub_Ptr_Const;
91 typedef Warning* Warning_Ptr;
92 typedef Warning const* Warning_Ptr_Const;
95 typedef Error* Error_Ptr;
96 typedef Error const* Error_Ptr_Const;
98 typedef Debug* Debug_Ptr;
99 typedef Debug const* Debug_Ptr_Const;
101 typedef Comment* Comment_Ptr;
102 typedef Comment const* Comment_Ptr_Const;
106 typedef If const* If_Ptr_Const;
108 typedef For* For_Ptr;
109 typedef For const* For_Ptr_Const;
111 typedef Each* Each_Ptr;
112 typedef Each const* Each_Ptr_Const;
114 typedef While* While_Ptr;
115 typedef While const* While_Ptr_Const;
117 typedef Return* Return_Ptr;
118 typedef Return const* Return_Ptr_Const;
120 typedef Content* Content_Ptr;
121 typedef Content const* Content_Ptr_Const;
123 typedef Extension* Extension_Ptr;
124 typedef Extension const* Extension_Ptr_Const;
126 typedef Definition* Definition_Ptr;
127 typedef Definition const* Definition_Ptr_Const;
130 typedef List* List_Ptr;
131 typedef List const* List_Ptr_Const;
133 typedef Map* Map_Ptr;
134 typedef Map const* Map_Ptr_Const;
137 typedef Mixin_Call* Mixin_Call_Ptr;
138 typedef Mixin_Call const* Mixin_Call_Ptr_Const;
139 class Binary_Expression;
140 typedef Binary_Expression* Binary_Expression_Ptr;
141 typedef Binary_Expression const* Binary_Expression_Ptr_Const;
142 class Unary_Expression;
143 typedef Unary_Expression* Unary_Expression_Ptr;
144 typedef Unary_Expression const* Unary_Expression_Ptr_Const;
146 typedef Function_Call* Function_Call_Ptr;
147 typedef Function_Call const* Function_Call_Ptr_Const;
148 class Function_Call_Schema;
149 typedef Function_Call_Schema* Function_Call_Schema_Ptr;
150 typedef Function_Call_Schema const* Function_Call_Schema_Ptr_Const;
151 class Custom_Warning;
152 typedef Custom_Warning* Custom_Warning_Ptr;
153 typedef Custom_Warning const* Custom_Warning_Ptr_Const;
155 typedef Custom_Error* Custom_Error_Ptr;
156 typedef Custom_Error const* Custom_Error_Ptr_Const;
159 typedef Variable* Variable_Ptr;
160 typedef Variable const* Variable_Ptr_Const;
162 typedef Textual* Textual_Ptr;
163 typedef Textual const* Textual_Ptr_Const;
165 typedef Number* Number_Ptr;
166 typedef Number const* Number_Ptr_Const;
168 typedef Color* Color_Ptr;
169 typedef Color const* Color_Ptr_Const;
171 typedef Boolean* Boolean_Ptr;
172 typedef Boolean const* Boolean_Ptr_Const;
174 typedef String* String_Ptr;
175 typedef String const* String_Ptr_Const;
178 typedef String_Schema* String_Schema_Ptr;
179 typedef String_Schema const* String_Schema_Ptr_Const;
180 class String_Constant;
181 typedef String_Constant* String_Constant_Ptr;
182 typedef String_Constant const* String_Constant_Ptr_Const;
184 typedef String_Quoted* String_Quoted_Ptr;
185 typedef String_Quoted const* String_Quoted_Ptr_Const;
188 typedef Media_Query* Media_Query_Ptr;
189 typedef Media_Query const* Media_Query_Ptr_Const;
190 class Media_Query_Expression;
191 typedef Media_Query_Expression* Media_Query_Expression_Ptr;
192 typedef Media_Query_Expression const* Media_Query_Expression_Ptr_Const;
193 class Supports_Condition;
194 typedef Supports_Condition* Supports_Condition_Ptr;
195 typedef Supports_Condition const* Supports_Condition_Ptr_Const;
196 class Supports_Operator;
197 typedef Supports_Operator* Supports_Operator_Ptr;
198 typedef Supports_Operator const* Supports_Operator_Ptr_Const;
199 class Supports_Negation;
200 typedef Supports_Negation* Supports_Negation_Ptr;
201 typedef Supports_Negation const* Supports_Negation_Ptr_Const;
202 class Supports_Declaration;
203 typedef Supports_Declaration* Supports_Declaration_Ptr;
204 typedef Supports_Declaration const* Supports_Declaration_Ptr_Const;
205 class Supports_Interpolation;
206 typedef Supports_Interpolation* Supports_Interpolation_Ptr;
207 typedef Supports_Interpolation const* Supports_Interpolation_Ptr_Const;
211 typedef Null* Null_Ptr;
212 typedef Null const* Null_Ptr_Const;
215 typedef At_Root_Query* At_Root_Query_Ptr;
216 typedef At_Root_Query const* At_Root_Query_Ptr_Const;
217 class Parent_Selector;
218 typedef Parent_Selector* Parent_Selector_Ptr;
219 typedef Parent_Selector const* Parent_Selector_Ptr_Const;
221 typedef Parameter* Parameter_Ptr;
222 typedef Parameter const* Parameter_Ptr_Const;
224 typedef Parameters* Parameters_Ptr;
225 typedef Parameters const* Parameters_Ptr_Const;
227 typedef Argument* Argument_Ptr;
228 typedef Argument const* Argument_Ptr_Const;
230 typedef Arguments* Arguments_Ptr;
231 typedef Arguments const* Arguments_Ptr_Const;
233 typedef Selector* Selector_Ptr;
234 typedef Selector const* Selector_Ptr_Const;
237 class Selector_Schema;
238 typedef Selector_Schema* Selector_Schema_Ptr;
239 typedef Selector_Schema const* Selector_Schema_Ptr_Const;
240 class Placeholder_Selector;
241 typedef Placeholder_Selector* Placeholder_Selector_Ptr;
242 typedef Placeholder_Selector const* Placeholder_Selector_Ptr_Const;
243 class Element_Selector;
244 typedef Element_Selector* Element_Selector_Ptr;
245 typedef Element_Selector const* Element_Selector_Ptr_Const;
246 class Class_Selector;
247 typedef Class_Selector* Class_Selector_Ptr;
248 typedef Class_Selector const* Class_Selector_Ptr_Const;
250 typedef Id_Selector* Id_Selector_Ptr;
251 typedef Id_Selector const* Id_Selector_Ptr_Const;
252 class Attribute_Selector;
253 typedef Attribute_Selector* Attribute_Selector_Ptr;
254 typedef Attribute_Selector const* Attribute_Selector_Ptr_Const;
256 class Pseudo_Selector;
257 typedef Pseudo_Selector* Pseudo_Selector_Ptr;
258 typedef Pseudo_Selector const * Pseudo_Selector_Ptr_Const;
259 class Wrapped_Selector;
260 typedef Wrapped_Selector* Wrapped_Selector_Ptr;
261 typedef Wrapped_Selector const * Wrapped_Selector_Ptr_Const;
262 class Compound_Selector;
263 typedef Compound_Selector* Compound_Selector_Ptr;
264 typedef Compound_Selector const * Compound_Selector_Ptr_Const;
265 class Complex_Selector;
266 typedef Complex_Selector* Complex_Selector_Ptr;
267 typedef Complex_Selector const * Complex_Selector_Ptr_Const;
269 typedef Selector_List* Selector_List_Ptr;
270 typedef Selector_List const * Selector_List_Ptr_Const;
278 // declare classes that are instances of memory nodes
279 // #define IMPL_MEM_OBJ(type) using type##_Obj = SharedImpl<type>
280 #define IMPL_MEM_OBJ(type) typedef SharedImpl<type> type##_Obj
282 IMPL_MEM_OBJ(AST_Node);
283 IMPL_MEM_OBJ(Statement);
285 IMPL_MEM_OBJ(Ruleset);
286 IMPL_MEM_OBJ(Bubble);
288 IMPL_MEM_OBJ(Media_Block);
289 IMPL_MEM_OBJ(Supports_Block);
290 IMPL_MEM_OBJ(Directive);
291 IMPL_MEM_OBJ(Keyframe_Rule);
292 IMPL_MEM_OBJ(At_Root_Block);
293 IMPL_MEM_OBJ(Declaration);
294 IMPL_MEM_OBJ(Assignment);
295 IMPL_MEM_OBJ(Import);
296 IMPL_MEM_OBJ(Import_Stub);
297 IMPL_MEM_OBJ(Warning);
300 IMPL_MEM_OBJ(Comment);
301 IMPL_MEM_OBJ(PreValue);
302 IMPL_MEM_OBJ(Has_Block);
308 IMPL_MEM_OBJ(Return);
309 IMPL_MEM_OBJ(Content);
310 IMPL_MEM_OBJ(Extension);
311 IMPL_MEM_OBJ(Definition);
312 IMPL_MEM_OBJ(Mixin_Call);
314 IMPL_MEM_OBJ(Expression);
317 IMPL_MEM_OBJ(Binary_Expression);
318 IMPL_MEM_OBJ(Unary_Expression);
319 IMPL_MEM_OBJ(Function_Call);
320 IMPL_MEM_OBJ(Function_Call_Schema);
321 IMPL_MEM_OBJ(Custom_Warning);
322 IMPL_MEM_OBJ(Custom_Error);
323 IMPL_MEM_OBJ(Variable);
324 IMPL_MEM_OBJ(Textual);
325 IMPL_MEM_OBJ(Number);
327 IMPL_MEM_OBJ(Boolean);
328 IMPL_MEM_OBJ(String_Schema);
329 IMPL_MEM_OBJ(String);
330 IMPL_MEM_OBJ(String_Constant);
331 IMPL_MEM_OBJ(String_Quoted);
332 IMPL_MEM_OBJ(Media_Query);
333 IMPL_MEM_OBJ(Media_Query_Expression);
334 IMPL_MEM_OBJ(Supports_Condition);
335 IMPL_MEM_OBJ(Supports_Operator);
336 IMPL_MEM_OBJ(Supports_Negation);
337 IMPL_MEM_OBJ(Supports_Declaration);
338 IMPL_MEM_OBJ(Supports_Interpolation);
339 IMPL_MEM_OBJ(At_Root_Query);
341 IMPL_MEM_OBJ(Parent_Selector);
342 IMPL_MEM_OBJ(Parameter);
343 IMPL_MEM_OBJ(Parameters);
344 IMPL_MEM_OBJ(Argument);
345 IMPL_MEM_OBJ(Arguments);
346 IMPL_MEM_OBJ(Selector);
347 IMPL_MEM_OBJ(Selector_Schema);
348 IMPL_MEM_OBJ(Simple_Selector);
349 IMPL_MEM_OBJ(Placeholder_Selector);
350 IMPL_MEM_OBJ(Element_Selector);
351 IMPL_MEM_OBJ(Class_Selector);
352 IMPL_MEM_OBJ(Id_Selector);
353 IMPL_MEM_OBJ(Attribute_Selector);
354 IMPL_MEM_OBJ(Pseudo_Selector);
355 IMPL_MEM_OBJ(Wrapped_Selector);
356 IMPL_MEM_OBJ(Compound_Selector);
357 IMPL_MEM_OBJ(Complex_Selector);
358 IMPL_MEM_OBJ(Selector_List);
360 // ###########################################################################
361 // Implement compare, order and hashing operations for AST Nodes
362 // ###########################################################################
366 size_t operator() (const T& ex) const {
367 return ex.isNull() ? 0 : ex->hash();
372 bool operator() (const T& lhs, const T& rhs) const {
373 return !lhs.isNull() && !rhs.isNull() && *lhs < *rhs;
376 struct CompareNodes {
378 bool operator() (const T& lhs, const T& rhs) const {
379 return !lhs.isNull() && !rhs.isNull() && *lhs == *rhs;
383 // ###########################################################################
384 // some often used typedefs
385 // ###########################################################################
387 typedef std::unordered_map<
388 Expression_Obj, // key
389 Expression_Obj, // value
391 CompareNodes // compare
393 typedef std::unordered_set<
394 Expression_Obj, // value
396 CompareNodes // compare
399 typedef std::string SubSetMapKey;
400 typedef std::vector<std::string> SubSetMapKeys;
402 typedef std::pair<Complex_Selector_Obj, Compound_Selector_Obj> SubSetMapPair;
403 typedef std::pair<Compound_Selector_Obj, Complex_Selector_Obj> SubSetMapLookup;
404 typedef std::vector<SubSetMapPair> SubSetMapPairs;
405 typedef std::vector<SubSetMapLookup> SubSetMapLookups;
407 typedef std::pair<Complex_Selector_Obj, SubSetMapPairs> SubSetMapResult;
408 typedef std::vector<SubSetMapResult> SubSetMapResults;
410 typedef std::deque<Complex_Selector_Obj> ComplexSelectorDeque;
411 typedef std::set<Simple_Selector_Obj, OrderNodes> SimpleSelectorSet;
412 typedef std::set<Complex_Selector_Obj, OrderNodes> ComplexSelectorSet;
413 typedef std::unordered_set<Simple_Selector_Obj, HashNodes, CompareNodes> SimpleSelectorDict;
415 // ###########################################################################
416 // explicit type conversion functions
417 // ###########################################################################
420 T* Cast(AST_Node* ptr);
423 const T* Cast(const AST_Node* ptr);
425 // sometimes you know the class you want to cast to is final
426 // in this case a simple typeid check is faster and safe to use
428 #define DECLARE_BASE_CAST(T) \
429 template<> T* Cast(AST_Node* ptr); \
430 template<> const T* Cast(const AST_Node* ptr); \
432 // ###########################################################################
433 // implement specialization for final classes
434 // ###########################################################################
436 DECLARE_BASE_CAST(AST_Node)
437 DECLARE_BASE_CAST(Expression)
438 DECLARE_BASE_CAST(Statement)
439 DECLARE_BASE_CAST(Has_Block)
440 DECLARE_BASE_CAST(PreValue)
441 DECLARE_BASE_CAST(Value)
442 DECLARE_BASE_CAST(List)
443 DECLARE_BASE_CAST(String)
444 DECLARE_BASE_CAST(String_Constant)
445 DECLARE_BASE_CAST(Supports_Condition)
446 DECLARE_BASE_CAST(Selector)
447 DECLARE_BASE_CAST(Simple_Selector)