X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramsyntax.cpp;h=47b59f6c8900868c21f91c633cf2c4b512da55e4;hp=f87488dc7a2b530a56c38841965430c0973f5738;hb=d901696935a6bf9fdad6ac8abe65ffab79bd297d;hpb=a0caabaed3aeb8947133d78986bfb4ae5ae3c893 diff --git a/source/programsyntax.cpp b/source/programsyntax.cpp index f87488dc..47b59f6c 100644 --- a/source/programsyntax.cpp +++ b/source/programsyntax.cpp @@ -6,6 +6,15 @@ namespace Msp { namespace GL { namespace ProgramSyntax { +template +NodeContainer::NodeContainer(const NodeContainer &c): + C(c) +{ + for(typename C::iterator i=this->begin(); i!=this->end(); ++i) + *i = (*i)->clone(); +} + + Block::Block(): use_braces(false) { } @@ -72,6 +81,7 @@ void Assignment::visit(NodeVisitor &visitor) FunctionCall::FunctionCall(): + declaration(0), constructor(false) { } @@ -93,12 +103,24 @@ void Import::visit(NodeVisitor &visitor) } +void Precision::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + void Layout::visit(NodeVisitor &visitor) { visitor.visit(*this); } +void InterfaceLayout::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + StructDeclaration::StructDeclaration() { members.use_braces = true; @@ -177,6 +199,12 @@ void Return::visit(NodeVisitor &visitor) } +void Jump::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + void NodeVisitor::visit(Assignment &assign) { visit(static_cast(assign)); @@ -185,7 +213,7 @@ void NodeVisitor::visit(Assignment &assign) void TraversingVisitor::visit(Block &block) { - for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) + for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) (*i)->visit(*this); } @@ -212,7 +240,7 @@ void TraversingVisitor::visit(BinaryExpression &binary) void TraversingVisitor::visit(FunctionCall &call) { - for(vector >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) + for(vector >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) (*i)->visit(*this); } @@ -221,6 +249,11 @@ void TraversingVisitor::visit(ExpressionStatement &expr) expr.expression->visit(*this); } +void TraversingVisitor::visit(InterfaceLayout &layout) +{ + layout.layout.visit(*this); +} + void TraversingVisitor::visit(StructDeclaration &strct) { strct.members.visit(*this); @@ -228,6 +261,8 @@ void TraversingVisitor::visit(StructDeclaration &strct) void TraversingVisitor::visit(VariableDeclaration &var) { + if(var.layout) + var.layout->visit(*this); if(var.init_expression) var.init_expression->visit(*this); if(var.array_size) @@ -241,7 +276,7 @@ void TraversingVisitor::visit(InterfaceBlock &iface) void TraversingVisitor::visit(FunctionDeclaration &func) { - for(vector >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) + for(vector >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) (*i)->visit(*this); func.body.visit(*this); } @@ -255,7 +290,8 @@ void TraversingVisitor::visit(Conditional &cond) void TraversingVisitor::visit(Iteration &iter) { - iter.init_statement->visit(*this); + if(iter.init_statement) + iter.init_statement->visit(*this); if(iter.condition) iter.condition->visit(*this); if(iter.loop_expression)