#ifndef SASS_AST_FWD_DECL_H #define SASS_AST_FWD_DECL_H // sass.hpp must go before all system headers to get the // __EXTENSIONS__ fix on Solaris. #include "sass.hpp" #include "memory.hpp" #include "sass/functions.h" ///////////////////////////////////////////// // Forward declarations for the AST visitors. ///////////////////////////////////////////// namespace Sass { class SourceData; class SourceFile; class SynthFile; class ItplFile; class AST_Node; class ParentStatement; class SimpleSelector; class Parent_Reference; class PreValue; class Block; class Expression; class Statement; class Value; class Declaration; class StyleRule; class Bubble; class Trace; class MediaRule; class CssMediaRule; class CssMediaQuery; class SupportsRule; class AtRule; class Keyframe_Rule; class AtRootRule; class Assignment; class Import; class Import_Stub; class WarningRule; class ErrorRule; class DebugRule; class Comment; class If; class ForRule; class EachRule; class WhileRule; class Return; class Content; class ExtendRule; class Definition; class List; class Map; class Function; class Mixin_Call; class Binary_Expression; class Unary_Expression; class Function_Call; class Custom_Warning; class Custom_Error; class Variable; class Number; class Color; class Color_RGBA; class Color_HSLA; class Boolean; class String; class Null; class String_Schema; class String_Constant; class String_Quoted; class Media_Query; class Media_Query_Expression; class SupportsCondition; class SupportsOperation; class SupportsNegation; class SupportsDeclaration; class Supports_Interpolation; class At_Root_Query; class Parameter; class Parameters; class Argument; class Arguments; class Selector; class Selector_Schema; class PlaceholderSelector; class TypeSelector; class ClassSelector; class IDSelector; class AttributeSelector; class PseudoSelector; class SelectorComponent; class SelectorCombinator; class CompoundSelector; class ComplexSelector; class SelectorList; // common classes class Context; class Expand; class Eval; class Extension; // declare classes that are instances of memory nodes // Note: also add a mapping without underscore // ToDo: move to camelCase vars in the future #define IMPL_MEM_OBJ(type) \ typedef SharedImpl type##Obj; \ typedef SharedImpl type##_Obj; \ IMPL_MEM_OBJ(SourceData); IMPL_MEM_OBJ(SourceFile); IMPL_MEM_OBJ(SynthFile); IMPL_MEM_OBJ(ItplFile); IMPL_MEM_OBJ(AST_Node); IMPL_MEM_OBJ(Statement); IMPL_MEM_OBJ(Block); IMPL_MEM_OBJ(StyleRule); IMPL_MEM_OBJ(Bubble); IMPL_MEM_OBJ(Trace); IMPL_MEM_OBJ(MediaRule); IMPL_MEM_OBJ(CssMediaRule); IMPL_MEM_OBJ(CssMediaQuery); IMPL_MEM_OBJ(SupportsRule); IMPL_MEM_OBJ(AtRule); IMPL_MEM_OBJ(Keyframe_Rule); IMPL_MEM_OBJ(AtRootRule); IMPL_MEM_OBJ(Declaration); IMPL_MEM_OBJ(Assignment); IMPL_MEM_OBJ(Import); IMPL_MEM_OBJ(Import_Stub); IMPL_MEM_OBJ(WarningRule); IMPL_MEM_OBJ(ErrorRule); IMPL_MEM_OBJ(DebugRule); IMPL_MEM_OBJ(Comment); IMPL_MEM_OBJ(PreValue); IMPL_MEM_OBJ(ParentStatement); IMPL_MEM_OBJ(If); IMPL_MEM_OBJ(ForRule); IMPL_MEM_OBJ(EachRule); IMPL_MEM_OBJ(WhileRule); IMPL_MEM_OBJ(Return); IMPL_MEM_OBJ(Content); IMPL_MEM_OBJ(ExtendRule); IMPL_MEM_OBJ(Definition); IMPL_MEM_OBJ(Mixin_Call); IMPL_MEM_OBJ(Value); IMPL_MEM_OBJ(Expression); IMPL_MEM_OBJ(List); IMPL_MEM_OBJ(Map); IMPL_MEM_OBJ(Function); IMPL_MEM_OBJ(Binary_Expression); IMPL_MEM_OBJ(Unary_Expression); IMPL_MEM_OBJ(Function_Call); IMPL_MEM_OBJ(Custom_Warning); IMPL_MEM_OBJ(Custom_Error); IMPL_MEM_OBJ(Variable); IMPL_MEM_OBJ(Number); IMPL_MEM_OBJ(Color); IMPL_MEM_OBJ(Color_RGBA); IMPL_MEM_OBJ(Color_HSLA); IMPL_MEM_OBJ(Boolean); IMPL_MEM_OBJ(String_Schema); IMPL_MEM_OBJ(String); IMPL_MEM_OBJ(String_Constant); IMPL_MEM_OBJ(String_Quoted); IMPL_MEM_OBJ(Media_Query); IMPL_MEM_OBJ(Media_Query_Expression); IMPL_MEM_OBJ(SupportsCondition); IMPL_MEM_OBJ(SupportsOperation); IMPL_MEM_OBJ(SupportsNegation); IMPL_MEM_OBJ(SupportsDeclaration); IMPL_MEM_OBJ(Supports_Interpolation); IMPL_MEM_OBJ(At_Root_Query); IMPL_MEM_OBJ(Null); IMPL_MEM_OBJ(Parent_Reference); IMPL_MEM_OBJ(Parameter); IMPL_MEM_OBJ(Parameters); IMPL_MEM_OBJ(Argument); IMPL_MEM_OBJ(Arguments); IMPL_MEM_OBJ(Selector); IMPL_MEM_OBJ(Selector_Schema); IMPL_MEM_OBJ(SimpleSelector); IMPL_MEM_OBJ(PlaceholderSelector); IMPL_MEM_OBJ(TypeSelector); IMPL_MEM_OBJ(ClassSelector); IMPL_MEM_OBJ(IDSelector); IMPL_MEM_OBJ(AttributeSelector); IMPL_MEM_OBJ(PseudoSelector); IMPL_MEM_OBJ(SelectorComponent); IMPL_MEM_OBJ(SelectorCombinator); IMPL_MEM_OBJ(CompoundSelector); IMPL_MEM_OBJ(ComplexSelector); IMPL_MEM_OBJ(SelectorList); // ########################################################################### // some often used typedefs // ########################################################################### typedef sass::vector BlockStack; typedef sass::vector CalleeStack; typedef sass::vector CallStack; typedef sass::vector MediaStack; typedef sass::vector SelectorStack; typedef sass::vector ImporterStack; // only to switch implementations for testing #define environment_map std::map // ########################################################################### // explicit type conversion functions // ########################################################################### template T* Cast(AST_Node* ptr); template const T* Cast(const AST_Node* ptr); // sometimes you know the class you want to cast to is final // in this case a simple typeid check is faster and safe to use #define DECLARE_BASE_CAST(T) \ template<> T* Cast(AST_Node* ptr); \ template<> const T* Cast(const AST_Node* ptr); \ // ########################################################################### // implement specialization for final classes // ########################################################################### DECLARE_BASE_CAST(AST_Node) DECLARE_BASE_CAST(Expression) DECLARE_BASE_CAST(Statement) DECLARE_BASE_CAST(ParentStatement) DECLARE_BASE_CAST(PreValue) DECLARE_BASE_CAST(Value) DECLARE_BASE_CAST(List) DECLARE_BASE_CAST(Color) DECLARE_BASE_CAST(String) DECLARE_BASE_CAST(String_Constant) DECLARE_BASE_CAST(SupportsCondition) DECLARE_BASE_CAST(Selector) DECLARE_BASE_CAST(SimpleSelector) DECLARE_BASE_CAST(SelectorComponent) } #endif