From 99844b3f870251f45df4d063df904340dfe6d636 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 6 Mar 2025 17:30:10 +0100 Subject: [PATCH] [java-refactoring] IDEA-368729 Refactor -> introduce field fails if the expression contains unresolved type GitOrigin-RevId: 564e2f82913f777c5c9e0b760b27fc0a859ec430 --- .../introduceField/IntroduceFieldHandler.java | 6 ++++++ .../inplaceIntroduceField/varUnknownType.java | 5 +++++ .../inplaceIntroduceField/varUnknownType2.java | 5 +++++ .../java/refactoring/InplaceIntroduceFieldTest.java | 11 +++++++++++ .../messages/JavaRefactoringBundle.properties | 1 + 5 files changed, 28 insertions(+) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType2.java diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java index 3045519889ab..33042c06a30e 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java @@ -60,6 +60,12 @@ public class IntroduceFieldHandler extends BaseExpressionToFieldHandler implemen showErrorMessage(parentClass.getProject(), editor, message); return false; } + if (PsiTypes.nullType().equals(type) || type instanceof PsiLambdaParameterType || type instanceof PsiLambdaExpressionType || + type instanceof PsiMethodReferenceType) { + String message = JavaRefactoringBundle.message("variable.type.unknown"); + showErrorMessage(parentClass.getProject(), editor, message); + return false; + } PsiClass aClass = PsiUtil.resolveClassInClassTypeOnly(type); if (aClass != null && PsiUtil.isLocalClass(aClass) && !PsiTreeUtil.isAncestor(aClass, parentClass, false)) { String message = JavaRefactoringBundle.message("0.is.not.visible.to.members.of.1", diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType.java new file mode 100644 index 000000000000..e2a5b2ccd8a0 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType.java @@ -0,0 +1,5 @@ +class X { + void test() { + var f = Set.of(1, 2); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType2.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType2.java new file mode 100644 index 000000000000..3bc663630e40 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/varUnknownType2.java @@ -0,0 +1,5 @@ +class X { + void test() { + var f = s -> {}; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java index 84671d9b8868..86625138d634 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java @@ -6,6 +6,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiLocalVariable; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; +import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.testFramework.LightProjectDescriptor; import org.jetbrains.annotations.NotNull; @@ -87,6 +88,16 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest doTest(null); } + public void testVarUnknownType() { + assertThrows(CommonRefactoringUtil.RefactoringErrorHintException.class, + "Cannot perform refactoring.\nVariable type is unknown", () -> doTest(null)); + } + + public void testVarUnknownType2() { + assertThrows(CommonRefactoringUtil.RefactoringErrorHintException.class, + "Cannot perform refactoring.\nVariable type is unknown", () -> doTest(null)); + } + @Override protected String getBasePath() { return BASE_PATH; diff --git a/java/openapi/resources/messages/JavaRefactoringBundle.properties b/java/openapi/resources/messages/JavaRefactoringBundle.properties index 162c5c4dc75b..eac0035b9754 100644 --- a/java/openapi/resources/messages/JavaRefactoringBundle.properties +++ b/java/openapi/resources/messages/JavaRefactoringBundle.properties @@ -63,6 +63,7 @@ boolean.method.result=boolean method result can.t.restore.context.for.method.extraction=Can't restore context for method extraction cannot.find.or.create.destination.directory=Cannot find or create destination directory cannot.introduce.field.in.interface=Non-constant fields are not allowed in an interface. +variable.type.unknown=Variable type is unknown 0.is.not.visible.to.members.of.1={0} is not visible to members of {1} cannot.move=Cannot Move cannot.move.inner.class.0.into.itself=Cannot move inner class {0} into itself