+/** Inlines functions. Internally uses InlineableFunctionLocator to find
+candidate functions. Only functions which consist of a single return statement
+are inlined. */
+class FunctionInliner: private TraversingVisitor
+{
+private:
+ Stage *stage;
+ std::set<FunctionDeclaration *> inlineable;
+ FunctionDeclaration *current_function;
+ NodeList<Statement>::iterator insert_point;
+ RefPtr<Expression> r_inline_result;
+ bool r_any_inlined;
+
+public:
+ FunctionInliner();
+
+ bool apply(Stage &);
+
+private:
+ virtual void visit(RefPtr<Expression> &);
+ virtual void visit(Block &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(FunctionDeclaration &);
+ virtual void visit(Iteration &);
+};
+
+/** Inlines variables into expressions. Variables with trivial values (those
+consisting of a single literal or variable reference) are always inlined.
+Variables which are only referenced once are also inlined. */
+class ExpressionInliner: private TraversingVisitor