From 21f36ef19af4ad6c93a2cc4d27dd08777858e309 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Sun, 8 Aug 2021 18:14:24 +0200 Subject: [PATCH] [FIR IDE] Fix inner light classes creation --- .../FirLightAnonymousClassForSymbol.kt | 2 +- .../asJava/classes/FirLightClassForSymbol.kt | 2 +- .../idea/asJava/classes/firLightClassUtils.kt | 27 ++++++++++--------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt index 39ab301d69e..03a097bf6bf 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt @@ -91,7 +91,7 @@ internal class FirLightAnonymousClassForSymbol( result } - private val _ownInnerClasses: List by lazyPub { + private val _ownInnerClasses: List by lazyPub { anonymousObjectSymbol.createInnerClasses(manager) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt index c33c23f4ced..0375c38b3a1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt @@ -72,7 +72,7 @@ internal class FirLightClassForSymbol( override fun getExtendsList(): PsiReferenceList? = _extendsList override fun getImplementsList(): PsiReferenceList? = _implementsList - private val _ownInnerClasses: List by lazyPub { + private val _ownInnerClasses: List by lazyPub { classOrObjectSymbol.createInnerClasses(manager) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index 468058d4f3a..e29bd25113a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -57,29 +57,30 @@ fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? = val anonymousObject = classOrObject.parent as? KtObjectLiteralExpression if (anonymousObject != null) { return analyseForLightClasses(anonymousObject) { - FirLightAnonymousClassForSymbol(anonymousObject.getAnonymousObjectSymbol(), anonymousObject.manager) + anonymousObject.getAnonymousObjectSymbol().createLightClassNoCache(anonymousObject.manager) } } return when { classOrObject is KtEnumEntry -> lightClassForEnumEntry(classOrObject) classOrObject.hasModifier(KtTokens.INLINE_KEYWORD) -> return null //TODO - else -> { analyseForLightClasses(classOrObject) { - when (val symbol = classOrObject.getClassOrObjectSymbol()) { - is KtAnonymousObjectSymbol -> FirLightAnonymousClassForSymbol(symbol, classOrObject.manager) - is KtNamedClassOrObjectSymbol -> when (symbol.classKind) { - KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(symbol, classOrObject.manager) - KtClassKind.ANNOTATION_CLASS -> FirLightAnnotationClassSymbol(symbol, classOrObject.manager) - else -> FirLightClassForSymbol(symbol, classOrObject.manager) - } - } + classOrObject.getClassOrObjectSymbol().createLightClassNoCache(classOrObject.manager) } } } } +internal fun KtClassOrObjectSymbol.createLightClassNoCache(manager: PsiManager): FirLightClassBase = when (this) { + is KtAnonymousObjectSymbol -> FirLightAnonymousClassForSymbol(this, manager) + is KtNamedClassOrObjectSymbol -> when (classKind) { + KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(this, manager) + KtClassKind.ANNOTATION_CLASS -> FirLightAnnotationClassSymbol(this, manager) + else -> FirLightClassForSymbol(this, manager) + } +} + fun getOrCreateFirLightFacade( ktFiles: List, facadeClassFqName: FqName, @@ -320,8 +321,8 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su return listBuilder } -internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List { - val result = ArrayList() +internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List { + val result = ArrayList() // workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927 // inner classes with null names can't be searched for and can't be used from java anyway @@ -329,7 +330,7 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List().mapTo(result) { - FirLightClassForSymbol(it, manager) + it.createLightClassNoCache(manager) } }