From cf1b781ca9a9b24810e97d05c291dd795e0df138 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Fri, 30 Jul 2021 14:44:32 +0700 Subject: [PATCH] IDEA-273958 - fixed declaration scope for patterns in the scopes that differ from switch GitOrigin-RevId: 8c8a835678a6c1de640e34277914b61e1542a1ab --- .../tree/java/PsiPatternVariableImpl.java | 3 ++- .../HighlighterForPatternVariableInIf.java | 7 ++++++ ...HighlighterForPatternVariableInIfElse.java | 11 +++++++++ ...hterForPatternVariableInLocalVariable.java | 6 +++++ ...ighlighterForPatternVariableInSwitch.java} | 0 ...ightPatternsForSwitchHighlightingTest.java | 24 +++++++++++++++---- 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIf.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIfElse.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInLocalVariable.java rename java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/{IdentifierHighlighterForPatternVariable.java => HighlighterForPatternVariableInSwitch.java} (100%) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPatternVariableImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPatternVariableImpl.java index f3fcfcea74e4..f8d96cf83d2e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPatternVariableImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiPatternVariableImpl.java @@ -113,7 +113,8 @@ public class PsiPatternVariableImpl extends CompositePsiElement implements PsiPa } return nextParent.getParent(); } - if (nextParent instanceof PsiPattern || nextParent instanceof PsiCaseLabelElementList) { + if (nextParent instanceof PsiPattern || nextParent instanceof PsiCaseLabelElementList || + (parent instanceof PsiPattern && nextParent instanceof PsiInstanceOfExpression)) { continue; } return parent; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIf.java new file mode 100644 index 000000000000..561e1bab18a5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIf.java @@ -0,0 +1,7 @@ +class Main { + void test(Object o) { + if (o instanceof ((String s) && s.length() > 1)) { + } + s = "fsfsdfsd"; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIfElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIfElse.java new file mode 100644 index 000000000000..7bb70464ff05 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInIfElse.java @@ -0,0 +1,11 @@ +class Main { + void test(Object o) { + if (!(o instanceof ((String s) && s.length() > 1))) { + s = "fsfsdfsd"; // unresolved + } + else { + s = "fsfsdfsd"; + System.out.println(s); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInLocalVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInLocalVariable.java new file mode 100644 index 000000000000..5b0dc6e9593a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInLocalVariable.java @@ -0,0 +1,6 @@ +class Main { + void test(Object o) { + boolean b = o instanceof ((String s) && s.length() > 1); + s = "fsfsdfsd"; // unresolved + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IdentifierHighlighterForPatternVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInSwitch.java similarity index 100% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/IdentifierHighlighterForPatternVariable.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/HighlighterForPatternVariableInSwitch.java diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java index b92e5fcd66ce..65f11042c4de 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java @@ -70,10 +70,20 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight doTest(); } - public void testIdentifierHighlighterForPatternVariable() { - PsiFile file = myFixture.configureByFile(getTestName(false) + ".java"); - PsiElement element = myFixture.getElementAtCaret(); - assertSize(3, IdentifierHighlighterPass.getUsages(element, file, true)); + public void testHighlighterForPatternVariableInSwitch() { + testIdentifierHighlighter(3); + } + + public void testHighlighterForPatternVariableInIf() { + testIdentifierHighlighter(2); + } + + public void testHighlighterForPatternVariableInIfElse() { + testIdentifierHighlighter(4); + } + + public void testHighlighterForPatternVariableInLocalVariable() { + testIdentifierHighlighter(2); } public void testGuardWithInstanceOfPatternMatching() { @@ -92,4 +102,10 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight myFixture.configureByFile(getTestName(false) + ".java"); myFixture.checkHighlighting(); } + + private void testIdentifierHighlighter(int expectedUsages) { + PsiFile file = myFixture.configureByFile(getTestName(false) + ".java"); + PsiElement element = myFixture.getElementAtCaret(); + assertSize(expectedUsages, IdentifierHighlighterPass.getUsages(element, file, true)); + } }