aspect ExtractTemp { public VariableDeclaration Expr.extractTemp(String name, boolean makeFinal) { TypeDecl type = effectiveType(); return insertUnusedLocal(new VariableDeclaration(type.createLockedAccess(), name)). extractAssignment(this).merge().makeFinal(makeFinal); } public VariableDeclaration Expr.extractTemp(String name) { return extractTemp(name, false); } // stand-alone refactoring public VariableDeclaration Expr.doExtract(String name, boolean makeFinal) { Program root = programRoot(); VariableDeclaration decl = extractTemp(name, makeFinal); root.eliminate(LOCKED_DATAFLOW, LOCKED_NAMES, LOCKED_THROW); return decl; } public VariableDeclaration Expr.doExtract(String name) { return doExtract(name, false); } }