[FIR] KTIJ-24296 Allow special names in symbol provider pre-filtering

- A special name such as `<no name provided>` may not be contained in
  the list of names, but may still be found by a provider.
This commit is contained in:
Marco Pennekamp
2023-02-16 17:06:38 +01:00
committed by Space Team
parent ece038b49b
commit a725fe559c
2 changed files with 12 additions and 6 deletions
@@ -56,6 +56,7 @@ internal abstract class LLFirSymbolProviderNameCache(private val firSession: Fir
} }
fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean { fun mayHaveTopLevelCallable(packageFqName: FqName, name: Name): Boolean {
if (name.isSpecial) return true
val names = getTopLevelCallableNamesInPackage(packageFqName) ?: return true val names = getTopLevelCallableNamesInPackage(packageFqName) ?: return true
return name in names return name in names
} }
@@ -131,16 +131,21 @@ fun Set<String>.mayHaveTopLevelClassifier(
): Boolean { ): Boolean {
if (mayBeFunctionClass && isNameForFunctionClass(classId, session)) return true if (mayBeFunctionClass && isNameForFunctionClass(classId, session)) return true
val outerClassId = classId.outerClassId if (classId.outerClassId == null) {
if (outerClassId == null && classId.shortClassName.asString() !in this) return false if (!mayHaveTopLevelClassifier(classId.shortClassName)) return false
if (outerClassId != null && classId.outermostClassId.shortClassName.asString() !in this) return false } else {
if (!mayHaveTopLevelClassifier(classId.outermostClassId.shortClassName)) return false
}
return true return true
} }
private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean { @Suppress("NOTHING_TO_INLINE")
return session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null private inline fun Set<String>.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<*>? { fun ClassId.toSymbol(session: FirSession): FirClassifierSymbol<*>? {
return session.symbolProvider.getClassLikeSymbolByClassId(this) return session.symbolProvider.getClassLikeSymbolByClassId(this)