[FIR IDE] Fix inner light classes creation

This commit is contained in:
Igor Yakovlev
2021-08-08 18:14:24 +02:00
parent 0ca7fb7af5
commit 21f36ef19a
3 changed files with 16 additions and 15 deletions
@@ -91,7 +91,7 @@ internal class FirLightAnonymousClassForSymbol(
result result
} }
private val _ownInnerClasses: List<FirLightClassForSymbol> by lazyPub { private val _ownInnerClasses: List<FirLightClassBase> by lazyPub {
anonymousObjectSymbol.createInnerClasses(manager) anonymousObjectSymbol.createInnerClasses(manager)
} }
@@ -72,7 +72,7 @@ internal class FirLightClassForSymbol(
override fun getExtendsList(): PsiReferenceList? = _extendsList override fun getExtendsList(): PsiReferenceList? = _extendsList
override fun getImplementsList(): PsiReferenceList? = _implementsList override fun getImplementsList(): PsiReferenceList? = _implementsList
private val _ownInnerClasses: List<FirLightClassForSymbol> by lazyPub { private val _ownInnerClasses: List<FirLightClassBase> by lazyPub {
classOrObjectSymbol.createInnerClasses(manager) classOrObjectSymbol.createInnerClasses(manager)
} }
@@ -57,29 +57,30 @@ fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? =
val anonymousObject = classOrObject.parent as? KtObjectLiteralExpression val anonymousObject = classOrObject.parent as? KtObjectLiteralExpression
if (anonymousObject != null) { if (anonymousObject != null) {
return analyseForLightClasses(anonymousObject) { return analyseForLightClasses(anonymousObject) {
FirLightAnonymousClassForSymbol(anonymousObject.getAnonymousObjectSymbol(), anonymousObject.manager) anonymousObject.getAnonymousObjectSymbol().createLightClassNoCache(anonymousObject.manager)
} }
} }
return when { return when {
classOrObject is KtEnumEntry -> lightClassForEnumEntry(classOrObject) classOrObject is KtEnumEntry -> lightClassForEnumEntry(classOrObject)
classOrObject.hasModifier(KtTokens.INLINE_KEYWORD) -> return null //TODO classOrObject.hasModifier(KtTokens.INLINE_KEYWORD) -> return null //TODO
else -> { else -> {
analyseForLightClasses(classOrObject) { analyseForLightClasses(classOrObject) {
when (val symbol = classOrObject.getClassOrObjectSymbol()) { classOrObject.getClassOrObjectSymbol().createLightClassNoCache(classOrObject.manager)
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)
}
}
} }
} }
} }
} }
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( fun getOrCreateFirLightFacade(
ktFiles: List<KtFile>, ktFiles: List<KtFile>,
facadeClassFqName: FqName, facadeClassFqName: FqName,
@@ -320,8 +321,8 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su
return listBuilder return listBuilder
} }
internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<FirLightClassForSymbol> { internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<FirLightClassBase> {
val result = ArrayList<FirLightClassForSymbol>() val result = ArrayList<FirLightClassBase>()
// workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927 // 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 // 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<F
analyzeWithSymbolAsContext(this) { analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getClassifierSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) { getDeclaredMemberScope().getClassifierSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) {
FirLightClassForSymbol(it, manager) it.createLightClassNoCache(manager)
} }
} }