]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.h
Further refactor the resolving process in SL::Compiler
[libs/gl.git] / source / glsl / generate.h
index 3d175b42dceda80c71c5052bfbdba0862ea1a4cd..a728e99ced3a8bccd24aaa89de94cbbddee09664 100644 (file)
@@ -48,8 +48,13 @@ private:
 /** Forms links between nested blocks in the syntax tree. */
 class BlockHierarchyResolver: private TraversingVisitor
 {
+private:
+       bool r_any_resolved;
+
 public:
-       void apply(Stage &s) { s.content.visit(*this); }
+       BlockHierarchyResolver(): r_any_resolved(false) { }
+
+       bool apply(Stage &s) { r_any_resolved = false; s.content.visit(*this); return r_any_resolved; }
 
 private:
        virtual void enter(Block &);
@@ -63,14 +68,16 @@ private:
        std::map<TypeDeclaration *, TypeDeclaration *> alias_map;
        std::map<TypeDeclaration *, TypeDeclaration *> array_types;
        NodeList<Statement>::iterator type_insert_point;
+       bool r_any_resolved;
 
 public:
        TypeResolver();
 
-       void apply(Stage &);
+       bool apply(Stage &);
 
 private:
-       TypeDeclaration *resolve_type(const std::string &);
+       TypeDeclaration *get_or_create_array_type(TypeDeclaration &);
+       void resolve_type(TypeDeclaration *&, const std::string &, bool);
        virtual void visit(Block &);
        virtual void visit(BasicTypeDeclaration &);
        virtual void visit(ImageTypeDeclaration &);
@@ -85,7 +92,7 @@ class VariableResolver: private TraversingVisitor
 {
 private:
        Stage *stage;
-       RefPtr<InterfaceBlockReference> r_iface_ref;
+       RefPtr<Expression> r_replacement_expr;
        std::string block_interface;
        bool r_any_resolved;
        bool record_target;
@@ -99,6 +106,7 @@ public:
 
 private:
        virtual void enter(Block &);
+       void visit_and_replace(RefPtr<Expression> &);
        virtual void visit(VariableReference &);
        virtual void visit(InterfaceBlockReference &);
        virtual void visit(MemberAccess &);
@@ -149,6 +157,7 @@ private:
        virtual void visit(InterfaceBlockReference &);
        virtual void visit(MemberAccess &);
        virtual void visit(UnaryExpression &);
+       void visit(BinaryExpression &, bool);
        virtual void visit(BinaryExpression &);
        virtual void visit(Assignment &);
        virtual void visit(FunctionCall &);
@@ -162,9 +171,10 @@ class FunctionResolver: private TraversingVisitor
 private:
        Stage *stage;
        std::map<std::string, std::vector<FunctionDeclaration *> > declarations;
+       bool r_any_resolved;
 
 public:
-       void apply(Stage &);
+       bool apply(Stage &);
 
 private:
        virtual void visit(FunctionCall &);