-void VariableResolver::visit(BinaryExpression &binary)
-{
- if(binary.oper=="[")
- {
- {
- SetForScope<bool> set(record_target, false);
- binary.right->visit(*this);
- }
- members = 0;
- iface_ref = 0;
- binary.left->visit(*this);
- if(iface_ref)
- binary.left = iface_ref;
- iface_ref = 0;
- }
- else
- {
- TraversingVisitor::visit(binary);
- members = 0;
- }
-}
-
-void VariableResolver::visit(Assignment &assign)
-{
- {
- SetFlag set(record_target);
- assignment_target = 0;
- assign.left->visit(*this);
- }
-
- self_referencing = false;
- assign.right->visit(*this);
-
- assign.self_referencing = (self_referencing || assign.oper!="=");
- assign.target_declaration = assignment_target;
-}
-
-void VariableResolver::visit(StructDeclaration &strct)
-{
- TraversingVisitor::visit(strct);
- stage->types[strct.name] = &strct;
-}
-
-void VariableResolver::visit(VariableDeclaration &var)
-{
- map<string, StructDeclaration *>::iterator i = stage->types.find(var.type);
- if(i!=stage->types.end())
- var.type_declaration = i->second;
-
- if(!block_interface.empty() && var.interface.empty())
- var.interface = block_interface;
-
- TraversingVisitor::visit(var);
- current_block->variables[var.name] = &var;
-}
-
-void VariableResolver::visit(InterfaceBlock &iface)
-{
- /* Block names can't be used for any other identifiers so we can put them
- in the same map with instance names. */
- stage->interface_blocks[iface.name] = &iface;
- if(!iface.instance_name.empty())
- stage->interface_blocks[iface.instance_name] = &iface;
-
- SetForScope<string> set_iface(block_interface, iface.interface);
- TraversingVisitor::visit(iface);
-}
-
-
-void FunctionResolver::apply(Stage &s)
-{
- stage = &s;
- s.functions.clear();
- s.content.visit(*this);
-}
-
-void FunctionResolver::visit(FunctionCall &call)