1 #ifndef SASS_OPERATION_H
2 #define SASS_OPERATION_H
4 #include "ast_fwd_decl.hpp"
11 virtual T operator()(AST_Node_Ptr x) = 0;
12 virtual ~Operation() { }
14 virtual T operator()(Block_Ptr x) = 0;
15 virtual T operator()(Ruleset_Ptr x) = 0;
16 virtual T operator()(Bubble_Ptr x) = 0;
17 virtual T operator()(Trace_Ptr x) = 0;
18 virtual T operator()(Supports_Block_Ptr x) = 0;
19 virtual T operator()(Media_Block_Ptr x) = 0;
20 virtual T operator()(At_Root_Block_Ptr x) = 0;
21 virtual T operator()(Directive_Ptr x) = 0;
22 virtual T operator()(Keyframe_Rule_Ptr x) = 0;
23 virtual T operator()(Declaration_Ptr x) = 0;
24 virtual T operator()(Assignment_Ptr x) = 0;
25 virtual T operator()(Import_Ptr x) = 0;
26 virtual T operator()(Import_Stub_Ptr x) = 0;
27 virtual T operator()(Warning_Ptr x) = 0;
28 virtual T operator()(Error_Ptr x) = 0;
29 virtual T operator()(Debug_Ptr x) = 0;
30 virtual T operator()(Comment_Ptr x) = 0;
31 virtual T operator()(If_Ptr x) = 0;
32 virtual T operator()(For_Ptr x) = 0;
33 virtual T operator()(Each_Ptr x) = 0;
34 virtual T operator()(While_Ptr x) = 0;
35 virtual T operator()(Return_Ptr x) = 0;
36 virtual T operator()(Content_Ptr x) = 0;
37 virtual T operator()(Extension_Ptr x) = 0;
38 virtual T operator()(Definition_Ptr x) = 0;
39 virtual T operator()(Mixin_Call_Ptr x) = 0;
41 virtual T operator()(List_Ptr x) = 0;
42 virtual T operator()(Map_Ptr x) = 0;
43 virtual T operator()(Binary_Expression_Ptr x) = 0;
44 virtual T operator()(Unary_Expression_Ptr x) = 0;
45 virtual T operator()(Function_Call_Ptr x) = 0;
46 virtual T operator()(Function_Call_Schema_Ptr x) = 0;
47 virtual T operator()(Custom_Warning_Ptr x) = 0;
48 virtual T operator()(Custom_Error_Ptr x) = 0;
49 virtual T operator()(Variable_Ptr x) = 0;
50 virtual T operator()(Textual_Ptr x) = 0;
51 virtual T operator()(Number_Ptr x) = 0;
52 virtual T operator()(Color_Ptr x) = 0;
53 virtual T operator()(Boolean_Ptr x) = 0;
54 virtual T operator()(String_Schema_Ptr x) = 0;
55 virtual T operator()(String_Quoted_Ptr x) = 0;
56 virtual T operator()(String_Constant_Ptr x) = 0;
57 virtual T operator()(Supports_Condition_Ptr x) = 0;
58 virtual T operator()(Supports_Operator_Ptr x) = 0;
59 virtual T operator()(Supports_Negation_Ptr x) = 0;
60 virtual T operator()(Supports_Declaration_Ptr x) = 0;
61 virtual T operator()(Supports_Interpolation_Ptr x) = 0;
62 virtual T operator()(Media_Query_Ptr x) = 0;
63 virtual T operator()(Media_Query_Expression_Ptr x) = 0;
64 virtual T operator()(At_Root_Query_Ptr x) = 0;
65 virtual T operator()(Null_Ptr x) = 0;
66 virtual T operator()(Parent_Selector_Ptr x) = 0;
67 // parameters and arguments
68 virtual T operator()(Parameter_Ptr x) = 0;
69 virtual T operator()(Parameters_Ptr x) = 0;
70 virtual T operator()(Argument_Ptr x) = 0;
71 virtual T operator()(Arguments_Ptr x) = 0;
73 virtual T operator()(Selector_Schema_Ptr x) = 0;
74 virtual T operator()(Placeholder_Selector_Ptr x) = 0;
75 virtual T operator()(Element_Selector_Ptr x) = 0;
76 virtual T operator()(Class_Selector_Ptr x) = 0;
77 virtual T operator()(Id_Selector_Ptr x) = 0;
78 virtual T operator()(Attribute_Selector_Ptr x) = 0;
79 virtual T operator()(Pseudo_Selector_Ptr x) = 0;
80 virtual T operator()(Wrapped_Selector_Ptr x) = 0;
81 virtual T operator()(Compound_Selector_Ptr x)= 0;
82 virtual T operator()(Complex_Selector_Ptr x) = 0;
83 virtual T operator()(Selector_List_Ptr x) = 0;
86 T fallback(U x) { return T(); }
89 template <typename T, typename D>
90 class Operation_CRTP : public Operation<T> {
92 D& impl() { return static_cast<D&>(*this); }
94 T operator()(AST_Node_Ptr x) { return static_cast<D*>(this)->fallback(x); }
96 T operator()(Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
97 T operator()(Ruleset_Ptr x) { return static_cast<D*>(this)->fallback(x); }
98 T operator()(Bubble_Ptr x) { return static_cast<D*>(this)->fallback(x); }
99 T operator()(Trace_Ptr x) { return static_cast<D*>(this)->fallback(x); }
100 T operator()(Supports_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
101 T operator()(Media_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
102 T operator()(At_Root_Block_Ptr x) { return static_cast<D*>(this)->fallback(x); }
103 T operator()(Directive_Ptr x) { return static_cast<D*>(this)->fallback(x); }
104 T operator()(Keyframe_Rule_Ptr x) { return static_cast<D*>(this)->fallback(x); }
105 T operator()(Declaration_Ptr x) { return static_cast<D*>(this)->fallback(x); }
106 T operator()(Assignment_Ptr x) { return static_cast<D*>(this)->fallback(x); }
107 T operator()(Import_Ptr x) { return static_cast<D*>(this)->fallback(x); }
108 T operator()(Import_Stub_Ptr x) { return static_cast<D*>(this)->fallback(x); }
109 T operator()(Warning_Ptr x) { return static_cast<D*>(this)->fallback(x); }
110 T operator()(Error_Ptr x) { return static_cast<D*>(this)->fallback(x); }
111 T operator()(Debug_Ptr x) { return static_cast<D*>(this)->fallback(x); }
112 T operator()(Comment_Ptr x) { return static_cast<D*>(this)->fallback(x); }
113 T operator()(If_Ptr x) { return static_cast<D*>(this)->fallback(x); }
114 T operator()(For_Ptr x) { return static_cast<D*>(this)->fallback(x); }
115 T operator()(Each_Ptr x) { return static_cast<D*>(this)->fallback(x); }
116 T operator()(While_Ptr x) { return static_cast<D*>(this)->fallback(x); }
117 T operator()(Return_Ptr x) { return static_cast<D*>(this)->fallback(x); }
118 T operator()(Content_Ptr x) { return static_cast<D*>(this)->fallback(x); }
119 T operator()(Extension_Ptr x) { return static_cast<D*>(this)->fallback(x); }
120 T operator()(Definition_Ptr x) { return static_cast<D*>(this)->fallback(x); }
121 T operator()(Mixin_Call_Ptr x) { return static_cast<D*>(this)->fallback(x); }
123 T operator()(List_Ptr x) { return static_cast<D*>(this)->fallback(x); }
124 T operator()(Map_Ptr x) { return static_cast<D*>(this)->fallback(x); }
125 T operator()(Binary_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
126 T operator()(Unary_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
127 T operator()(Function_Call_Ptr x) { return static_cast<D*>(this)->fallback(x); }
128 T operator()(Function_Call_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
129 T operator()(Custom_Warning_Ptr x) { return static_cast<D*>(this)->fallback(x); }
130 T operator()(Custom_Error_Ptr x) { return static_cast<D*>(this)->fallback(x); }
131 T operator()(Variable_Ptr x) { return static_cast<D*>(this)->fallback(x); }
132 T operator()(Textual_Ptr x) { return static_cast<D*>(this)->fallback(x); }
133 T operator()(Number_Ptr x) { return static_cast<D*>(this)->fallback(x); }
134 T operator()(Color_Ptr x) { return static_cast<D*>(this)->fallback(x); }
135 T operator()(Boolean_Ptr x) { return static_cast<D*>(this)->fallback(x); }
136 T operator()(String_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
137 T operator()(String_Constant_Ptr x) { return static_cast<D*>(this)->fallback(x); }
138 T operator()(String_Quoted_Ptr x) { return static_cast<D*>(this)->fallback(x); }
139 T operator()(Supports_Condition_Ptr x) { return static_cast<D*>(this)->fallback(x); }
140 T operator()(Supports_Operator_Ptr x) { return static_cast<D*>(this)->fallback(x); }
141 T operator()(Supports_Negation_Ptr x) { return static_cast<D*>(this)->fallback(x); }
142 T operator()(Supports_Declaration_Ptr x) { return static_cast<D*>(this)->fallback(x); }
143 T operator()(Supports_Interpolation_Ptr x) { return static_cast<D*>(this)->fallback(x); }
144 T operator()(Media_Query_Ptr x) { return static_cast<D*>(this)->fallback(x); }
145 T operator()(Media_Query_Expression_Ptr x) { return static_cast<D*>(this)->fallback(x); }
146 T operator()(At_Root_Query_Ptr x) { return static_cast<D*>(this)->fallback(x); }
147 T operator()(Null_Ptr x) { return static_cast<D*>(this)->fallback(x); }
148 T operator()(Parent_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
149 // parameters and arguments
150 T operator()(Parameter_Ptr x) { return static_cast<D*>(this)->fallback(x); }
151 T operator()(Parameters_Ptr x) { return static_cast<D*>(this)->fallback(x); }
152 T operator()(Argument_Ptr x) { return static_cast<D*>(this)->fallback(x); }
153 T operator()(Arguments_Ptr x) { return static_cast<D*>(this)->fallback(x); }
155 T operator()(Selector_Schema_Ptr x) { return static_cast<D*>(this)->fallback(x); }
156 T operator()(Placeholder_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
157 T operator()(Element_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
158 T operator()(Class_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
159 T operator()(Id_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
160 T operator()(Attribute_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
161 T operator()(Pseudo_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
162 T operator()(Wrapped_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
163 T operator()(Compound_Selector_Ptr x){ return static_cast<D*>(this)->fallback(x); }
164 T operator()(Complex_Selector_Ptr x) { return static_cast<D*>(this)->fallback(x); }
165 T operator()(Selector_List_Ptr x) { return static_cast<D*>(this)->fallback(x); }
167 template <typename U>
168 T fallback(U x) { return T(); }