]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.h
Assign a result type to all expressions
[libs/gl.git] / source / glsl / generate.h
index d303af3664b3294c74209b6dce738b999c8213ff..ddf2b5f629cb0a8aadedd76dd0eab5041dfe1fa4 100644 (file)
@@ -60,6 +60,9 @@ class TypeResolver: private TraversingVisitor
 {
 private:
        Stage *stage;
+       std::map<TypeDeclaration *, TypeDeclaration *> alias_map;
+       std::map<TypeDeclaration *, TypeDeclaration *> array_types;
+       NodeList<Statement>::iterator type_insert_point;
 
 public:
        TypeResolver();
@@ -67,10 +70,13 @@ public:
        void apply(Stage &);
 
 private:
+       TypeDeclaration *resolve_type(const std::string &);
+       virtual void visit(Block &);
        virtual void visit(BasicTypeDeclaration &);
        virtual void visit(ImageTypeDeclaration &);
        virtual void visit(StructDeclaration &);
        virtual void visit(VariableDeclaration &);
+       virtual void visit(FunctionDeclaration &);
 };
 
 /** Resolves variable references.  Variable references which match the name
@@ -104,6 +110,48 @@ private:
        virtual void visit(InterfaceBlock &);
 };
 
+/** Resolves types and lvalueness of expressions. */
+class ExpressionResolver: private TraversingVisitor
+{
+private:
+       enum Compatibility
+       {
+               NOT_COMPATIBLE,
+               LEFT_CONVERTIBLE,
+               RIGHT_CONVERTIBLE,
+               SAME_TYPE
+       };
+
+       Stage *stage;
+       std::vector<BasicTypeDeclaration *> basic_types;
+
+public:
+       void apply(Stage &s) { stage = &s; s.content.visit(*this); }
+
+private:
+       static bool is_scalar(BasicTypeDeclaration &);
+       static bool is_vector_or_matrix(BasicTypeDeclaration &);
+       static BasicTypeDeclaration *get_element_type(BasicTypeDeclaration &);
+       static bool can_convert(BasicTypeDeclaration &, BasicTypeDeclaration &);
+       static Compatibility get_compatibility(BasicTypeDeclaration &, BasicTypeDeclaration &);
+       BasicTypeDeclaration *find_type(BasicTypeDeclaration::Kind, unsigned);
+       BasicTypeDeclaration *find_type(BasicTypeDeclaration &, BasicTypeDeclaration::Kind, unsigned);
+       void convert_to(RefPtr<Expression> &, BasicTypeDeclaration &);
+       bool convert_to_element(RefPtr<Expression> &, BasicTypeDeclaration &);
+
+       virtual void visit(Literal &);
+       virtual void visit(ParenthesizedExpression &);
+       virtual void visit(VariableReference &);
+       virtual void visit(InterfaceBlockReference &);
+       virtual void visit(MemberAccess &);
+       virtual void visit(UnaryExpression &);
+       virtual void visit(BinaryExpression &);
+       virtual void visit(Assignment &);
+       virtual void visit(FunctionCall &);
+       virtual void visit(BasicTypeDeclaration &);
+       virtual void visit(VariableDeclaration &);
+};
+
 /** Resolves function declarations and calls. */
 class FunctionResolver: private TraversingVisitor
 {