]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/syntax.h
Avoid copying raw pointers in the syntax tree
[libs/gl.git] / source / glsl / syntax.h
index deb2c78027c0debcddaeac9eb0b24a4f693ec51e..05bcee545f4a62431ddf8c00978d766e6c670565 100644 (file)
@@ -7,6 +7,7 @@
 #include <vector>
 #include <msp/core/refptr.h>
 #include "extension.h"
+#include "sourcemap.h"
 #include "uniform.h"
 
 #pragma push_macro("interface")
@@ -142,6 +143,7 @@ struct VariableReference: Expression
        VariableDeclaration *declaration;
 
        VariableReference();
+       VariableReference(const VariableReference &);
 
        virtual VariableReference *clone() const { return new VariableReference(*this); }
        virtual void visit(NodeVisitor &);
@@ -153,6 +155,9 @@ struct MemberAccess: Expression
        std::string member;
        VariableDeclaration *declaration;
 
+       MemberAccess();
+       MemberAccess(const MemberAccess &);
+
        virtual MemberAccess *clone() const { return new MemberAccess(*this); }
        virtual void visit(NodeVisitor &);
 };
@@ -186,6 +191,7 @@ struct Assignment: BinaryExpression
        VariableDeclaration *target_declaration;
 
        Assignment();
+       Assignment(const Assignment &);
 
        virtual Assignment *clone() const { return new Assignment(*this); }
        virtual void visit(NodeVisitor &);
@@ -199,6 +205,7 @@ struct FunctionCall: Expression
        NodeArray<Expression> arguments;
 
        FunctionCall();
+       FunctionCall(const FunctionCall &);
 
        virtual FunctionCall *clone() const { return new FunctionCall(*this); }
        virtual void visit(NodeVisitor &);
@@ -281,6 +288,7 @@ struct VariableDeclaration: Statement
        NodePtr<Layout> layout;
 
        VariableDeclaration();
+       VariableDeclaration(const VariableDeclaration &);
 
        virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
        virtual void visit(NodeVisitor &);
@@ -360,67 +368,17 @@ struct Jump: Statement
        virtual void visit(NodeVisitor &);
 };
 
-struct NodeVisitor
-{
-       virtual ~NodeVisitor() { }
-
-       virtual void visit(Block &) { }
-       virtual void visit(Literal &) { }
-       virtual void visit(ParenthesizedExpression &) { }
-       virtual void visit(VariableReference &) { }
-       virtual void visit(MemberAccess &) { }
-       virtual void visit(UnaryExpression &) { }
-       virtual void visit(BinaryExpression &) { }
-       virtual void visit(Assignment &);
-       virtual void visit(FunctionCall &) { }
-       virtual void visit(ExpressionStatement &) { }
-       virtual void visit(Import &) { }
-       virtual void visit(Precision &) { }
-       virtual void visit(Layout &) { }
-       virtual void visit(InterfaceLayout &) { }
-       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 &) { }
-       virtual void visit(Jump &) { }
-};
-
-struct TraversingVisitor: NodeVisitor
-{
-       using NodeVisitor::visit;
-       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(InterfaceLayout &);
-       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 StageType
-{
-       SHARED,
-       VERTEX,
-       GEOMETRY,
-       FRAGMENT
-};
-
 struct Stage
 {
-       StageType type;
+       enum Type
+       {
+               SHARED,
+               VERTEX,
+               GEOMETRY,
+               FRAGMENT
+       };
+
+       Type type;
        Stage *previous;
        Block content;
        std::map<std::string, VariableDeclaration *> in_variables;
@@ -429,11 +387,14 @@ struct Stage
        Version required_version;
        std::vector<const Extension *> required_extensions;
 
-       Stage(StageType);
+       Stage(Type);
+
+       static const char *get_stage_name(Type);
 };
 
 struct Module
 {
+       SourceMap source_map;
        Stage shared;
        std::list<Stage> stages;