From 464f0a4cfe4137dea46c4338eb56f71734b57ebb Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 27 Dec 2022 14:07:12 +0100 Subject: [PATCH] Java: make quick fix respect "Make generated local variables final" setting for "Pattern variable can be used" inspection GitOrigin-RevId: 7ca41a5435635f951b10f513def9fa605e8274a3 --- .../PatternVariableCanBeUsedInspection.java | 26 +++++++++++++------ .../afterFinalDeclared.java | 2 +- .../afterRecordPatternVariableNotExists.java | 2 +- .../beforeFinalDeclared.java | 2 +- .../beforeRecordPatternVariableNotExists.java | 2 +- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java index 53e758917ff9..04144f8bcc41 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java @@ -6,6 +6,7 @@ import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature; import com.intellij.codeInsight.intention.FileModifier; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.impl.light.LightRecordMethod; import com.intellij.psi.util.JavaPsiPatternUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -228,21 +229,30 @@ public class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLocalIns PsiInstanceOfExpression instanceOf = myInstanceOfPointer.getElement(); if (instanceOf == null) return; CommentTracker ct = new CommentTracker(); + StringBuilder text = new StringBuilder(ct.text(instanceOf.getOperand())); + text.append(" instanceof "); PsiModifierList modifierList = variable.getModifierList(); - String modifiers = modifierList == null || modifierList.getTextLength() == 0 || !PsiUtil.isLanguageLevel16OrHigher(variable) ? - "" : modifierList.getText() + " "; - String deconstructionList = - instanceOf.getPattern() instanceof PsiDeconstructionPattern deconstruction ? deconstruction.getDeconstructionList().getText() : ""; - ct.replace(instanceOf, ct.text(instanceOf.getOperand()) + - " instanceof " + modifiers + typeElement.getText() + deconstructionList + " " + variable.getName()); + JavaCodeStyleSettings codeStyleSettings = JavaCodeStyleSettings.getInstance(variable.getContainingFile()); + if (modifierList != null && modifierList.getTextLength() > 0) { + modifierList.setModifierProperty(PsiModifier.FINAL, codeStyleSettings.GENERATE_FINAL_LOCALS); + text.append(ct.text(modifierList)).append(' '); + } + else if (codeStyleSettings.GENERATE_FINAL_LOCALS) { + text.append("final "); + } + text.append(typeElement.getText()).append(' '); + if (instanceOf.getPattern() instanceof PsiDeconstructionPattern deconstructionPattern) { + text.append(ct.text(deconstructionPattern.getDeconstructionList())).append(' '); + } + text.append(variable.getName()); + ct.replace(instanceOf, text.toString()); ct.deleteAndRestoreComments(variable); } @Override public @Nullable FileModifier getFileModifierForPreview(@NotNull PsiFile target) { PsiInstanceOfExpression instanceOf = myInstanceOfPointer.getElement(); - return instanceOf == null ? null : new PatternVariableCanBeUsedFix(myName, PsiTreeUtil - .findSameElementInCopy(instanceOf, target)); + return instanceOf == null ? null : new PatternVariableCanBeUsedFix(myName, PsiTreeUtil.findSameElementInCopy(instanceOf, target)); } } } diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterFinalDeclared.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterFinalDeclared.java index 92ba6ea63089..fc13bc742493 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterFinalDeclared.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterFinalDeclared.java @@ -1,7 +1,7 @@ // "Replace 's' with pattern variable" "true" class X { void test(Object obj) { - if (obj instanceof final String s) { + if (obj instanceof @Ann String s) { } } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPatternVariableNotExists.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPatternVariableNotExists.java index 48fdb640ed03..ee8c6a0f9064 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPatternVariableNotExists.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPatternVariableNotExists.java @@ -1,7 +1,7 @@ // "Replace 'point' with pattern variable" "true" class X { void test(Object obj) { - if (obj instanceof Point(double x, double y) point && y == x) { + if (obj instanceof Point(double x/*c*/, double y) point && y == x) { } } } diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeFinalDeclared.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeFinalDeclared.java index b51ff71f8604..ff92f156383f 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeFinalDeclared.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeFinalDeclared.java @@ -2,7 +2,7 @@ class X { void test(Object obj) { if (obj instanceof String) { - final String s = (String)obj; + @Ann final String s = (String)obj; } } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPatternVariableNotExists.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPatternVariableNotExists.java index 25560e62e7b4..a7d235d8d7fd 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPatternVariableNotExists.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPatternVariableNotExists.java @@ -1,7 +1,7 @@ // "Replace 'point' with pattern variable" "true" class X { void test(Object obj) { - if (obj instanceof Point(double x, double y) && y == x) { + if (obj instanceof Point(double x/*c*/, double y) && y == x) { Point point = (Point) obj; } }