From e6102de0d2fabe780c0bf28e7276557168dadf8a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 21 Dec 2020 15:35:48 +0700 Subject: [PATCH] [java-refactoring] Introduce variable: do not try to add cast if the type is non-variable type Found by property testing Fixes EA-248598 - [ExtractVar] AE: JavaParserUtil.parseFragment GitOrigin-RevId: 91d32dd33ef6c75ed750419b06654acffba6d684 --- .../JavaVariableInplaceIntroducer.java | 11 ++--------- .../lambdaParameterAddCast.java | 10 ++++++++++ .../lambdaParameterAddCast_after.java | 11 +++++++++++ .../nullTypeAddCast.java | 17 +++++++++++++++++ .../nullTypeAddCast_after.java | 18 ++++++++++++++++++ .../InplaceIntroduceVariableTest.java | 8 ++++++++ 6 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast_after.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java index d26fb7fe7b9d..ee3362b46970 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java @@ -23,8 +23,6 @@ import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.diagnostic.Attachment; -import com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; @@ -370,13 +368,8 @@ public class JavaVariableInplaceIntroducer extends AbstractJavaInplaceIntroducer final PsiExpression initializer = psiVariable.getInitializer(); LOG.assertTrue(initializer != null); final PsiType type = initializer.getType(); - if (((PsiReferenceExpression)parent).resolve() == null && type != null && !type.equals(psiVariable.getType())) { - if (LambdaUtil.notInferredType(type)) { - throw new RuntimeExceptionWithAttachments( - "Unexpected initializer type: " + type, - new Attachment("variable.txt", psiVariable.getText()), new Attachment("reference.txt", parent.getText()), - new Attachment("file.txt", file.getText())); - } + if (((PsiReferenceExpression)parent).resolve() == null && type != null && !type.equals(psiVariable.getType()) && + !LambdaUtil.notInferredType(type) && !PsiType.NULL.equals(type)) { final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project); final PsiExpression castedExpr = elementFactory.createExpressionFromText("((" + type.getCanonicalText() + ")" + referenceExpression.getText() + ")", parent); diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast.java b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast.java new file mode 100644 index 000000000000..6038f9ca1691 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast.java @@ -0,0 +1,10 @@ +public class lambdaParameterAddCast { + void consume(String str) {} + + void test() { + Object r = foo -> { + consume(foo); + System.out.println(foo.blahblah()); + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast_after.java new file mode 100644 index 000000000000..265e7d0423ee --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/lambdaParameterAddCast_after.java @@ -0,0 +1,11 @@ +public class lambdaParameterAddCast { + void consume(String str) {} + + void test() { + Object r = foo -> { + String foo1 = (String) foo; + consume(foo1); + System.out.println(foo1.blahblah()); + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast.java b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast.java new file mode 100644 index 000000000000..490cc08139c9 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast.java @@ -0,0 +1,17 @@ +public class NullTypeAddCast { + static class MyMegaClass { + int myMegaMethod() { + return 0; + } + } + + interface MyInterface {} + + void consume(MyInterface intf) {} + + void test() { + var x = foo; + consume(x); + System.out.println(x.myMegaMethod()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast_after.java new file mode 100644 index 000000000000..6d5b0fe816f4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceVariable/nullTypeAddCast_after.java @@ -0,0 +1,18 @@ +public class NullTypeAddCast { + static class MyMegaClass { + int myMegaMethod() { + return 0; + } + } + + interface MyInterface {} + + void consume(MyInterface intf) {} + + void test() { + var x = foo; + Object x1 = x; + consume(x1); + System.out.println(x1.myMegaMethod()); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceVariableTest.java index b38b3b9c058c..ddeabd559478 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceVariableTest.java @@ -212,6 +212,14 @@ public class InplaceIntroduceVariableTest extends AbstractJavaInplaceIntroduceTe doTest(null); } + public void testNullTypeAddCast() { + doTestReplaceChoice("Replace all 0 occurrences"); + } + + public void testLambdaParameterAddCast() { + doTestReplaceChoice("Replace all 0 occurrences"); + } + private void doTestStopEditing(Consumer pass) { String name = getTestName(true); configureByFile(getBasePath() + name + getExtension());