struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor
{
- std::set<ProgramSyntax::VariableDeclaration *> unused_variables;
+ ProgramSyntax::Context *context;
+ std::set<ProgramSyntax::Node *> unused_nodes;
+ std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> assignments;
+ bool assignment;
+ ProgramSyntax::VariableDeclaration *assignment_target;
+
+ UnusedVariableLocator();
+ void visit(ProgramSyntax::Context &);
virtual void visit(ProgramSyntax::VariableReference &);
virtual void visit(ProgramSyntax::MemberAccess &);
+ virtual void visit(ProgramSyntax::BinaryExpression &);
+ virtual void visit(ProgramSyntax::ExpressionStatement &);
virtual void visit(ProgramSyntax::VariableDeclaration &);
};
struct NodeRemover: ProgramSyntax::TraversingVisitor
{
+ ProgramSyntax::Context *context;
std::set<ProgramSyntax::Node *> to_remove;
unsigned n_removed;
bool immutable_block;
NodeRemover();
+ void visit(ProgramSyntax::Context &);
virtual void visit(ProgramSyntax::Block &);
virtual void visit(ProgramSyntax::StructDeclaration &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
virtual void visit(ProgramSyntax::InterfaceBlock &);
};
private:
void process();
- void process(ProgramSyntax::Context &);
+ void generate(ProgramSyntax::Context &);
+ void optimize(ProgramSyntax::Context &);
static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
static void resolve_variables(ProgramSyntax::Context &);
std::string format_context(ProgramSyntax::Context &);