/** Forms links between nested blocks in the syntax tree. */
class BlockHierarchyResolver: private TraversingVisitor
{
+private:
+ bool r_any_resolved;
+
public:
- void apply(Stage &s) { s.content.visit(*this); }
+ BlockHierarchyResolver(): r_any_resolved(false) { }
+
+ bool apply(Stage &s) { r_any_resolved = false; s.content.visit(*this); return r_any_resolved; }
private:
virtual void enter(Block &);
std::map<TypeDeclaration *, TypeDeclaration *> alias_map;
std::map<TypeDeclaration *, TypeDeclaration *> array_types;
NodeList<Statement>::iterator type_insert_point;
+ bool r_any_resolved;
public:
TypeResolver();
- void apply(Stage &);
+ bool apply(Stage &);
private:
- TypeDeclaration *resolve_type(const std::string &);
+ TypeDeclaration *get_or_create_array_type(TypeDeclaration &);
+ void resolve_type(TypeDeclaration *&, const std::string &, bool);
virtual void visit(Block &);
virtual void visit(BasicTypeDeclaration &);
virtual void visit(ImageTypeDeclaration &);
private:
Stage *stage;
std::map<std::string, std::vector<FunctionDeclaration *> > declarations;
+ bool r_any_resolved;
public:
- void apply(Stage &);
+ bool apply(Stage &);
private:
virtual void visit(FunctionCall &);