var.type_declaration = i->second;
}
+void TypeResolver::visit(FunctionDeclaration &func)
+{
+ map<string, TypeDeclaration *>::iterator i = stage->types.find(func.return_type);
+ func.return_type_declaration = (i!=stage->types.end() ? i->second : 0);
+ TraversingVisitor::visit(func);
+}
+
VariableResolver::VariableResolver():
stage(0),
var.declaration = i->second;
}
- if(var.declaration)
- {
- if(StructDeclaration *strct = dynamic_cast<StructDeclaration *>(var.declaration->type_declaration))
- r_members = &strct->members.variables;
- }
- else
+ if(!var.declaration)
{
const map<string, InterfaceBlock *> &blocks = stage->interface_blocks;
map<string, InterfaceBlock *>::const_iterator i = blocks.find("_"+var.name);
/* The name refers to an interface block with an instance name rather
than a variable. Prepare a new syntax tree node accordingly. */
r_iface_ref = new InterfaceBlockReference;
+ r_iface_ref->source = var.source;
+ r_iface_ref->line = var.line;
r_iface_ref->name = var.name;
r_iface_ref->declaration = i->second;
r_members = &i->second->members.variables;
}
}
+ if(var.declaration)
+ if(StructDeclaration *strct = dynamic_cast<StructDeclaration *>(var.declaration->type_declaration))
+ r_members = &strct->members.variables;
+
if(record_target)
{
if(r_assignment_target)