return 0;
}
+void TypeResolver::visit(Block &block)
+{
+ for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+ {
+ if(!block.parent)
+ type_insert_point = i;
+ (*i)->visit(*this);
+ }
+}
+
void TypeResolver::visit(BasicTypeDeclaration &type)
{
type.base_type = resolve_type(type.base);
if(type.kind==BasicTypeDeclaration::ALIAS && type.base_type)
alias_map[&type] = type.base_type;
+ else if(type.kind==BasicTypeDeclaration::ARRAY && type.base_type)
+ array_types[type.base_type] = &type;
stage->types.insert(make_pair(type.name, &type));
}
void TypeResolver::visit(VariableDeclaration &var)
{
- var.type_declaration = resolve_type(var.type);
+ TypeDeclaration *type = resolve_type(var.type);
+ if(var.array && type)
+ {
+ map<TypeDeclaration *, TypeDeclaration *>::iterator i = array_types.find(type);
+ if(i==array_types.end())
+ {
+ BasicTypeDeclaration *array = new BasicTypeDeclaration;
+ array->source = BUILTIN_SOURCE;
+ array->name = type->name+"[]";
+ array->kind = BasicTypeDeclaration::ARRAY;
+ array->base = type->name;
+ array->base_type = type;
+ stage->content.body.insert(type_insert_point, array);
+ array->visit(*this);
+ type = array;
+ }
+ else
+ type = i->second;
+ }
+ var.type_declaration = type;
}
void TypeResolver::visit(FunctionDeclaration &func)