diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/SwitchDefault.java b/core/src/main/java/com/google/errorprone/bugpatterns/SwitchDefault.java index 4a27a64813c..bcdfa9fbade 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/SwitchDefault.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/SwitchDefault.java @@ -28,6 +28,7 @@ import com.google.errorprone.matchers.Description; import com.google.errorprone.util.Reachability; import com.sun.source.tree.CaseTree; +import com.sun.source.tree.StatementTree; import com.sun.source.tree.SwitchTree; import java.util.ArrayList; import java.util.Iterator; @@ -52,17 +53,20 @@ public Description matchSwitch(SwitchTree tree, VisitorState state) { // Collect all case trees in the statement group containing the default List defaultStatementGroup = new ArrayList<>(); Iterator it = tree.getCases().iterator(); + List caseTreeStatements = null; while (it.hasNext()) { CaseTree caseTree = it.next(); + caseTreeStatements = caseTree.getStatements(); defaultStatementGroup.add(caseTree); if (caseTree.getExpression() == null) { - while (it.hasNext() && caseTree.getStatements().isEmpty()) { + while (it.hasNext() && caseTreeStatements.isEmpty()) { caseTree = it.next(); + caseTreeStatements = caseTree.getStatements(); defaultStatementGroup.add(caseTree); } break; } - if (!caseTree.getStatements().isEmpty()) { + if (caseTreeStatements != null && !caseTreeStatements.isEmpty()) { defaultStatementGroup.clear(); } } diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/SwitchDefaultTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/SwitchDefaultTest.java index 244245f53d0..574d87bc89d 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/SwitchDefaultTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/SwitchDefaultTest.java @@ -16,7 +16,11 @@ package com.google.errorprone.bugpatterns; +import static org.junit.Assume.assumeTrue; + import com.google.errorprone.BugCheckerRefactoringTestHelper; +import com.google.errorprone.CompilationTestHelper; +import com.google.errorprone.util.RuntimeVersion; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -24,6 +28,10 @@ /** {@link SwitchDefault}Test */ @RunWith(JUnit4.class) public class SwitchDefaultTest { + + private final CompilationTestHelper compilationHelper = + CompilationTestHelper.newInstance(SwitchDefault.class, getClass()); + private final BugCheckerRefactoringTestHelper testHelper = BugCheckerRefactoringTestHelper.newInstance(SwitchDefault.class, getClass()); @@ -224,4 +232,27 @@ public void refactoring_outOfOrder() { "}") .doTest(); } + + @Test + public void newNotation_validDefault() { + assumeTrue(RuntimeVersion.isAtLeast14()); + compilationHelper + .addSourceLines( + "Test.java", + "class Test {", + " public static void nothing1() { }", + " public static void nothing2() { }", + " public static void nothing3() { }", + " public static void switchDefaultCrash(int i)", + " {", + " switch(i) {", + " case 0 -> nothing1();", + " case 1 -> nothing2();", + " default -> nothing3();", + " }", + " }", + " }", + "}") + .doTest(); + } }