]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programsyntax.h
Streamline interface declarations
[libs/gl.git] / source / programsyntax.h
index 8f72a0bdfc7258a4af9bdb048e0aad114b4a83a2..c8b0e1f74ed9d1679e8c652ddb1f52f896872df5 100644 (file)
@@ -41,15 +41,20 @@ private:
 public:
        T *operator->() { return node; }
        const T *operator->() const { return node; }
+       T &operator*() { return *node; }
+       const T &operator*() const { return *node; }
        operator void *() const { return node; }
 };
 
+struct StructDeclaration;
 struct VariableDeclaration;
 
 struct Block: Node
 {
        std::list<NodePtr<Node> > body;
        bool use_braces;
+       std::map<std::string, StructDeclaration *> types;
+       std::map<std::string, VariableDeclaration *> variables;
 
        Block();
 
@@ -81,6 +86,9 @@ struct ParenthesizedExpression: Expression
 struct VariableReference: Expression
 {
        std::string name;
+       VariableDeclaration *declaration;
+
+       VariableReference();
 
        virtual VariableReference *clone() const { return new VariableReference(*this); }
        virtual void visit(NodeVisitor &);
@@ -90,6 +98,7 @@ struct MemberAccess: Expression
 {
        NodePtr<Expression> left;
        std::string member;
+       VariableDeclaration *declaration;
 
        virtual MemberAccess *clone() const { return new MemberAccess(*this); }
        virtual void visit(NodeVisitor &);
@@ -173,10 +182,12 @@ struct VariableDeclaration: Node
        std::string sampling;
        std::string interface;
        std::string type;
+       StructDeclaration *type_declaration;
        std::string name;
        bool array;
        NodePtr<Expression> array_size;
        NodePtr<Expression> init_expression;
+       VariableDeclaration *linked_declaration;
 
        VariableDeclaration();
 
@@ -231,6 +242,14 @@ struct Iteration: Node
        virtual void visit(NodeVisitor &);
 };
 
+struct Passthrough: Node
+{
+       NodePtr<Expression> subscript;
+
+       virtual Passthrough *clone() const { return new Passthrough(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
 struct Return: Node
 {
        NodePtr<Expression> expression;
@@ -259,9 +278,29 @@ struct NodeVisitor
        virtual void visit(FunctionDeclaration &) { }
        virtual void visit(Conditional &) { }
        virtual void visit(Iteration &) { }
+       virtual void visit(Passthrough &) { }
        virtual void visit(Return &) { }
 };
 
+struct TraversingVisitor: NodeVisitor
+{
+       virtual void visit(Block &);
+       virtual void visit(ParenthesizedExpression &);
+       virtual void visit(MemberAccess &);
+       virtual void visit(UnaryExpression &);
+       virtual void visit(BinaryExpression &);
+       virtual void visit(FunctionCall &);
+       virtual void visit(ExpressionStatement &);
+       virtual void visit(StructDeclaration &);
+       virtual void visit(VariableDeclaration &);
+       virtual void visit(InterfaceBlock &);
+       virtual void visit(FunctionDeclaration &);
+       virtual void visit(Conditional &);
+       virtual void visit(Iteration &);
+       virtual void visit(Passthrough &);
+       virtual void visit(Return &);
+};
+
 enum ContextType
 {
        GLOBAL,
@@ -274,7 +313,10 @@ struct Context
 {
        ContextType type;
        bool present;
+       Context *previous;
        ProgramSyntax::Block content;
+       std::map<std::string, VariableDeclaration *> in_variables;
+       std::map<std::string, VariableDeclaration *> out_variables;
 
        Context(ContextType);
 };
@@ -285,7 +327,6 @@ struct Module
        Context vertex_context;
        Context geometry_context;
        Context fragment_context;
-       std::map<std::string, StructDeclaration *> structs;
 
        Module();
 };