1 #ifndef MSP_GL_SL_GENERATE_H_
2 #define MSP_GL_SL_GENERATE_H_
14 class DeclarationCombiner: private 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); }
27 virtual void visit(Block &);
28 virtual void visit(FunctionDeclaration &);
29 virtual void visit(VariableDeclaration &);
30 using BlockModifier::visit;
33 class VariableResolver: private TraversingVisitor
36 std::vector<Block *> blocks;
37 StructDeclaration *type;
39 std::string block_interface;
41 VariableDeclaration *assignment_target;
42 bool self_referencing;
50 virtual void visit(Block &);
51 virtual void visit(VariableReference &);
52 virtual void visit(MemberAccess &);
53 virtual void visit(BinaryExpression &);
54 virtual void visit(Assignment &);
55 virtual void visit(StructDeclaration &);
56 virtual void visit(VariableDeclaration &);
57 virtual void visit(InterfaceBlock &);
58 using TraversingVisitor::visit;
61 class FunctionResolver: private TraversingVisitor
64 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
67 void apply(Stage &s) { visit(s.content); }
70 virtual void visit(FunctionCall &);
71 virtual void visit(FunctionDeclaration &);
72 using TraversingVisitor::visit;
75 class InterfaceGenerator: private BlockModifier
79 std::string in_prefix;
80 std::string out_prefix;
82 std::map<std::string, RefPtr<VariableDeclaration> > iface_declarations;
90 static std::string get_out_prefix(Stage::Type);
91 std::string change_prefix(const std::string &, const std::string &) const;
92 virtual void visit(Block &);
93 bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
94 ExpressionStatement &insert_assignment(const std::string &, Expression *);
95 virtual void visit(VariableReference &);
96 virtual void visit(VariableDeclaration &);
97 virtual void visit(Passthrough &);
98 using BlockModifier::visit;
101 class DeclarationReorderer: private TraversingVisitor
113 unsigned scope_level;
114 DeclarationKind kind;
115 std::set<Node *> ordered_funcs;
116 std::set<Node *> needed_funcs;
119 DeclarationReorderer();
121 void apply(Stage &s) { visit(s.content); }
124 virtual void visit(Block &);
125 virtual void visit(FunctionCall &);
126 virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
127 virtual void visit(StructDeclaration &) { kind = STRUCT; }
128 virtual void visit(VariableDeclaration &);
129 virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
130 virtual void visit(FunctionDeclaration &);
131 using TraversingVisitor::visit;