From 9e54c0017f928465d4eb582738e3b4fe017ff209 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 3 Feb 2025 19:55:21 +0100 Subject: [PATCH] Java: create final local variable when configured (IDEA-366908) for the "Convert to local" quick-fix of the "Field can be local" inspection GitOrigin-RevId: f82f38ca4c6eda299519eef80e6a90aa8d4b2f68 --- .../ConvertToLocalUtils.java | 22 +++++++++---------- .../convert2Local/afterFinalInitializer.java | 9 ++++++++ .../convert2Local/beforeFinalInitializer.java | 11 ++++++++++ 3 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterFinalInitializer.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeFinalInitializer.java diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/varScopeCanBeNarrowed/ConvertToLocalUtils.java b/java/java-impl-inspections/src/com/intellij/codeInspection/varScopeCanBeNarrowed/ConvertToLocalUtils.java index eea5b014c2b2..d5f5acbe9da6 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/varScopeCanBeNarrowed/ConvertToLocalUtils.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/varScopeCanBeNarrowed/ConvertToLocalUtils.java @@ -5,7 +5,6 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.CommonJavaInlineUtil; -import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; @@ -27,21 +26,20 @@ final class ConvertToLocalUtils { if (anchorBlock == null) return null; // was assertion, but need to fix the case when obsolete inspection highlighting is left final PsiElement firstElement = getLowestOffsetElement(references); final String localName = newName.apply(anchorBlock); - if (firstElement == null) return null; final PsiElement anchor = getAnchorElement(anchorBlock, firstElement); if (anchor == null) return null; final PsiAssignmentExpression anchorAssignmentExpression = searchAssignmentExpression(anchor); - final PsiExpression initializer; - if (anchorAssignmentExpression != null && isVariableAssignment(anchorAssignmentExpression, variable)) { - initializer = anchorAssignmentExpression.getRExpression(); - } - else { - initializer = variable.getInitializer(); - } + final PsiExpression initializer = anchorAssignmentExpression != null && isVariableAssignment(anchorAssignmentExpression, variable) + ? anchorAssignmentExpression.getRExpression() + : variable.getInitializer(); final PsiElementFactory psiFactory = JavaPsiFacade.getElementFactory(variable.getProject()); - final PsiDeclarationStatement declaration = psiFactory.createVariableDeclarationStatement(localName, variable.getType(), initializer); - if (ContainerUtil.exists(references, PsiUtil::isAccessedForWriting)) { - PsiUtil.setModifierProperty((PsiLocalVariable)declaration.getDeclaredElements()[0], PsiModifier.FINAL, false); + final PsiDeclarationStatement declaration = + psiFactory.createVariableDeclarationStatement(localName, variable.getType(), initializer, variable); + for (int i = 1; i < references.size(); i++) { + if (PsiUtil.isAccessedForWriting(references.get(i))) { + PsiUtil.setModifierProperty((PsiLocalVariable)declaration.getDeclaredElements()[0], PsiModifier.FINAL, false); + break; + } } final PsiElement newDeclaration; if (anchorAssignmentExpression != null && isVariableAssignment(anchorAssignmentExpression, variable)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterFinalInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterFinalInitializer.java new file mode 100644 index 000000000000..a77c3a0b9ffb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterFinalInitializer.java @@ -0,0 +1,9 @@ +// "Convert field to local variable in initializer section" "true-preview" +class TestInitializer { + + { + final boolean field = true; + System.out.println(field); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeFinalInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeFinalInitializer.java new file mode 100644 index 000000000000..5e70d614876f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeFinalInitializer.java @@ -0,0 +1,11 @@ +// "Convert field to local variable in initializer section" "true-preview" +class TestInitializer { + + private boolean field; + + { + field = true; + System.out.println(field); + } + +} \ No newline at end of file