From 2380906af87381346b2b7cfb6b6dce06ecedb2a7 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 27 Dec 2019 15:35:59 +0700 Subject: [PATCH] HighlightControlFlowUtil: disable assignment to pattern variables GitOrigin-RevId: 09c4aa42068ce0258543a17546404fcdec952404 --- .../analysis/HighlightControlFlowUtil.java | 22 +++++++++++-------- .../ReassignPatternVariable.java | 7 ++++++ .../daemon/LightPatternsHighlightingTest.java | 3 +++ 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/ReassignPatternVariable.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java index 649b427c0c86..79be9e2b21d1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java @@ -624,19 +624,23 @@ public class HighlightControlFlowUtil { } PsiReferenceExpression reference = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(operand), PsiReferenceExpression.class); PsiVariable variable = reference == null ? null : ObjectUtils.tryCast(reference.resolve(), PsiVariable.class); - if (variable == null || !variable.hasModifierProperty(PsiModifier.FINAL)) return null; - final boolean canWrite = canWriteToFinal(variable, expression, reference, containingFile) && checkWriteToFinalInsideLambda(variable, reference) == null; - if (canWrite) return null; + if (!(variable instanceof PsiPatternVariable)) { + if (variable == null || !variable.hasModifierProperty(PsiModifier.FINAL)) return null; + final boolean canWrite = canWriteToFinal(variable, expression, reference, containingFile) && checkWriteToFinalInsideLambda(variable, reference) == null; + if (canWrite) return null; + } final String name = variable.getName(); String description = JavaErrorMessages.message("assignment.to.final.variable", name); final HighlightInfo highlightInfo = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(reference).descriptionAndTooltip(description).create(); - final PsiElement innerClass = getInnerClassVariableReferencedFrom(variable, expression); - if (innerClass == null || variable instanceof PsiField) { - HighlightFixUtil.registerMakeNotFinalAction(variable, highlightInfo); - } - else { - QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createVariableAccessFromInnerClassFix(variable, innerClass)); + if (!(variable instanceof PsiPatternVariable)) { + final PsiElement innerClass = getInnerClassVariableReferencedFrom(variable, expression); + if (innerClass == null || variable instanceof PsiField) { + HighlightFixUtil.registerMakeNotFinalAction(variable, highlightInfo); + } + else { + QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createVariableAccessFromInnerClassFix(variable, innerClass)); + } } return highlightInfo; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/ReassignPatternVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/ReassignPatternVariable.java new file mode 100644 index 000000000000..dba897e6d1db --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatterns/ReassignPatternVariable.java @@ -0,0 +1,7 @@ +class X { + void expressions(Object obj) { + if (obj instanceof String s) { + s = "foo"; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java index 5cf136032e00..442540dec46b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsHighlightingTest.java @@ -27,6 +27,9 @@ public class LightPatternsHighlightingTest extends LightJavaCodeInsightFixtureTe public void testInstanceOfControlFlow() { doTest(); } + public void testReassignPatternVariable() { + doTest(); + } private void doTest() { myFixture.configureByFile(getTestName(false) + ".java");