1 #ifndef MSP_GL_SL_GENERATE_H_
2 #define MSP_GL_SL_GENERATE_H_
14 class DeclarationCombiner: public BlockModifier
18 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
19 std::map<std::string, VariableDeclaration *> variables;
22 DeclarationCombiner();
24 void apply(Stage &s) { visit(s.content); }
26 using BlockModifier::visit;
27 virtual void visit(Block &);
28 virtual void visit(FunctionDeclaration &);
29 virtual void visit(VariableDeclaration &);
32 class VariableResolver: public TraversingVisitor
35 std::vector<Block *> blocks;
36 StructDeclaration *type;
38 std::string block_interface;
40 VariableDeclaration *assignment_target;
41 bool self_referencing;
48 using TraversingVisitor::visit;
49 virtual void visit(Block &);
50 virtual void visit(VariableReference &);
51 virtual void visit(MemberAccess &);
52 virtual void visit(BinaryExpression &);
53 virtual void visit(Assignment &);
54 virtual void visit(StructDeclaration &);
55 virtual void visit(VariableDeclaration &);
56 virtual void visit(InterfaceBlock &);
59 class FunctionResolver: public TraversingVisitor
62 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
65 void apply(Stage &s) { visit(s.content); }
67 using TraversingVisitor::visit;
68 virtual void visit(FunctionCall &);
69 virtual void visit(FunctionDeclaration &);
72 class InterfaceGenerator: public BlockModifier
76 std::string in_prefix;
77 std::string out_prefix;
79 std::map<std::string, RefPtr<VariableDeclaration> > iface_declarations;
86 static std::string get_out_prefix(Stage::Type);
87 using BlockModifier::visit;
88 virtual void visit(Block &);
89 std::string change_prefix(const std::string &, const std::string &) const;
90 bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
91 ExpressionStatement &insert_assignment(const std::string &, Expression *);
92 virtual void visit(VariableReference &);
93 virtual void visit(VariableDeclaration &);
94 virtual void visit(Passthrough &);
97 class DeclarationReorderer: public TraversingVisitor
109 unsigned scope_level;
110 DeclarationKind kind;
111 std::set<Node *> ordered_funcs;
112 std::set<Node *> needed_funcs;
115 DeclarationReorderer();
117 void apply(Stage &s) { visit(s.content); }
119 using TraversingVisitor::visit;
120 virtual void visit(Block &);
121 virtual void visit(FunctionCall &);
122 virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
123 virtual void visit(StructDeclaration &) { kind = STRUCT; }
124 virtual void visit(VariableDeclaration &);
125 virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
126 virtual void visit(FunctionDeclaration &);