Initial commit
[yaffs-website] / node_modules / node-sass / src / libsass / src / ast_fwd_decl.hpp
1 #ifndef SASS_AST_FWD_DECL_H
2 #define SASS_AST_FWD_DECL_H
3
4 #include <map>
5 #include <set>
6 #include <deque>
7 #include <vector>
8 #include <typeinfo>
9 #include <iostream>
10 #include <algorithm>
11 #include <unordered_map>
12 #include <unordered_set>
13 #include "memory/SharedPtr.hpp"
14
15 /////////////////////////////////////////////
16 // Forward declarations for the AST visitors.
17 /////////////////////////////////////////////
18 namespace Sass {
19
20   class AST_Node;
21   typedef AST_Node* AST_Node_Ptr;
22   typedef AST_Node const* AST_Node_Ptr_Const;
23
24   class Has_Block;
25   typedef Has_Block* Has_Block_Ptr;
26   typedef Has_Block const* Has_Block_Ptr_Const;
27
28   class Simple_Selector;
29   typedef Simple_Selector* Simple_Selector_Ptr;
30   typedef Simple_Selector const* Simple_Selector_Ptr_Const;
31
32   class PreValue;
33   typedef PreValue* PreValue_Ptr;
34   typedef PreValue const* PreValue_Ptr_Const;
35   class Thunk;
36   typedef Thunk* Thunk_Ptr;
37   typedef Thunk const* Thunk_Ptr_Const;
38   class Block;
39   typedef Block* Block_Ptr;
40   typedef Block const* Block_Ptr_Const;
41   class Expression;
42   typedef Expression* Expression_Ptr;
43   typedef Expression const* Expression_Ptr_Const;
44   class Statement;
45   typedef Statement* Statement_Ptr;
46   typedef Statement const* Statement_Ptr_Const;
47   class Value;
48   typedef Value* Value_Ptr;
49   typedef Value const* Value_Ptr_Const;
50   class Declaration;
51   typedef Declaration* Declaration_Ptr;
52   typedef Declaration const* Declaration_Ptr_Const;
53   class Ruleset;
54   typedef Ruleset* Ruleset_Ptr;
55   typedef Ruleset const* Ruleset_Ptr_Const;
56   class Bubble;
57   typedef Bubble* Bubble_Ptr;
58   typedef Bubble const* Bubble_Ptr_Const;
59   class Trace;
60   typedef Trace* Trace_Ptr;
61   typedef Trace const* Trace_Ptr_Const;
62
63   class Media_Block;
64   typedef Media_Block* Media_Block_Ptr;
65   typedef Media_Block const* Media_Block_Ptr_Const;
66   class Supports_Block;
67   typedef Supports_Block* Supports_Block_Ptr;
68   typedef Supports_Block const* Supports_Block_Ptr_Const;
69   class Directive;
70   typedef Directive* Directive_Ptr;
71   typedef Directive const* Directive_Ptr_Const;
72
73
74   class Keyframe_Rule;
75   typedef Keyframe_Rule* Keyframe_Rule_Ptr;
76   typedef Keyframe_Rule const* Keyframe_Rule_Ptr_Const;
77   class At_Root_Block;
78   typedef At_Root_Block* At_Root_Block_Ptr;
79   typedef At_Root_Block const* At_Root_Block_Ptr_Const;
80   class Assignment;
81   typedef Assignment* Assignment_Ptr;
82   typedef Assignment const* Assignment_Ptr_Const;
83
84   class Import;
85   typedef Import* Import_Ptr;
86   typedef Import const* Import_Ptr_Const;
87   class Import_Stub;
88   typedef Import_Stub* Import_Stub_Ptr;
89   typedef Import_Stub const* Import_Stub_Ptr_Const;
90   class Warning;
91   typedef Warning* Warning_Ptr;
92   typedef Warning const* Warning_Ptr_Const;
93
94   class Error;
95   typedef Error* Error_Ptr;
96   typedef Error const* Error_Ptr_Const;
97   class Debug;
98   typedef Debug* Debug_Ptr;
99   typedef Debug const* Debug_Ptr_Const;
100   class Comment;
101   typedef Comment* Comment_Ptr;
102   typedef Comment const* Comment_Ptr_Const;
103
104   class If;
105   typedef If* If_Ptr;
106   typedef If const* If_Ptr_Const;
107   class For;
108   typedef For* For_Ptr;
109   typedef For const* For_Ptr_Const;
110   class Each;
111   typedef Each* Each_Ptr;
112   typedef Each const* Each_Ptr_Const;
113   class While;
114   typedef While* While_Ptr;
115   typedef While const* While_Ptr_Const;
116   class Return;
117   typedef Return* Return_Ptr;
118   typedef Return const* Return_Ptr_Const;
119   class Content;
120   typedef Content* Content_Ptr;
121   typedef Content const* Content_Ptr_Const;
122   class Extension;
123   typedef Extension* Extension_Ptr;
124   typedef Extension const* Extension_Ptr_Const;
125   class Definition;
126   typedef Definition* Definition_Ptr;
127   typedef Definition const* Definition_Ptr_Const;
128
129   class List;
130   typedef List* List_Ptr;
131   typedef List const* List_Ptr_Const;
132   class Map;
133   typedef Map* Map_Ptr;
134   typedef Map const* Map_Ptr_Const;
135
136   class Mixin_Call;
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;
145   class Function_Call;
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;
154   class Custom_Error;
155   typedef Custom_Error* Custom_Error_Ptr;
156   typedef Custom_Error const* Custom_Error_Ptr_Const;
157
158   class Variable;
159   typedef Variable* Variable_Ptr;
160   typedef Variable const* Variable_Ptr_Const;
161   class Textual;
162   typedef Textual* Textual_Ptr;
163   typedef Textual const* Textual_Ptr_Const;
164   class Number;
165   typedef Number* Number_Ptr;
166   typedef Number const* Number_Ptr_Const;
167   class Color;
168   typedef Color* Color_Ptr;
169   typedef Color const* Color_Ptr_Const;
170   class Boolean;
171   typedef Boolean* Boolean_Ptr;
172   typedef Boolean const* Boolean_Ptr_Const;
173   class String;
174   typedef String* String_Ptr;
175   typedef String const* String_Ptr_Const;
176
177   class String_Schema;
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;
183   class String_Quoted;
184   typedef String_Quoted* String_Quoted_Ptr;
185   typedef String_Quoted const* String_Quoted_Ptr_Const;
186
187   class Media_Query;
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;
208
209
210   class Null;
211   typedef Null* Null_Ptr;
212   typedef Null const* Null_Ptr_Const;
213
214   class At_Root_Query;
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;
220   class Parameter;
221   typedef Parameter* Parameter_Ptr;
222   typedef Parameter const* Parameter_Ptr_Const;
223   class Parameters;
224   typedef Parameters* Parameters_Ptr;
225   typedef Parameters const* Parameters_Ptr_Const;
226   class Argument;
227   typedef Argument* Argument_Ptr;
228   typedef Argument const* Argument_Ptr_Const;
229   class Arguments;
230   typedef Arguments* Arguments_Ptr;
231   typedef Arguments const* Arguments_Ptr_Const;
232   class Selector;
233   typedef Selector* Selector_Ptr;
234   typedef Selector const* Selector_Ptr_Const;
235
236
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;
249   class Id_Selector;
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;
255
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;
268   class Selector_List;
269   typedef Selector_List* Selector_List_Ptr;
270   typedef Selector_List const * Selector_List_Ptr_Const;
271
272
273   // common classes
274   class Context;
275   class Expand;
276   class Eval;
277
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
281
282   IMPL_MEM_OBJ(AST_Node);
283   IMPL_MEM_OBJ(Statement);
284   IMPL_MEM_OBJ(Block);
285   IMPL_MEM_OBJ(Ruleset);
286   IMPL_MEM_OBJ(Bubble);
287   IMPL_MEM_OBJ(Trace);
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);
298   IMPL_MEM_OBJ(Error);
299   IMPL_MEM_OBJ(Debug);
300   IMPL_MEM_OBJ(Comment);
301   IMPL_MEM_OBJ(PreValue);
302   IMPL_MEM_OBJ(Has_Block);
303   IMPL_MEM_OBJ(Thunk);
304   IMPL_MEM_OBJ(If);
305   IMPL_MEM_OBJ(For);
306   IMPL_MEM_OBJ(Each);
307   IMPL_MEM_OBJ(While);
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);
313   IMPL_MEM_OBJ(Value);
314   IMPL_MEM_OBJ(Expression);
315   IMPL_MEM_OBJ(List);
316   IMPL_MEM_OBJ(Map);
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);
326   IMPL_MEM_OBJ(Color);
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);
340   IMPL_MEM_OBJ(Null);
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);
359
360   // ###########################################################################
361   // Implement compare, order and hashing operations for AST Nodes
362   // ###########################################################################
363
364   struct HashNodes {
365     template <class T>
366     size_t operator() (const T& ex) const {
367       return ex.isNull() ? 0 : ex->hash();
368     }
369   };
370   struct OrderNodes {
371     template <class T>
372     bool operator() (const T& lhs, const T& rhs) const {
373       return !lhs.isNull() && !rhs.isNull() && *lhs < *rhs;
374     }
375   };
376   struct CompareNodes {
377     template <class T>
378     bool operator() (const T& lhs, const T& rhs) const {
379       return !lhs.isNull() && !rhs.isNull() && *lhs == *rhs;
380     }
381   };
382
383   // ###########################################################################
384   // some often used typedefs
385   // ###########################################################################
386
387   typedef std::unordered_map<
388     Expression_Obj, // key
389     Expression_Obj, // value
390     HashNodes, // hasher
391     CompareNodes // compare
392   > ExpressionMap;
393   typedef std::unordered_set<
394     Expression_Obj, // value
395     HashNodes, // hasher
396     CompareNodes // compare
397   > ExpressionSet;
398
399   typedef std::string SubSetMapKey;
400   typedef std::vector<std::string> SubSetMapKeys;
401
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;
406
407   typedef std::pair<Complex_Selector_Obj, SubSetMapPairs> SubSetMapResult;
408   typedef std::vector<SubSetMapResult> SubSetMapResults;
409
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;
414
415   // ###########################################################################
416   // explicit type conversion functions
417   // ###########################################################################
418
419   template<class T>
420   T* Cast(AST_Node* ptr);
421
422   template<class T>
423   const T* Cast(const AST_Node* ptr);
424
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
427
428   #define DECLARE_BASE_CAST(T) \
429   template<> T* Cast(AST_Node* ptr); \
430   template<> const T* Cast(const AST_Node* ptr); \
431
432   // ###########################################################################
433   // implement specialization for final classes
434   // ###########################################################################
435
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)
448
449 }
450
451 #endif