Java: fix 'Inline to Anonymous class' doesn't work for class with inner class (IDEA-365779)

GitOrigin-RevId: 5d1b8577e541fed47fb9ba4e0d8c17affa8fbf5d
This commit is contained in:
Bas Leijdekkers
2025-01-22 12:03:57 +00:00
committed by intellij-monorepo-bot
parent 70e193b482
commit c64d343e65
4 changed files with 62 additions and 14 deletions
@@ -1,4 +1,4 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.refactoring.inline;
import com.intellij.java.refactoring.JavaRefactoringBundle;
@@ -248,12 +248,9 @@ public class InlineToAnonymousClassProcessor extends BaseRefactoringProcessor {
if (statement != null && !myInlineThisOnly) {
elementsToDelete.add(statement);
}
else {
PsiTypeElement typeElement = PsiTreeUtil.getParentOfType(element, PsiTypeElement.class);
if (typeElement != null) {
replaceWithSuperType(typeElement, superType);
else if (element instanceof PsiJavaCodeReferenceElement ref) {
replaceWithSuperType(ref, superType);
}
}
}
}
@@ -302,14 +299,18 @@ public class InlineToAnonymousClassProcessor extends BaseRefactoringProcessor {
}
}
private void replaceWithSuperType(final PsiTypeElement typeElement, final PsiClassType superType) {
PsiElementFactory factory = JavaPsiFacade.getElementFactory(myProject);
PsiClassType psiType = (PsiClassType) typeElement.getType();
PsiClassType.ClassResolveResult classResolveResult = psiType.resolveGenerics();
PsiType substType = classResolveResult.getSubstitutor().substitute(superType);
assert myClass.isEquivalentTo(classResolveResult.getElement());
private void replaceWithSuperType(PsiJavaCodeReferenceElement ref, PsiClassType superType) {
PsiTypeElement typeElement = PsiTreeUtil.getParentOfType(ref, PsiTypeElement.class);
if (typeElement == null) return;
PsiClassType type = (PsiClassType) typeElement.getType();
PsiClassType.ClassResolveResult classResolveResult = type.resolveGenerics();
PsiClassType substType = (PsiClassType)classResolveResult.getSubstitutor().substitute(superType);
try {
PsiElement replaced = typeElement.replace(factory.createTypeElement(substType));
PsiJavaCodeReferenceElement replacement = JavaPsiFacade.getElementFactory(myProject).createReferenceElementByType(substType);
while (!myClass.isEquivalentTo(ref.resolve()) && ref.getQualifier() instanceof PsiJavaCodeReferenceElement qRef) {
ref = qRef;
}
PsiElement replaced = ref.replace(replacement);
JavaCodeStyleManager.getInstance(myProject).shortenClassReferences(replaced);
}
catch(IncorrectOperationException e) {
@@ -0,0 +1,23 @@
import java.io.Serializable;
interface Descriptor {
Serializable createHolder();
}
class ObjectDescriptor implements Descriptor {
@Override
public Holder createHolder() {
return new Holder();
}
public class Holder implements Serializable {
}
}
class IntegerDesc<caret>riptor extends ObjectDescriptor {
}
class Some {
private final IntegerDescriptor.Holder holder = new IntegerDescriptor().createHolder();
}
@@ -0,0 +1,20 @@
import java.io.Serializable;
interface Descriptor {
Serializable createHolder();
}
class ObjectDescriptor implements Descriptor {
@Override
public Holder createHolder() {
return new Holder();
}
public class Holder implements Serializable {
}
}
class Some {
private final ObjectDescriptor.Holder holder = new ObjectDescriptor().createHolder();
}
@@ -1,4 +1,4 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.java.refactoring.inline;
import com.intellij.JavaTestUtil;
@@ -94,6 +94,10 @@ public class InlineToAnonymousClassTest extends LightRefactoringTestCase {
doTest(false, false);
}
public void testInnerClassReference() {
doTest(false, false);
}
public void testConstructorToInstanceInitializer() {
doTest(false, false);
}