[java-refactorings] IDEA-372592 Fix anonymous to inner class conversion incorrectly converting already-qualified this expressions

#IDEA-372592 fixed

closes https://github.com/JetBrains/intellij-community/pull/3048

Merge-request: IJ-MR-162908
Merged-by: Bartek Pacia <bartek.pacia@jetbrains.com>

GitOrigin-RevId: 0ad34047e08bde4a4689e992768832863036fca0
This commit is contained in:
joe
2025-05-14 11:47:46 +00:00
committed by intellij-monorepo-bot
parent 35fb7482d4
commit 5f10f7a6a5
8 changed files with 100 additions and 36 deletions
@@ -688,43 +688,17 @@ public class AnonymousToInnerHandler implements RefactoringActionHandlerOnPsiEle
PsiMethodCallExpression methodCall = (PsiMethodCallExpression) ((PsiExpressionStatement) statement).getExpression();
PsiExpressionList exprList = methodCall.getArgumentList();
final PsiThisExpression qualifiedThis = (PsiThisExpression) factory.createExpressionFromText("A.this", null);
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
assert thisQualifier != null;
thisQualifier.replace(targetClassRef);
{
final PsiThisExpression qualifiedThis =
(PsiThisExpression) factory.createExpressionFromText("A.this", null);
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
assert thisQualifier != null;
thisQualifier.replace(targetClassRef);
for (PsiExpression expr : paramExpressions) {
ChangeContextUtil.encodeContextInfo(expr, true);
final PsiElement newExpr = exprList.add(expr);
ChangeContextUtil.decodeContextInfo(newExpr, myTargetClass, qualifiedThis);
}
for (PsiExpression expr : paramExpressions) {
ChangeContextUtil.encodeContextInfo(expr, true);
final PsiElement newExpr = exprList.add(expr);
ChangeContextUtil.decodeContextInfo(newExpr, myTargetClass, qualifiedThis);
}
class SupersConvertor extends JavaRecursiveElementVisitor {
@Override public void visitThisExpression(@NotNull PsiThisExpression expression) {
try {
final PsiThisExpression qualifiedThis =
(PsiThisExpression) factory.createExpressionFromText("A.this", null);
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
assert thisQualifier != null;
thisQualifier.replace(targetClassRef);
expression.replace(qualifiedThis);
} catch (IncorrectOperationException e) {
LOG.error(e);
}
}
@Override public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) {
}
}
final SupersConvertor supersConvertor = new SupersConvertor();
methodCall.getArgumentList().accept(supersConvertor);
}
private void calculateTypeParametersToCreate () {
@@ -0,0 +1,9 @@
public class LocalClass {
public LocalClass(LocalClass o) {
}
void test() {
new <caret>LocalClass(this) {
};
}
}
@@ -0,0 +1,11 @@
public class LocalClass {
LocalClass field;
public LocalClass(LocalClass o) {
}
void test() {
new <caret>LocalClass(field) {
};
}
}
@@ -0,0 +1,16 @@
public class LocalClass {
LocalClass field;
public LocalClass(LocalClass o) {
}
void test() {
new MyClass();
}
private static class MyClass extends LocalClass {
public MyClass() {
super(LocalClass.this.field);
}
}
}
@@ -0,0 +1,14 @@
public class LocalClass {
public LocalClass(LocalClass o) {
}
void test() {
new MyClass();
}
private static class MyClass extends LocalClass {
public MyClass() {
super(LocalClass.this);
}
}
}
@@ -0,0 +1,12 @@
public class Test {
public Test(Test test) {
}
private class Inner {
public void x() {
new <caret>Test(Test.this) {
};
}
}
}
@@ -0,0 +1,17 @@
public class Test {
public Test(Test test) {
}
private class Inner {
public void x() {
new MyClass();
}
private static class MyClass extends Test {
public MyClass() {
super(Test.this);
}
}
}
}
@@ -133,7 +133,18 @@ public class AnonymousToInnerTest extends LightJavaCodeInsightTestCase {
public void testTypeParameterNotMentioned() {
doTest("MyClass", true);
}
public void testAddThisQualifier() {
doTest("MyClass", true);
}
public void testAddThisQualifierWithImplicitThis() {
doTest("MyClass", true);
}
public void testOuterThisQualifier() {
doTest("MyClass", true);
}
private void doTest(final String newClassName, final boolean makeStatic) {
configureByFile(TEST_ROOT + getTestName(true) + ".java");