From a8ae2217c258f4b01f5b7a87c62ad88e721029d9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 3 Mar 2025 16:56:44 +0100 Subject: [PATCH] [java-refactoring] IDEA-368385 Refactor introduce field added NotNull annotation GitOrigin-RevId: c695550e832b648d31097d85ee887358551e95ac --- .../com/intellij/util/CommonJavaRefactoringUtil.java | 10 +++++----- .../refactoring/util/RefactoringChangeUtil.java | 7 +++++-- .../noExternalTypeAnnotations.java | 7 +++++++ .../noExternalTypeAnnotations_after.java | 10 ++++++++++ .../inplaceIntroduceField/replaceAll_after.java | 8 ++++---- .../java/refactoring/InplaceIntroduceFieldTest.java | 12 ++++++++++++ 6 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations_after.java diff --git a/java/java-impl/src/com/intellij/util/CommonJavaRefactoringUtil.java b/java/java-impl/src/com/intellij/util/CommonJavaRefactoringUtil.java index 9c79be5df26b..134c504db148 100644 --- a/java/java-impl/src/com/intellij/util/CommonJavaRefactoringUtil.java +++ b/java/java-impl/src/com/intellij/util/CommonJavaRefactoringUtil.java @@ -67,15 +67,15 @@ public final class CommonJavaRefactoringUtil { return type; } - public static PsiType getTypeByExpression(PsiExpression expr, final PsiElementFactory factory) { + public static @Nullable PsiType getTypeByExpression(@Nullable PsiExpression expr, @NotNull final PsiElementFactory factory) { PsiType type = RefactoringChangeUtil.getTypeByExpression(expr); if (PsiTypes.nullType().equals(type)) { ExpectedTypeInfo[] infos = ExpectedTypesProvider.getExpectedTypes(expr, false); if (infos.length > 0) { type = infos[0].getType(); - if (type instanceof PsiPrimitiveType) { + if (type instanceof PsiPrimitiveType primitiveType) { type = infos.length > 1 && !(infos[1].getType() instanceof PsiPrimitiveType) ? infos[1].getType() - : ((PsiPrimitiveType)type).getBoxedType(expr); + : primitiveType.getBoxedType(expr); } } else { @@ -83,7 +83,7 @@ public final class CommonJavaRefactoringUtil { } } - return type; + return type == null ? null : PsiTypesUtil.removeExternalAnnotations(type); } @Contract("null, _ -> null") @@ -591,7 +591,7 @@ public final class CommonJavaRefactoringUtil { } ExpectedTypeInfo[] expectedTypes = ExpectedTypesProvider.getExpectedTypes(expr, false); if (expectedTypes.length == 1 || (isFunctionalType || detectConjunct) && expectedTypes.length > 0 ) { - if (typeByExpression != null && Arrays.stream(expectedTypes).anyMatch(typeInfo -> typeByExpression.isAssignableFrom(typeInfo.getType()))) { + if (typeByExpression != null && ContainerUtil.exists(expectedTypes, typeInfo -> typeByExpression.isAssignableFrom(typeInfo.getType()))) { return type; } type = expectedTypes[0].getType(); diff --git a/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java b/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java index 0778ccbb47d8..be8becaba888 100644 --- a/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java +++ b/java/java-psi-impl/src/com/intellij/refactoring/util/RefactoringChangeUtil.java @@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.JavaPsiConstructorUtil; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,8 +18,10 @@ import java.util.Objects; public final class RefactoringChangeUtil { private static final Logger LOG = Logger.getInstance(RefactoringChangeUtil.class); - public static PsiType getTypeByExpression(PsiExpression expr) { - PsiType type = expr != null ? expr.getType() : null; + @Contract("null -> null") + public static PsiType getTypeByExpression(@Nullable PsiExpression expr) { + if (expr == null) return null; + PsiType type = expr.getType(); if (type == null) { if (expr instanceof PsiArrayInitializerExpression) { PsiExpression[] initializers = ((PsiArrayInitializerExpression)expr).getInitializers(); diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations.java new file mode 100644 index 000000000000..b136a02bd895 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations.java @@ -0,0 +1,7 @@ +import java.util.*; + +class X { + void test() { + Set.of(1, 2); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations_after.java new file mode 100644 index 000000000000..d59841aed6e4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/noExternalTypeAnnotations_after.java @@ -0,0 +1,10 @@ +import java.util.*; + +class X { + + private Set integers; + + void test() { + integers = Set.of(1, 2); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/replaceAll_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/replaceAll_after.java index 15eddb42a09a..a818fa631b43 100644 --- a/java/java-tests/testData/refactoring/inplaceIntroduceField/replaceAll_after.java +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/replaceAll_after.java @@ -15,11 +15,11 @@ */ class Test { - private String s; + private String x; void simpleMethod() { - s = ""; - System.out.println(s); - System.out.println(s); + x = ""; + System.out.println(x); + System.out.println(x); } } 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 30fca44b6815..27a7c7739b64 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java @@ -6,11 +6,19 @@ 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.testFramework.LightProjectDescriptor; import org.jetbrains.annotations.NotNull; +import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_21; + public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest { private static final String BASE_PATH = "/refactoring/inplaceIntroduceField/"; + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return JAVA_21; + } + public void testAnchor() { doTest(null); } @@ -70,6 +78,10 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest public void testStatementsBeforeSuper() { doTest(introducer -> introducer.setReplaceAllOccurrences(true)); } + + public void testNoExternalTypeAnnotations() { + doTest(null); + } @Override protected String getBasePath() {