1 #ifndef MSP_GL_SL_GENERATE_H_
2 #define MSP_GL_SL_GENERATE_H_
14 class DeclarationCombiner: private TraversingVisitor
18 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
19 std::map<std::string, VariableDeclaration *> variables;
20 std::set<Node *> nodes_to_remove;
23 DeclarationCombiner();
28 virtual void visit(Block &);
29 virtual void visit(FunctionDeclaration &);
30 virtual void visit(VariableDeclaration &);
31 using TraversingVisitor::visit;
34 class VariableResolver: private TraversingVisitor
37 std::vector<Block *> blocks;
38 StructDeclaration *type;
40 std::string block_interface;
42 VariableDeclaration *assignment_target;
43 bool self_referencing;
51 virtual void visit(Block &);
52 virtual void visit(VariableReference &);
53 virtual void visit(MemberAccess &);
54 virtual void visit(BinaryExpression &);
55 virtual void visit(Assignment &);
56 virtual void visit(StructDeclaration &);
57 virtual void visit(VariableDeclaration &);
58 virtual void visit(InterfaceBlock &);
59 virtual void visit(FunctionDeclaration &);
60 virtual void visit(Iteration &);
61 using TraversingVisitor::visit;
64 class FunctionResolver: private TraversingVisitor
67 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
70 void apply(Stage &s) { visit(s.content); }
73 virtual void visit(FunctionCall &);
74 virtual void visit(FunctionDeclaration &);
75 using TraversingVisitor::visit;
78 class InterfaceGenerator: private TraversingVisitor
82 std::string in_prefix;
83 std::string out_prefix;
86 NodeList<Statement>::iterator iface_insert_point;
87 NodeList<Statement>::iterator assignment_insert_point;
88 std::set<Node *> nodes_to_remove;
96 static std::string get_out_prefix(Stage::Type);
97 std::string change_prefix(const std::string &, const std::string &) const;
98 virtual void visit(Block &);
99 bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
100 ExpressionStatement &insert_assignment(const std::string &, Expression *);
101 virtual void visit(VariableReference &);
102 virtual void visit(VariableDeclaration &);
103 virtual void visit(Passthrough &);
104 using TraversingVisitor::visit;
107 class DeclarationReorderer: private TraversingVisitor
119 unsigned scope_level;
120 DeclarationKind kind;
121 std::set<Node *> ordered_funcs;
122 std::set<Node *> needed_funcs;
125 DeclarationReorderer();
127 void apply(Stage &s) { visit(s.content); }
130 virtual void visit(Block &);
131 virtual void visit(FunctionCall &);
132 virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
133 virtual void visit(StructDeclaration &) { kind = STRUCT; }
134 virtual void visit(VariableDeclaration &);
135 virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
136 virtual void visit(FunctionDeclaration &);
137 using TraversingVisitor::visit;