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 ConstantSpecializer: private TraversingVisitor
33 const std::map<std::string, int> *values;
36 ConstantSpecializer();
38 void apply(Stage &, const std::map<std::string, int> *);
41 virtual void visit(VariableDeclaration &);
44 class BlockResolver: private TraversingVisitor
47 void apply(Stage &s) { s.content.visit(*this); }
50 virtual void enter(Block &);
53 class VariableResolver: private TraversingVisitor
58 std::map<std::string, VariableDeclaration *> *members;
59 RefPtr<InterfaceBlockReference> iface_ref;
60 std::string block_interface;
62 VariableDeclaration *assignment_target;
63 bool self_referencing;
71 Block *next_block(Block &);
73 virtual void enter(Block &);
74 virtual void visit(VariableReference &);
75 virtual void visit(InterfaceBlockReference &);
76 virtual void visit(MemberAccess &);
77 virtual void visit(BinaryExpression &);
78 virtual void visit(Assignment &);
79 virtual void visit(StructDeclaration &);
80 virtual void visit(VariableDeclaration &);
81 virtual void visit(InterfaceBlock &);
84 class FunctionResolver: private TraversingVisitor
87 std::map<std::string, std::vector<FunctionDeclaration *> > functions;
90 void apply(Stage &s) { s.content.visit(*this); }
93 virtual void visit(FunctionCall &);
94 virtual void visit(FunctionDeclaration &);
97 class InterfaceGenerator: private TraversingVisitor
101 std::string in_prefix;
102 std::string out_prefix;
104 InterfaceBlock *iface_block;
106 Block *iface_target_block;
107 NodeList<Statement>::iterator iface_insert_point;
108 NodeList<Statement>::iterator assignment_insert_point;
109 std::set<Node *> nodes_to_remove;
112 InterfaceGenerator();
117 static std::string get_out_prefix(Stage::Type);
118 std::string change_prefix(const std::string &, const std::string &) const;
119 virtual void visit(Block &);
120 bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
121 bool generate_interface(InterfaceBlock &);
122 ExpressionStatement &insert_assignment(const std::string &, Expression *);
123 virtual void visit(VariableReference &);
124 virtual void visit(VariableDeclaration &);
125 virtual void visit(InterfaceBlock &);
126 virtual void visit(FunctionDeclaration &);
127 virtual void visit(Passthrough &);
130 class DeclarationReorderer: private TraversingVisitor
142 DeclarationKind kind;
143 std::set<Node *> ordered_funcs;
144 std::set<Node *> needed_funcs;
147 DeclarationReorderer();
149 void apply(Stage &s) { s.content.visit(*this); }
152 virtual void visit(Block &);
153 virtual void visit(FunctionCall &);
154 virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
155 virtual void visit(StructDeclaration &) { kind = STRUCT; }
156 virtual void visit(VariableDeclaration &);
157 virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
158 virtual void visit(FunctionDeclaration &);