From b9e6d12fb63b3c6eb1dee22f12e2c5f16774a655 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 26 Nov 2019 11:06:00 +0700 Subject: [PATCH] Do not qualify `this` reference with `null.` if it refers to an anonymous class Fixes EA-218789 - assert: JavaParserUtil.parseFragment GitOrigin-RevId: 035aaf1efa43dc1f324be0942957bf24de65f50f --- .../refactoring/inline/InlineMethodProcessor.java | 7 ++++++- .../inlineMethod/InlineAnonymousCall.java | 15 +++++++++++++++ .../inlineMethod/InlineAnonymousCall.java.after | 12 ++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index ae1622b414e1..f0b6b8da1e26 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -843,7 +843,12 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { PsiClass parentClass = (PsiClass)parent; final PsiClass containingClass = myMethod.getContainingClass(); if (containingClass != null && parentClass.isInheritor(containingClass, true)) { - qualifier = myFactory.createExpressionFromText(parentClass.getName() + ".this", null); + String name = parentClass.getName(); + // We cannot have qualified this reference to an anonymous class, so we leave it unqualified + // this might produce incorrect code in extremely rare cases + // when we inline a superclass method in an anonymous class, + // and the method body contains a nested class that refers to the outer one + qualifier = myFactory.createExpressionFromText(name == null ? "this" : name + ".this", null); } else if (containingClass != null && parentClass.equals(containingClass)) { qualifier = myFactory.createExpressionFromText("this", null); diff --git a/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java b/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java new file mode 100644 index 000000000000..caec3b18c2fc --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java @@ -0,0 +1,15 @@ +public class Test { + static class X { + void foo() { + System.out.println(this); + } + } + + void test() { + new X () { + void bar() { + foo(); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java.after b/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java.after new file mode 100644 index 000000000000..9f5d79d53bf5 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/InlineAnonymousCall.java.after @@ -0,0 +1,12 @@ +public class Test { + static class X { + } + + void test() { + new X () { + void bar() { + System.out.println(this); + } + }; + } +} \ No newline at end of file