From 50c312aa91897646c9010122cad12beb20210cca Mon Sep 17 00:00:00 2001 From: Bart van Helvert Date: Thu, 5 Feb 2026 23:06:08 +0100 Subject: [PATCH] [java] Don't add redundant qualifier in introduce constant refactoring Add initializer to the physical file instead of the non-physical field to make sure the context of the field is properly taken into account when doing the PSI replacement. #IDEA-385631 Fixed GitOrigin-RevId: 2954ce938f6573b0422edfd5e0b59901f854381d --- .../BaseExpressionToFieldHandler.java | 15 ++++----- .../starImport/after/StarImport.java | 11 +++++++ .../starImport/after/p/StarImportApi.java | 5 +++ .../starImport/before/StarImport.java | 9 ++++++ .../starImport/before/p/StarImportApi.java | 5 +++ .../IntroduceConstantMultiFileTest.java | 32 +++++++++++++++++++ 6 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/StarImport.java create mode 100644 java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/p/StarImportApi.java create mode 100644 java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/StarImport.java create mode 100644 java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/p/StarImportApi.java create mode 100644 java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantMultiFileTest.java diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index 406f2de83e35..ae0d3add85c8 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -448,9 +448,6 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase final PsiTypeElement typeElement = factory.createTypeElement(type); field.getTypeElement().replace(typeElement); field = (PsiField)CodeStyleManager.getInstance(psiManager.getProject()).reformat(field); - if (includeInitializer) { - field.getInitializer().replace(initializerExpr); - } return field; } catch (IncorrectOperationException e) { @@ -758,11 +755,10 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase if (!CommonRefactoringUtil.checkReadOnlyStatus(myProject, destClass.getContainingFile())) return; ChangeContextUtil.encodeContextInfo(destClass, true); - - myField = mySettings.isIntroduceEnumConstant() ? EnumConstantsUtil.createEnumConstant(destClass, myFieldName, initializer) : - createField(myFieldName, type.getType(), initializer, - initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null, - myParentClass); + boolean includeInitializer = initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null; + myField = mySettings.isIntroduceEnumConstant() + ? EnumConstantsUtil.createEnumConstant(destClass, myFieldName, initializer) + : createField(myFieldName, type.getType(), initializer, includeInitializer, myParentClass); setModifiers(myField, mySettings); PsiElement finalAnchorElement = null; @@ -796,6 +792,9 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase anchorMember = null; } myField = appendField(initializer, initializerPlace, destClass, myParentClass, myField, anchorMember); + if (includeInitializer) { + myField.getInitializer().replace(initializer); + } if (!mySettings.isIntroduceEnumConstant()) { VisibilityUtil.fixVisibility(myOccurrences, myField, mySettings.getFieldVisibility()); } diff --git a/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/StarImport.java b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/StarImport.java new file mode 100644 index 000000000000..1b8c24e3b6fa --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/StarImport.java @@ -0,0 +1,11 @@ +import static p.StarImportApi.*; + +class StarImport { + public static final String xxx = bar(FOO + "3"); + + void foo() { + String x = xxx; + } + + static String bar(String x) { return x; } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/p/StarImportApi.java b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/p/StarImportApi.java new file mode 100644 index 000000000000..beb77a70ac19 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/after/p/StarImportApi.java @@ -0,0 +1,5 @@ +package p; + +public class StarImportApi { + public static final String FOO = "foo"; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/StarImport.java b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/StarImport.java new file mode 100644 index 000000000000..66a048d5d8ba --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/StarImport.java @@ -0,0 +1,9 @@ +import static p.StarImportApi.*; + +class StarImport { + void foo() { + String x = bar(FOO + "3"); + } + + static String bar(String x) { return x; } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/p/StarImportApi.java b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/p/StarImportApi.java new file mode 100644 index 000000000000..beb77a70ac19 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/multifile/starImport/before/p/StarImportApi.java @@ -0,0 +1,5 @@ +package p; + +public class StarImportApi { + public static final String FOO = "foo"; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantMultiFileTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantMultiFileTest.java new file mode 100644 index 000000000000..dcf8ecc1654d --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceConstantMultiFileTest.java @@ -0,0 +1,32 @@ +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.java.refactoring; + +import com.intellij.JavaTestUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; +import com.intellij.refactoring.LightMultiFileTestCase; +import com.intellij.testFramework.HeavyPlatformTestCase; +import org.jetbrains.annotations.NotNull; + +@HeavyPlatformTestCase.WrapInCommand +public class IntroduceConstantMultiFileTest extends LightMultiFileTestCase { + @Override + protected @NotNull String getTestDataPath() { + return JavaTestUtil.getJavaTestDataPath() + "/refactoring/introduceConstant/multifile/"; + } + + public void testStarImport() { + doTest(() -> { + PsiClass starImportClass = myFixture.findClass("StarImport"); + assertNotNull("StarImport class not found", starImportClass); + + PsiFile containingFile = starImportClass.getContainingFile(); + VirtualFile virtualFile = containingFile.getVirtualFile(); + assertNotNull(virtualFile); + myFixture.configureFromExistingVirtualFile(virtualFile); + + new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), containingFile, null); + }); + } +}