]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Handle expression replacement through TraversingVisitor
[libs/gl.git] / source / glsl / generate.cpp
index 8547152e45df9edb714f06ae8c2c83cccae40350..1f229991f7b2427e45b7fe511099dd2a894774c5 100644 (file)
@@ -274,7 +274,7 @@ void VariableResolver::enter(Block &block)
        block.variables.clear();
 }
 
-void VariableResolver::visit_and_replace(RefPtr<Expression> &expr)
+void VariableResolver::visit(RefPtr<Expression> &expr)
 {
        r_replacement_expr = 0;
        expr->visit(*this);
@@ -376,7 +376,7 @@ void VariableResolver::add_to_chain(Assignment::Target::ChainType type, unsigned
 
 void VariableResolver::visit(MemberAccess &memacc)
 {
-       visit_and_replace(memacc.left);
+       TraversingVisitor::visit(memacc);
 
        VariableDeclaration *declaration = 0;
        if(StructDeclaration *strct = dynamic_cast<StructDeclaration *>(memacc.left->type))
@@ -430,7 +430,7 @@ void VariableResolver::visit(MemberAccess &memacc)
 
 void VariableResolver::visit(Swizzle &swizzle)
 {
-       visit_and_replace(swizzle.left);
+       TraversingVisitor::visit(swizzle);
 
        if(record_target)
        {
@@ -441,11 +441,6 @@ void VariableResolver::visit(Swizzle &swizzle)
        }
 }
 
-void VariableResolver::visit(UnaryExpression &unary)
-{
-       visit_and_replace(unary.expression);
-}
-
 void VariableResolver::visit(BinaryExpression &binary)
 {
        if(binary.oper->token[0]=='[')
@@ -454,9 +449,9 @@ void VariableResolver::visit(BinaryExpression &binary)
                        /* The subscript expression is not a part of the primary assignment
                        target. */
                        SetFlag set(record_target, false);
-                       visit_and_replace(binary.right);
+                       visit(binary.right);
                }
-               visit_and_replace(binary.left);
+               visit(binary.left);
 
                if(record_target)
                {
@@ -468,10 +463,7 @@ void VariableResolver::visit(BinaryExpression &binary)
                }
        }
        else
-       {
-               visit_and_replace(binary.left);
-               visit_and_replace(binary.right);
-       }
+               TraversingVisitor::visit(binary);
 }
 
 void VariableResolver::visit(Assignment &assign)
@@ -479,30 +471,19 @@ void VariableResolver::visit(Assignment &assign)
        {
                SetFlag set(record_target);
                r_assignment_target = Assignment::Target();
-               visit_and_replace(assign.left);
+               visit(assign.left);
                r_any_resolved |= (r_assignment_target<assign.target || assign.target<r_assignment_target);
                assign.target = r_assignment_target;
        }
 
        r_self_referencing = false;
-       visit_and_replace(assign.right);
+       visit(assign.right);
        assign.self_referencing = (r_self_referencing || assign.oper->token[0]!='=');
 }
 
-void VariableResolver::visit(FunctionCall &call)
-{
-       for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
-               visit_and_replace(*i);
-}
-
 void VariableResolver::visit(VariableDeclaration &var)
 {
-       if(var.layout)
-               var.layout->visit(*this);
-       if(var.array_size)
-               visit_and_replace(var.array_size);
-       if(var.init_expression)
-               visit_and_replace(var.init_expression);
+       TraversingVisitor::visit(var);
        current_block->variables.insert(make_pair(var.name, &var));
 }