+ bool apply(Stage &);
+
+private:
+ virtual void enter(Block &);
+ virtual void visit(RefPtr<Expression> &);
+ void check_assignment_target(Statement *);
+ virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
+ void add_to_chain(Assignment::Target::ChainType, unsigned);
+ virtual void visit(MemberAccess &);
+ virtual void visit(Swizzle &);
+ virtual void visit(BinaryExpression &);
+ virtual void visit(Assignment &);
+ void merge_layouts(Layout &, const Layout &);
+ virtual void visit(VariableDeclaration &);
+ 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
+ };
+
+ struct ArgumentInfo
+ {
+ BasicTypeDeclaration *type;
+ unsigned component_count;
+ };
+
+ Stage *stage;
+ std::vector<BasicTypeDeclaration *> basic_types;
+ NodeList<Statement>::iterator insert_point;
+ bool r_any_resolved;
+
+public:
+ ExpressionResolver();
+
+ bool apply(Stage &);