From 122075c17a233138aa02a8d928ae030fce7a0fab Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 26 Jun 2020 09:36:17 +0700 Subject: [PATCH] IDEA-244540 NPE at conversion local interface to class GitOrigin-RevId: 13ec77e77a59cbb7aaa8a61cc6a515ee3b301bd0 --- .../ConvertInterfaceToClassIntention.java | 10 +++------- .../com/siyeh/ipp/interfaceToClass/LocalInterface.java | 7 +++++++ .../ipp/interfaceToClass/LocalInterface_after.java | 7 +++++++ .../interfacetoclass/ConvertInterfaceToClassTest.java | 3 ++- 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface_after.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassIntention.java index 8925761987d5..f636975ecf2e 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassIntention.java @@ -191,25 +191,21 @@ public class ConvertInterfaceToClassIntention extends Intention { } private static void moveSubClassImplementsToExtends(PsiClass oldInterface, Collection inheritors) { - final PsiJavaCodeReferenceElement oldInterfaceReference = - JavaPsiFacade.getElementFactory(oldInterface.getProject()).createClassReferenceElement(oldInterface); for (PsiClass inheritor : inheritors) { final PsiReferenceList implementsList = inheritor.getImplementsList(); final PsiReferenceList extendsList = inheritor.getExtendsList(); if (implementsList != null) { - moveReference(implementsList, extendsList, oldInterfaceReference); + moveReference(implementsList, extendsList, oldInterface); } } } private static void moveReference(@NotNull PsiReferenceList source, @Nullable PsiReferenceList target, - @NotNull PsiJavaCodeReferenceElement reference) { + @NotNull PsiClass oldInterface) { final PsiJavaCodeReferenceElement[] implementsReferences = source.getReferenceElements(); - final String qualifiedName = reference.getQualifiedName(); for (PsiJavaCodeReferenceElement implementsReference : implementsReferences) { - final String implementsReferenceQualifiedName = implementsReference.getQualifiedName(); - if (qualifiedName.equals(implementsReferenceQualifiedName)) { + if (implementsReference.isReferenceTo(oldInterface)) { if (target != null) { final PsiJavaCodeReferenceElement[] referenceElements = target.getReferenceElements(); if (referenceElements.length > 0) { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface.java new file mode 100644 index 000000000000..48338fc1efdd --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface.java @@ -0,0 +1,7 @@ +class A { + void foo() { + interface Local {} + class X implements Local {} + class X1 implements Cloneable, Local {} + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface_after.java new file mode 100644 index 000000000000..ebcfefec6e0a --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/interfaceToClass/LocalInterface_after.java @@ -0,0 +1,7 @@ +class A { + void foo() { + abstract class Local {} + class X extends Local {} + class X1 extends Local implements Cloneable {} + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassTest.java index 9ff2be49f31a..205cd8890cd7 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/interfacetoclass/ConvertInterfaceToClassTest.java @@ -13,6 +13,7 @@ public class ConvertInterfaceToClassTest extends IPPTestCase { public void testInnerInterface() { doTest(); } public void testStaticMethods() { doTest(); } public void testInterfaceExtendsClass() { doTest(); } + public void testLocalInterface() { doTest(); } public void testFunctionalExpressions() { try { @@ -54,6 +55,6 @@ public class ConvertInterfaceToClassTest extends IPPTestCase { @NotNull @Override protected LightProjectDescriptor getProjectDescriptor() { - return JAVA_8; + return JAVA_15; } }