mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Java: fix 'Inline to Anonymous class' doesn't work for class with inner class (IDEA-365779)
GitOrigin-RevId: 5d1b8577e541fed47fb9ba4e0d8c17affa8fbf5d
This commit is contained in:
committed by
intellij-monorepo-bot
parent
70e193b482
commit
c64d343e65
+14
-13
@@ -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();
|
||||
}
|
||||
+20
@@ -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();
|
||||
}
|
||||
+5
-1
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user