class InlineableFunctionLocator: private TraversingVisitor
{
private:
std::map<FunctionDeclaration *, unsigned> refcounts;
std::set<FunctionDeclaration *> inlineable;
class InlineableFunctionLocator: private TraversingVisitor
{
private:
std::map<FunctionDeclaration *, unsigned> refcounts;
std::set<FunctionDeclaration *> inlineable;
-/** Collects declarations referenced by a function. */
-class InlineDependencyCollector: private TraversingVisitor
+/** Injects statements from one function into another. Local variables are
+renamed to avoid conflicts. After inlining, uses NodeReorderer to cause
+dependencies of the inlined statements to appear before the target function. */
+class InlineContentInjector: private TraversingVisitor
- const std::set<Node *> &apply(FunctionDeclaration &f) { f.visit(*this); return dependencies; }
+ InlineContentInjector();
+
+ const std::string &apply(Stage &, FunctionDeclaration &, Block &, const NodeList<Statement>::iterator &, FunctionDeclaration &);
virtual void visit(VariableReference &);
virtual void visit(InterfaceBlockReference &);
virtual void visit(FunctionCall &);
virtual void visit(VariableDeclaration &);
virtual void visit(VariableReference &);
virtual void visit(InterfaceBlockReference &);
virtual void visit(FunctionCall &);
virtual void visit(VariableDeclaration &);
virtual void visit(BinaryExpression &);
virtual void visit(MemberAccess &);
virtual void visit(FunctionCall &);
virtual void visit(BinaryExpression &);
virtual void visit(MemberAccess &);
virtual void visit(FunctionCall &);
std::map<VariableDeclaration *, Node *> aggregates;
Node *aggregate;
std::vector<BlockVariableMap> variables;
std::map<VariableDeclaration *, Node *> aggregates;
Node *aggregate;
std::vector<BlockVariableMap> variables;
virtual void visit(VariableReference &);
virtual void visit(InterfaceBlockReference &);
virtual void visit(MemberAccess &);
virtual void visit(VariableReference &);
virtual void visit(InterfaceBlockReference &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
void record_assignment(VariableDeclaration &, Node &, bool);
void clear_assignments(VariableInfo &, bool);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
void record_assignment(VariableDeclaration &, Node &, bool);
void clear_assignments(VariableInfo &, bool);
virtual void visit(ExpressionStatement &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
virtual void visit(ExpressionStatement &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);