Analysis LC: fix isSubClass check for local LC

This commit is contained in:
Ilya Kirillov
2021-12-31 19:50:10 +03:00
parent b81316738e
commit e6fc434489
4 changed files with 19 additions and 26 deletions
@@ -98,8 +98,6 @@ internal class FirLightAnonymousClassForSymbol(
override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this) override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this)
override fun getSupers(): Array<PsiClass> = PsiClassImplUtil.getSupers(this) override fun getSupers(): Array<PsiClass> = PsiClassImplUtil.getSupers(this)
override fun getSuperTypes(): Array<PsiClassType> = PsiClassImplUtil.getSuperTypes(this) override fun getSuperTypes(): Array<PsiClassType> = PsiClassImplUtil.getSuperTypes(this)
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean =
InheritanceImplUtil.isInheritor(this, baseClass, checkDeep)
override fun isInheritorDeep(baseClass: PsiClass?, classToByPass: PsiClass?): Boolean = override fun isInheritorDeep(baseClass: PsiClass?, classToByPass: PsiClass?): Boolean =
baseClass?.let { InheritanceImplUtil.isInheritorDeep(this, it, classToByPass) } ?: false baseClass?.let { InheritanceImplUtil.isInheritorDeep(this, it, classToByPass) } ?: false
@@ -22,10 +22,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Pair import com.intellij.openapi.util.Pair
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.PsiCachedValueImpl import com.intellij.psi.impl.*
import com.intellij.psi.impl.PsiClassImplUtil
import com.intellij.psi.impl.PsiImplUtil
import com.intellij.psi.impl.PsiSuperMethodImplUtil
import com.intellij.psi.impl.light.LightElement import com.intellij.psi.impl.light.LightElement
import com.intellij.psi.impl.source.PsiExtensibleClass import com.intellij.psi.impl.source.PsiExtensibleClass
import com.intellij.psi.javadoc.PsiDocComment import com.intellij.psi.javadoc.PsiDocComment
@@ -34,14 +31,12 @@ import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.PsiUtil import com.intellij.psi.util.PsiUtil
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.asJava.classes.KotlinClassInnerStuffCache
import org.jetbrains.kotlin.asJava.classes.KotlinClassInnerStuffCache.Companion.processDeclarationsInEnum import org.jetbrains.kotlin.asJava.classes.KotlinClassInnerStuffCache.Companion.processDeclarationsInEnum
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.analysis.api.tokens.hackyAllowRunningOnEdt import org.jetbrains.kotlin.analysis.api.tokens.hackyAllowRunningOnEdt
import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.light.classes.symbol.classes.checkIsInheritor
import javax.swing.Icon import javax.swing.Icon
abstract class FirLightClassBase protected constructor(manager: PsiManager) : LightElement(manager, KotlinLanguage.INSTANCE), PsiClass, abstract class FirLightClassBase protected constructor(manager: PsiManager) : LightElement(manager, KotlinLanguage.INSTANCE), PsiClass,
@@ -106,6 +101,20 @@ abstract class FirLightClassBase protected constructor(manager: PsiManager) : Li
) )
} }
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 thisClassOrigin = kotlinOrigin
val baseClassOrigin = (baseClass as? KtLightClass)?.kotlinOrigin
return if (baseClassOrigin != null && thisClassOrigin != null) {
thisClassOrigin.checkIsInheritor(baseClassOrigin, checkDeep)
} else {
InheritanceImplUtil.isInheritor(this, baseClass, checkDeep)
}
}
override fun getText(): String = kotlinOrigin?.text ?: "" override fun getText(): String = kotlinOrigin?.text ?: ""
override fun getLanguage(): KotlinLanguage = KotlinLanguage.INSTANCE override fun getLanguage(): KotlinLanguage = KotlinLanguage.INSTANCE
@@ -135,20 +135,6 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
override fun isValid(): Boolean = kotlinOrigin?.isValid ?: true override fun isValid(): Boolean = kotlinOrigin?.isValid ?: true
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 thisClassOrigin = kotlinOrigin
val baseClassOrigin = (baseClass as? KtLightClass)?.kotlinOrigin
return if (baseClassOrigin != null && thisClassOrigin != null) {
thisClassOrigin.checkIsInheritor(baseClassOrigin, checkDeep)
} else {
InheritanceImplUtil.isInheritor(this, baseClass, checkDeep)
}
}
override fun toString() = override fun toString() =
"${this::class.java.simpleName}:${kotlinOrigin?.getDebugText()}" "${this::class.java.simpleName}:${kotlinOrigin?.getDebugText()}"
@@ -435,8 +435,8 @@ internal fun KtSymbolWithMembers.createInnerClasses(
internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean { internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
return analyseForLightClasses(this) { return analyseForLightClasses(this) {
val subClassSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol() ?: return false val subClassSymbol = this@checkIsInheritor.getClassOrObjectSymbol()
val superClassSymbol = baseClassOrigin.getNamedClassOrObjectSymbol() ?: return false val superClassSymbol = baseClassOrigin.getClassOrObjectSymbol()
if (subClassSymbol == superClassSymbol) return@analyseForLightClasses false if (subClassSymbol == superClassSymbol) return@analyseForLightClasses false