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); + }); + } +}