diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 97b528802dc..bb844689d7f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -264,11 +264,11 @@ abstract class KtLightClassForSourceDeclaration( override fun isValid(): Boolean = classOrObject.isValid override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean { + if (manager.areElementsEquivalent(baseClass, this)) return false LightClassInheritanceHelper.getService(project).isInheritor(this, baseClass, checkDeep).ifSure { return it } val qualifiedName: String? = if (baseClass is KtLightClassForSourceDeclaration) { - val baseDescriptor = baseClass.getDescriptor() - if (baseDescriptor != null) DescriptorUtils.getFqName(baseDescriptor).asString() else null + baseClass.getDescriptor()?.let(DescriptorUtils::getFqName)?.asString() } else { baseClass.qualifiedName } @@ -276,7 +276,8 @@ abstract class KtLightClassForSourceDeclaration( val thisDescriptor = getDescriptor() return if (qualifiedName != null && thisDescriptor != null) { - checkSuperTypeByFQName(thisDescriptor, qualifiedName, checkDeep) + qualifiedName != DescriptorUtils.getFqName(thisDescriptor).asString() && + checkSuperTypeByFQName(thisDescriptor, qualifiedName, checkDeep) } else { InheritanceImplUtil.isInheritor(this, baseClass, checkDeep) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt index 3714177d6f0..aa32f79ed16 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt @@ -36,6 +36,7 @@ class IdeLightClassInheritanceHelper : LightClassInheritanceHelper { checkDeep: Boolean ): ImpreciseResolveResult { if (baseClass.project.isInDumbMode()) return NO_MATCH + if (lightClass.manager.areElementsEquivalent(baseClass, lightClass)) return NO_MATCH val classOrObject = lightClass.kotlinOrigin ?: return UNSURE val entries = classOrObject.superTypeListEntries diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/KtFakeLightClass.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/KtFakeLightClass.kt index 9ef7293221e..ab6e1f6416f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/KtFakeLightClass.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/KtFakeLightClass.kt @@ -12,6 +12,7 @@ import com.intellij.psi.impl.PsiClassImplUtil import com.intellij.psi.impl.light.AbstractLightClass import com.intellij.psi.impl.light.LightMethod import com.intellij.util.IncorrectOperationException +import org.jetbrains.kotlin.asJava.ImpreciseResolveResult import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper import org.jetbrains.kotlin.asJava.elements.KtLightElement @@ -48,11 +49,17 @@ class KtFakeLightClass(override val kotlinOrigin: KtClassOrObject) : override fun getUseScope() = kotlinOrigin.useScope override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean { + if (manager.areElementsEquivalent(baseClass, this)) return false LightClassInheritanceHelper.getService(project).isInheritor(this, baseClass, checkDeep).ifSure { return it } val baseKtClass = (baseClass as? KtLightClass)?.kotlinOrigin ?: return false val baseDescriptor = baseKtClass.resolveToDescriptorIfAny() ?: return false val thisDescriptor = kotlinOrigin.resolveToDescriptorIfAny() ?: return false + + val thisFqName = DescriptorUtils.getFqName(thisDescriptor).asString() + val baseFqName = DescriptorUtils.getFqName(baseDescriptor).asString() + if (thisFqName == baseFqName) return false + return if (checkDeep) DescriptorUtils.isSubclass(thisDescriptor, baseDescriptor) else diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KotlinLightClassInheritorTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KotlinLightClassInheritorTest.kt index f1b3f9afbdf..b1e7f7a9489 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KotlinLightClassInheritorTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KotlinLightClassInheritorTest.kt @@ -38,12 +38,16 @@ class KotlinLightClassInheritorTest : KotlinLightCodeInsightFixtureTestCase() { doTestInheritorByText("abstract class A : List", "java.lang.Object", true) } - private fun doTestInheritorByText(text: String, superQName: String, checkDeep: Boolean) { + fun testClassOnSelfDeep() { + doTestInheritorByText("class A", "A", checkDeep = true, result = false) + } + + private fun doTestInheritorByText(text: String, superQName: String, checkDeep: Boolean, result: Boolean = true) { val file = myFixture.configureByText("A.kt", text) as KtFile val jetClass = file.declarations.filterIsInstance().single() val psiClass = KotlinAsJavaSupport.getInstance(project).getLightClass(jetClass)!! val baseClass = JavaPsiFacade.getInstance(project).findClass(superQName, GlobalSearchScope.allScope(project))!! - Assert.assertTrue(psiClass.isInheritor(baseClass, checkDeep)) + Assert.assertEquals(psiClass.isInheritor(baseClass, checkDeep), result) } override fun getProjectDescriptor(): LightProjectDescriptor = KotlinLightProjectDescriptor.INSTANCE