#ifndef SASS_EVAL_H #define SASS_EVAL_H #include "context.hpp" #include "listize.hpp" #include "operation.hpp" namespace Sass { class Expand; class Context; class Listize; class Eval : public Operation_CRTP { private: Expression* fallback_impl(AST_Node* n); public: Expand& exp; Context& ctx; Listize listize; Eval(Expand& exp); virtual ~Eval(); Env* environment(); Context& context(); Selector_List* selector(); Backtrace* backtrace(); using Operation::operator(); // for evaluating function bodies Expression* operator()(Block*); Expression* operator()(Assignment*); Expression* operator()(If*); Expression* operator()(For*); Expression* operator()(Each*); Expression* operator()(While*); Expression* operator()(Return*); Expression* operator()(Warning*); Expression* operator()(Error*); Expression* operator()(Debug*); Expression* operator()(List*); Expression* operator()(Map*); Expression* operator()(Binary_Expression*); Expression* operator()(Unary_Expression*); Expression* operator()(Function_Call*); Expression* operator()(Function_Call_Schema*); Expression* operator()(Variable*); Expression* operator()(Textual*); Expression* operator()(Number*); Expression* operator()(Boolean*); Expression* operator()(String_Schema*); Expression* operator()(String_Quoted*); Expression* operator()(String_Constant*); // Expression* operator()(Selector_List*); Expression* operator()(Media_Query*); Expression* operator()(Media_Query_Expression*); Expression* operator()(At_Root_Expression*); Expression* operator()(Supports_Operator*); Expression* operator()(Supports_Negation*); Expression* operator()(Supports_Declaration*); Expression* operator()(Supports_Interpolation*); Expression* operator()(Null*); Expression* operator()(Argument*); Expression* operator()(Arguments*); Expression* operator()(Comment*); // these will return selectors Selector_List* operator()(Selector_List*); Selector_List* operator()(Complex_Selector*); Attribute_Selector* operator()(Attribute_Selector*); // they don't have any specific implementatio (yet) Type_Selector* operator()(Type_Selector* s) { return s; }; Pseudo_Selector* operator()(Pseudo_Selector* s) { return s; }; Wrapped_Selector* operator()(Wrapped_Selector* s) { return s; }; Selector_Qualifier* operator()(Selector_Qualifier* s) { return s; }; Selector_Placeholder* operator()(Selector_Placeholder* s) { return s; }; // actual evaluated selectors Selector_List* operator()(Selector_Schema*); Expression* operator()(Parent_Selector*); template Expression* fallback(U x) { return fallback_impl(x); } // -- only need to define two comparisons, and the rest can be implemented in terms of them static bool eq(Expression*, Expression*); static bool lt(Expression*, Expression*); // -- arithmetic on the combinations that matter static Value* op_numbers(Memory_Manager&, enum Sass_OP, const Number&, const Number&, bool compressed = false, int precision = 5, ParserState* pstate = 0); static Value* op_number_color(Memory_Manager&, enum Sass_OP, const Number&, const Color&, bool compressed = false, int precision = 5, ParserState* pstate = 0); static Value* op_color_number(Memory_Manager&, enum Sass_OP, const Color&, const Number&, bool compressed = false, int precision = 5, ParserState* pstate = 0); static Value* op_colors(Memory_Manager&, enum Sass_OP, const Color&, const Color&, bool compressed = false, int precision = 5, ParserState* pstate = 0); static Value* op_strings(Memory_Manager&, enum Sass_OP, Value&, Value&, bool compressed = false, int precision = 5, ParserState* pstate = 0); private: std::string interpolation(Expression* s, bool into_quotes = false); }; Expression* cval_to_astnode(Memory_Manager& mem, union Sass_Value* v, Context& ctx, Backtrace* backtrace, ParserState pstate = ParserState("[AST]")); } #endif