1 #ifndef MSP_GL_SL_GENERATE_H_
2 #define MSP_GL_SL_GENERATE_H_
14 class DeclarationCombiner: private TraversingVisitor
17 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
18 std::map<std::string, VariableDeclaration *> variables;
19 std::set<Node *> nodes_to_remove;
25 virtual void visit(Block &);
26 virtual void visit(FunctionDeclaration &);
27 virtual void visit(VariableDeclaration &);
30 class BlockResolver: private TraversingVisitor
33 void apply(Stage &s) { s.content.visit(*this); }
36 virtual void visit(Block &);
37 virtual void visit(InterfaceBlock &);
40 class VariableResolver: private TraversingVisitor
44 StructDeclaration *type;
45 std::string block_interface;
47 VariableDeclaration *assignment_target;
48 bool self_referencing;
56 Block *next_block(Block &);
58 virtual void visit(Block &);
59 virtual void visit(VariableReference &);
60 virtual void visit(MemberAccess &);
61 virtual void visit(BinaryExpression &);
62 virtual void visit(Assignment &);
63 virtual void visit(StructDeclaration &);
64 virtual void visit(VariableDeclaration &);
65 virtual void visit(InterfaceBlock &);
66 virtual void visit(FunctionDeclaration &);
67 virtual void visit(Iteration &);
70 class FunctionResolver: private TraversingVisitor
73 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
76 void apply(Stage &s) { s.content.visit(*this); }
79 virtual void visit(FunctionCall &);
80 virtual void visit(FunctionDeclaration &);
83 class InterfaceGenerator: private TraversingVisitor
87 std::string in_prefix;
88 std::string out_prefix;
89 NodeList<Statement>::iterator iface_insert_point;
90 NodeList<Statement>::iterator assignment_insert_point;
91 std::set<Node *> nodes_to_remove;
99 static std::string get_out_prefix(Stage::Type);
100 std::string change_prefix(const std::string &, const std::string &) const;
101 virtual void visit(Block &);
102 bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
103 ExpressionStatement &insert_assignment(const std::string &, Expression *);
104 virtual void visit(VariableReference &);
105 virtual void visit(VariableDeclaration &);
106 virtual void visit(Passthrough &);
109 class DeclarationReorderer: private TraversingVisitor
121 DeclarationKind kind;
122 std::set<Node *> ordered_funcs;
123 std::set<Node *> needed_funcs;
126 DeclarationReorderer();
128 void apply(Stage &s) { s.content.visit(*this); }
131 virtual void visit(Block &);
132 virtual void visit(FunctionCall &);
133 virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
134 virtual void visit(StructDeclaration &) { kind = STRUCT; }
135 virtual void visit(VariableDeclaration &);
136 virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
137 virtual void visit(FunctionDeclaration &);