package quickfix; import static edu.umd.cs.findbugs.plugin.eclipse.quickfix.util.ASTUtil.getASTNode; import java.util.List; import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs.findbugs.plugin.eclipse.quickfix.BugResolution; import edu.umd.cs.findbugs.plugin.eclipse.quickfix.exception.BugResolutionException; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Statement; import org.eclipse.jdt.core.dom.SwitchCase; import org.eclipse.jdt.core.dom.SwitchStatement; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; import util.TraversalUtil; public class AddDefaultCaseResolution extends BugResolution { @Override protected boolean resolveBindings() { return false; } @Override protected void repairBug(ASTRewrite rewrite, CompilationUnit workingUnit, BugInstance bug) throws BugResolutionException { ASTNode node = getASTNode(workingUnit, bug.getPrimarySourceLineAnnotation()); node = TraversalUtil.backtrackToBlock(node); DefaultCaseVisitor visitor = new DefaultCaseVisitor(); node.accept(visitor); if (visitor.badSwitchStatement != null) { ListRewrite statementsRewrite = rewrite.getListRewrite(visitor.badSwitchStatement, SwitchStatement.STATEMENTS_PROPERTY); SwitchCase defaultCase = rewrite.getAST().newSwitchCase(); defaultCase.setExpression(null); statementsRewrite.insertLast(defaultCase, null); statementsRewrite.insertLast(rewrite.getAST().newBreakStatement(), null); } } private static class DefaultCaseVisitor extends ASTVisitor { private SwitchStatement badSwitchStatement; @SuppressWarnings("unchecked") @Override public boolean visit(SwitchStatement node) { if (badSwitchStatement != null) { return false; } List<Statement> switchStatements = node.statements(); for (Statement statement : switchStatements) { if (statement instanceof SwitchCase) { if (((SwitchCase) statement).getExpression() == null) { return true; // this one has a default case...skip it } } } badSwitchStatement = node; return false; } } }