]> 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 54e39f39aa0679088ea7d18dd98192c32645f07c..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 &);
@@ -164,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 &);