Skip to content

Commit 99273c7

Browse files
igoriakovlevzarechenskiy
authored andcommitted
[ULC] Fix invalid positive inheritor for self checking
Fixed #KT-43824
1 parent fac791f commit 99273c7

File tree

4 files changed

+18
-5
lines changed

4 files changed

+18
-5
lines changed

compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,19 +264,20 @@ abstract class KtLightClassForSourceDeclaration(
264264
override fun isValid(): Boolean = classOrObject.isValid
265265

266266
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean {
267+
if (manager.areElementsEquivalent(baseClass, this)) return false
267268
LightClassInheritanceHelper.getService(project).isInheritor(this, baseClass, checkDeep).ifSure { return it }
268269

269270
val qualifiedName: String? = if (baseClass is KtLightClassForSourceDeclaration) {
270-
val baseDescriptor = baseClass.getDescriptor()
271-
if (baseDescriptor != null) DescriptorUtils.getFqName(baseDescriptor).asString() else null
271+
baseClass.getDescriptor()?.let(DescriptorUtils::getFqName)?.asString()
272272
} else {
273273
baseClass.qualifiedName
274274
}
275275

276276
val thisDescriptor = getDescriptor()
277277

278278
return if (qualifiedName != null && thisDescriptor != null) {
279-
checkSuperTypeByFQName(thisDescriptor, qualifiedName, checkDeep)
279+
qualifiedName != DescriptorUtils.getFqName(thisDescriptor).asString() &&
280+
checkSuperTypeByFQName(thisDescriptor, qualifiedName, checkDeep)
280281
} else {
281282
InheritanceImplUtil.isInheritor(this, baseClass, checkDeep)
282283
}

idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class IdeLightClassInheritanceHelper : LightClassInheritanceHelper {
3636
checkDeep: Boolean
3737
): ImpreciseResolveResult {
3838
if (baseClass.project.isInDumbMode()) return NO_MATCH
39+
if (lightClass.manager.areElementsEquivalent(baseClass, lightClass)) return NO_MATCH
3940

4041
val classOrObject = lightClass.kotlinOrigin ?: return UNSURE
4142
val entries = classOrObject.superTypeListEntries

idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/KtFakeLightClass.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.intellij.psi.impl.PsiClassImplUtil
1212
import com.intellij.psi.impl.light.AbstractLightClass
1313
import com.intellij.psi.impl.light.LightMethod
1414
import com.intellij.util.IncorrectOperationException
15+
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult
1516
import org.jetbrains.kotlin.asJava.classes.KtLightClass
1617
import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper
1718
import org.jetbrains.kotlin.asJava.elements.KtLightElement
@@ -48,11 +49,17 @@ class KtFakeLightClass(override val kotlinOrigin: KtClassOrObject) :
4849
override fun getUseScope() = kotlinOrigin.useScope
4950

5051
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean {
52+
if (manager.areElementsEquivalent(baseClass, this)) return false
5153
LightClassInheritanceHelper.getService(project).isInheritor(this, baseClass, checkDeep).ifSure { return it }
5254

5355
val baseKtClass = (baseClass as? KtLightClass)?.kotlinOrigin ?: return false
5456
val baseDescriptor = baseKtClass.resolveToDescriptorIfAny() ?: return false
5557
val thisDescriptor = kotlinOrigin.resolveToDescriptorIfAny() ?: return false
58+
59+
val thisFqName = DescriptorUtils.getFqName(thisDescriptor).asString()
60+
val baseFqName = DescriptorUtils.getFqName(baseDescriptor).asString()
61+
if (thisFqName == baseFqName) return false
62+
5663
return if (checkDeep)
5764
DescriptorUtils.isSubclass(thisDescriptor, baseDescriptor)
5865
else

idea/tests/org/jetbrains/kotlin/asJava/KotlinLightClassInheritorTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,16 @@ class KotlinLightClassInheritorTest : KotlinLightCodeInsightFixtureTestCase() {
3838
doTestInheritorByText("abstract class A<T> : List<T>", "java.lang.Object", true)
3939
}
4040

41-
private fun doTestInheritorByText(text: String, superQName: String, checkDeep: Boolean) {
41+
fun testClassOnSelfDeep() {
42+
doTestInheritorByText("class A", "A", checkDeep = true, result = false)
43+
}
44+
45+
private fun doTestInheritorByText(text: String, superQName: String, checkDeep: Boolean, result: Boolean = true) {
4246
val file = myFixture.configureByText("A.kt", text) as KtFile
4347
val jetClass = file.declarations.filterIsInstance<KtClass>().single()
4448
val psiClass = KotlinAsJavaSupport.getInstance(project).getLightClass(jetClass)!!
4549
val baseClass = JavaPsiFacade.getInstance(project).findClass(superQName, GlobalSearchScope.allScope(project))!!
46-
Assert.assertTrue(psiClass.isInheritor(baseClass, checkDeep))
50+
Assert.assertEquals(psiClass.isInheritor(baseClass, checkDeep), result)
4751
}
4852

4953
override fun getProjectDescriptor(): LightProjectDescriptor = KotlinLightProjectDescriptor.INSTANCE

0 commit comments

Comments
 (0)