/* Deletes an empty statement and any labels attached to it, if possible. */ aspect InsertEmptyStmt { // in fact, we implement a more general version; might not be a refactoring // if the statement is non-empty inh boolean Stmt.delete(); eq ConstructorDecl.getConstructorInvocation().delete() { setConstructorInvocationOpt(new Opt()); return true; } eq Block.getStmt(int i).delete() { removeStmt(i); return true; } eq IfStmt.getThen().delete() { setThen(new EmptyStmt()); return true; } eq IfStmt.getElse().delete() { setElseOpt(new Opt()); return true; } eq WhileStmt.getStmt().delete() { setStmt(new EmptyStmt()); return true; } eq DoStmt.getStmt().delete() { setStmt(new EmptyStmt()); return true; } eq ForStmt.getInitStmt(int i).delete() { getInitStmtList().removeChild(i); return true; } eq ForStmt.getUpdateStmt(int i).delete() { getUpdateStmtList().removeChild(i); return true; } eq ForStmt.getStmt().delete() { setStmt(new EmptyStmt()); return true; } eq EnhancedForStmt.getStmt().delete() { setStmt(new EmptyStmt()); return true; } eq LabeledStmt.getStmt().delete() { if(!uses().isEmpty()) throw new RefactoringException("cannot delete this statement"); delete(); } }