From a725fe559c090a1be8528e97ce47bdb1e9995283 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Thu, 16 Feb 2023 17:06:38 +0100 Subject: [PATCH] [FIR] KTIJ-24296 Allow special names in symbol provider pre-filtering - A special name such as `` may not be contained in the list of names, but may still be found by a provider. --- .../fir/util/LLFirSymbolProviderNameCache.kt | 1 + .../fir/resolve/providers/FirSymbolProvider.kt | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt index 6804b6448f9..7cb05268e49 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirSymbolProviderNameCache.kt @@ -56,6 +56,7 @@ internal abstract class LLFirSymbolProviderNameCache(private val firSession: Fir } fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean { + if (name.isSpecial) return true val names = getTopLevelCallableNamesInPackage(packageFqName) ?: return true return name in names } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt index 641f8303dd9..6be3cd1820e 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt @@ -131,16 +131,21 @@ fun Set.mayHaveTopLevelClassifier( ): Boolean { if (mayBeFunctionClass && isNameForFunctionClass(classId, session)) return true - val outerClassId = classId.outerClassId - if (outerClassId == null && classId.shortClassName.asString() !in this) return false - if (outerClassId != null && classId.outermostClassId.shortClassName.asString() !in this) return false + if (classId.outerClassId == null) { + if (!mayHaveTopLevelClassifier(classId.shortClassName)) return false + } else { + if (!mayHaveTopLevelClassifier(classId.outermostClassId.shortClassName)) return false + } return true } -private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean { - return session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null -} +@Suppress("NOTHING_TO_INLINE") +private inline fun Set.mayHaveTopLevelClassifier(shortClassName: Name): Boolean = + shortClassName.asString() in this || shortClassName.isSpecial + +private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean = + session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null fun ClassId.toSymbol(session: FirSession): FirClassifierSymbol<*>? { return session.symbolProvider.getClassLikeSymbolByClassId(this)