virtual void visit(Block &);
virtual void visit(FunctionDeclaration &);
virtual void visit(VariableDeclaration &);
- using TraversingVisitor::visit;
};
class BlockResolver: private TraversingVisitor
{
public:
- void apply(Stage &s) { visit(s.content); }
+ void apply(Stage &s) { s.content.visit(*this); }
private:
- virtual void visit(Block &);
+ virtual void enter(Block &);
virtual void visit(InterfaceBlock &);
- using TraversingVisitor::visit;
};
class VariableResolver: private TraversingVisitor
{
private:
Block *builtins;
- StructDeclaration *type;
+ std::map<std::string, VariableDeclaration *> *members;
+ RefPtr<InterfaceBlockReference> iface_ref;
std::string block_interface;
bool record_target;
VariableDeclaration *assignment_target;
private:
Block *next_block(Block &);
- virtual void visit(Block &);
+ virtual void enter(Block &);
virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
virtual void visit(InterfaceBlock &);
- virtual void visit(FunctionDeclaration &);
- virtual void visit(Iteration &);
- using TraversingVisitor::visit;
};
class FunctionResolver: private TraversingVisitor
std::map<std::string, std::vector<FunctionDeclaration *> > functions;
public:
- void apply(Stage &s) { visit(s.content); }
+ void apply(Stage &s) { s.content.visit(*this); }
private:
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
- using TraversingVisitor::visit;
};
class InterfaceGenerator: private TraversingVisitor
Stage *stage;
std::string in_prefix;
std::string out_prefix;
+ bool function_scope;
+ InterfaceBlock *iface_block;
NodeList<Statement>::iterator iface_insert_point;
NodeList<Statement>::iterator assignment_insert_point;
std::set<Node *> nodes_to_remove;
ExpressionStatement &insert_assignment(const std::string &, Expression *);
virtual void visit(VariableReference &);
virtual void visit(VariableDeclaration &);
+ virtual void visit(InterfaceBlock &);
+ virtual void visit(FunctionDeclaration &);
virtual void visit(Passthrough &);
- using TraversingVisitor::visit;
};
class DeclarationReorderer: private TraversingVisitor
public:
DeclarationReorderer();
- void apply(Stage &s) { visit(s.content); }
+ void apply(Stage &s) { s.content.visit(*this); }
private:
virtual void visit(Block &);
virtual void visit(VariableDeclaration &);
virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
virtual void visit(FunctionDeclaration &);
- using TraversingVisitor::visit;
};
} // namespace SL