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)
private:
Stage *stage;
std::map<TypeDeclaration *, TypeDeclaration *> alias_map;
+ std::map<TypeDeclaration *, TypeDeclaration *> array_types;
+ NodeList<Statement>::iterator type_insert_point;
public:
TypeResolver();
private:
TypeDeclaration *resolve_type(const std::string &);
+ virtual void visit(Block &);
virtual void visit(BasicTypeDeclaration &);
virtual void visit(ImageTypeDeclaration &);
virtual void visit(StructDeclaration &);
}
if(!var.precision.empty())
append(format("%s ", var.precision));
- append(format("%s %s", var.type_declaration->name, var.name));
+ string type_name = var.type_declaration->name;
+ if(var.array)
+ type_name = type_name.substr(0, type_name.find('['));
+ append(format("%s %s", type_name, var.name));
if(var.array)
{
append('[');