[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 {
if (name.isSpecial) return true
val names = getTopLevelCallableNamesInPackage(packageFqName) ?: return true
return name in names
}
@@ -131,16 +131,21 @@ fun Set<String>.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<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<*>? {
return session.symbolProvider.getClassLikeSymbolByClassId(this)