diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java index 0cbf4ebb9847..a1f824b0f259 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.stream.Collectors; import static com.intellij.codeInsight.daemon.impl.analysis.SwitchBlockHighlightingModel.PatternsInSwitchBlockHighlightingModel.CompletenessResult.*; import static com.intellij.psi.PsiModifier.ABSTRACT; @@ -573,7 +572,6 @@ public class SwitchBlockHighlightingModel { } } checkFallThroughInSwitchLabels(switchBlockGroup, results, alreadyFallThroughElements); - checkFallthroughReferences(switchBlockGroup, results); } private static void checkFallThroughInSwitchLabels(@NotNull List> switchBlockGroup, @@ -753,70 +751,6 @@ public class SwitchBlockHighlightingModel { results.add(info); } - private static void checkFallthroughReferences(@NotNull List> switchBlockGroup, - @NotNull List results) { - final List switches = switchBlockGroup.stream() - .flatMap(List::stream) - .limit(2) - .collect(Collectors.toList()); - if (switches.size() < 2) return; - - final Set patternVariables = new HashSet<>(); - - int caseLabelsProcessed = 0; - for (PsiElement element = switches.get(0); element != null; element = element.getNextSibling()) { - if (element instanceof PsiSwitchLabelStatementBase) { - final PsiSwitchLabelStatementBase caseLabel = (PsiSwitchLabelStatementBase)element; - final PsiStatement prevStmt = PsiTreeUtil.getPrevSiblingOfType(caseLabel, PsiStatement.class); - final boolean currentLabelIsFallthrough = ControlFlowUtils.statementMayCompleteNormally(prevStmt); - if (!currentLabelIsFallthrough) { - caseLabelsProcessed = 0; - patternVariables.clear(); - } - - if (!isCaseNull(element)) caseLabelsProcessed++; - - patternVariables.addAll(getPatternVariables(caseLabel)); - continue; - } - - if (caseLabelsProcessed < 2) continue; - - final PatternVariableReferencesResolveVisitor visitor = new PatternVariableReferencesResolveVisitor(caseLabelsProcessed, patternVariables); - - element.accept(visitor); - results.addAll(visitor.myResults); - } - } - - @NotNull - private static Set getPatternVariables(@Nullable PsiSwitchLabelStatementBase label) { - if (label == null) return Collections.emptySet(); - - final PsiCaseLabelElementList list = ((PsiSwitchLabelStatementBase)label).getCaseLabelElementList(); - if (list == null) return Collections.emptySet(); - - return Arrays.stream(list.getElements()) - .filter(PsiTypeTestPattern.class::isInstance) - .map(PsiTypeTestPattern.class::cast) - .map(PsiTypeTestPattern::getPatternVariable) - .collect(Collectors.toSet()); - } - - private static boolean isCaseNull(@Nullable PsiElement item) { - if (item == null) return false; - if (!(item instanceof PsiSwitchLabelStatementBase)) return false; - final PsiSwitchLabelStatementBase switchLabel = (PsiSwitchLabelStatementBase)item; - - final PsiCaseLabelElementList caseElementsList = switchLabel.getCaseLabelElementList(); - if (caseElementsList == null) return false; - - final PsiCaseLabelElement[] elements = caseElementsList.getElements(); - if (elements.length != 1) return false; - - return elements[0].getNode().getFirstChildNode().getElementType() == JavaTokenType.NULL_KEYWORD; - } - @Nullable private PsiElement findDefaultElement() { PsiCodeBlock body = myBlock.getBody(); @@ -918,31 +852,6 @@ public class SwitchBlockHighlightingModel { COMPLETE_WITHOUT_TOTAL } - private static class PatternVariableReferencesResolveVisitor extends JavaRecursiveElementWalkingVisitor { - private final int myLabelsProcessed; - private final Set myPatternVariables; - private final List myResults; - - public PatternVariableReferencesResolveVisitor(int totalCaseLabelsProcessed, Set patternVariables) { - myLabelsProcessed = totalCaseLabelsProcessed; - myPatternVariables = patternVariables; - myResults = new SmartList<>(); - } - - @Override - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { - if (myLabelsProcessed < 2) return; - super.visitReferenceElement(reference); - - final PsiElement anchor = reference.resolve(); - if (!(anchor instanceof PsiPatternVariable) || !myPatternVariables.contains(anchor)) return; - - final String referenceName = reference.getElement().getText(); - final HighlightInfo error = createError(reference, JavaErrorBundle.message("cannot.resolve.symbol", referenceName)); - - myResults.add(error); - } - } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/FallthroughPatternMatchingSwitch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/FallthroughPatternMatchingSwitch.java index 6376402b354d..b478d5139600 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/FallthroughPatternMatchingSwitch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/FallthroughPatternMatchingSwitch.java @@ -5,12 +5,12 @@ class Main { case String s: case null: case Integer i: - System.out.println(i + 1); + System.out.println(i + 1); break; case Long l: System.out.println(l); case Character c: - System.out.println(c); + System.out.println(c); default: throw new IllegalStateException("Unexpected value: " + o); } @@ -90,7 +90,7 @@ class Main { switch (o) { case String s: case Integer i: - System.out.println(i + 1); + System.out.println(i + 1); default: throw new IllegalStateException("Unexpected value: " + o); }