7 #include "operation.hpp"
8 #include "environment.hpp"
15 class Eval : public Operation_CRTP<Expression_Ptr, Eval> {
18 Expression_Ptr fallback_impl(AST_Node_Ptr n);
30 Backtrace* backtrace();
31 Selector_List_Obj selector();
33 // for evaluating function bodies
34 Expression_Ptr operator()(Block_Ptr);
35 Expression_Ptr operator()(Assignment_Ptr);
36 Expression_Ptr operator()(If_Ptr);
37 Expression_Ptr operator()(For_Ptr);
38 Expression_Ptr operator()(Each_Ptr);
39 Expression_Ptr operator()(While_Ptr);
40 Expression_Ptr operator()(Return_Ptr);
41 Expression_Ptr operator()(Warning_Ptr);
42 Expression_Ptr operator()(Error_Ptr);
43 Expression_Ptr operator()(Debug_Ptr);
45 Expression_Ptr operator()(List_Ptr);
46 Expression_Ptr operator()(Map_Ptr);
47 Expression_Ptr operator()(Binary_Expression_Ptr);
48 Expression_Ptr operator()(Unary_Expression_Ptr);
49 Expression_Ptr operator()(Function_Call_Ptr);
50 Expression_Ptr operator()(Function_Call_Schema_Ptr);
51 Expression_Ptr operator()(Variable_Ptr);
52 Expression_Ptr operator()(Textual_Ptr);
53 Expression_Ptr operator()(Number_Ptr);
54 Expression_Ptr operator()(Color_Ptr);
55 Expression_Ptr operator()(Boolean_Ptr);
56 Expression_Ptr operator()(String_Schema_Ptr);
57 Expression_Ptr operator()(String_Quoted_Ptr);
58 Expression_Ptr operator()(String_Constant_Ptr);
59 // Expression_Ptr operator()(Selector_List_Ptr);
60 Expression_Ptr operator()(Media_Query_Ptr);
61 Expression_Ptr operator()(Media_Query_Expression_Ptr);
62 Expression_Ptr operator()(At_Root_Query_Ptr);
63 Expression_Ptr operator()(Supports_Operator_Ptr);
64 Expression_Ptr operator()(Supports_Negation_Ptr);
65 Expression_Ptr operator()(Supports_Declaration_Ptr);
66 Expression_Ptr operator()(Supports_Interpolation_Ptr);
67 Expression_Ptr operator()(Null_Ptr);
68 Expression_Ptr operator()(Argument_Ptr);
69 Expression_Ptr operator()(Arguments_Ptr);
70 Expression_Ptr operator()(Comment_Ptr);
72 // these will return selectors
73 Selector_List_Ptr operator()(Selector_List_Ptr);
74 Selector_List_Ptr operator()(Complex_Selector_Ptr);
75 Attribute_Selector_Ptr operator()(Attribute_Selector_Ptr);
76 // they don't have any specific implementatio (yet)
77 Element_Selector_Ptr operator()(Element_Selector_Ptr s) { return s; };
78 Pseudo_Selector_Ptr operator()(Pseudo_Selector_Ptr s) { return s; };
79 Wrapped_Selector_Ptr operator()(Wrapped_Selector_Ptr s) { return s; };
80 Class_Selector_Ptr operator()(Class_Selector_Ptr s) { return s; };
81 Id_Selector_Ptr operator()(Id_Selector_Ptr s) { return s; };
82 Placeholder_Selector_Ptr operator()(Placeholder_Selector_Ptr s) { return s; };
83 // actual evaluated selectors
84 Selector_List_Ptr operator()(Selector_Schema_Ptr);
85 Expression_Ptr operator()(Parent_Selector_Ptr);
88 Expression_Ptr fallback(U x) { return fallback_impl(x); }
90 // -- only need to define two comparisons, and the rest can be implemented in terms of them
91 static bool eq(Expression_Obj, Expression_Obj);
92 static bool lt(Expression_Obj, Expression_Obj, std::string op);
93 // -- arithmetic on the combinations that matter
94 static Value_Ptr op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, ParserState* pstate = 0);
95 static Value_Ptr op_number_color(enum Sass_OP, const Number&, const Color&, struct Sass_Inspect_Options opt, ParserState* pstate = 0);
96 static Value_Ptr op_color_number(enum Sass_OP, const Color&, const Number&, struct Sass_Inspect_Options opt, ParserState* pstate = 0);
97 static Value_Ptr op_colors(enum Sass_OP, const Color&, const Color&, struct Sass_Inspect_Options opt, ParserState* pstate = 0);
98 static Value_Ptr op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, ParserState* pstate = 0, bool interpolant = false);
101 void interpolation(Context& ctx, std::string& res, Expression_Obj ex, bool into_quotes, bool was_itpl = false);
105 Expression_Ptr cval_to_astnode(union Sass_Value* v, Backtrace* backtrace, ParserState pstate = ParserState("[AST]"));