[FIR] Type "top-level classifier names in package" as Name

- This is more consistent with "top-level callable names in package" and
  simplifies the set construction quite a bit, as we can avoid a lot of
  `asString` conversions.
This commit is contained in:
Marco Pennekamp
2023-10-19 19:21:45 +02:00
committed by Space Team
parent 8034d522b9
commit efe587691b
16 changed files with 43 additions and 41 deletions
@@ -51,7 +51,7 @@ internal class LLFirCombinedJavaSymbolProvider private constructor(
private val classCache: NullableCaffeineCache<ClassId, FirRegularClassSymbol> = NullableCaffeineCache { it.maximumSize(2500) }
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProviderWithoutCallables() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? = null
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? = null
override fun mayHaveTopLevelClassifier(classId: ClassId): Boolean = true
}
@@ -35,7 +35,7 @@ internal class LLFirCombinedSyntheticFunctionSymbolProvider private constructor(
// `FirCompositeSymbolNamesProvider` defines `mayHaveSyntheticFunctionTypes` and `mayHaveSyntheticFunctionType` correctly, which is
// needed for consistency should this symbol provider be part of another composite symbol provider.
object : FirCompositeSymbolNamesProvider(providers.map { it.symbolNamesProvider }) {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> = emptySet()
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
override fun getPackageNamesWithTopLevelCallables(): Set<String> = emptySet()
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
}
@@ -75,11 +75,9 @@ private class LLFirResolveExtensionToolSymbolNamesProvider(
private val packageFilter: LLFirResolveExtensionToolPackageFilter,
private val fileProvider: LLFirResolveExtensionsFileProvider,
) : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> = forbidAnalysis {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> = forbidAnalysis {
if (!packageFilter.packageExists(packageFqName)) return emptySet()
fileProvider.getFilesByPackage(packageFqName)
.flatMap { it.getTopLevelClassifierNames() }
.mapTo(mutableSetOf()) { it.asString() }
fileProvider.getFilesByPackage(packageFqName).flatMap { it.getTopLevelClassifierNames() }.toSet()
}
override fun getPackageNamesWithTopLevelCallables(): Set<String> = forbidAnalysis {
@@ -25,12 +25,10 @@ internal open class LLFirKotlinSymbolNamesProvider(
private val declarationProvider: KotlinDeclarationProvider,
private val allowKotlinPackage: Boolean? = null,
) : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> {
if (allowKotlinPackage == false && packageFqName.isKotlinPackage()) return emptySet()
return declarationProvider
.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)
.mapToSetOrEmpty { it.asString() }
return declarationProvider.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)
}
override fun getPackageNamesWithTopLevelCallables(): Set<String>? {
@@ -62,11 +62,11 @@ class NativeForwardDeclarationsSymbolProvider(
}
}
private val includedForwardDeclarationsByPackage: Map<FqName, Set<String>> by lazy {
buildMap<FqName, MutableSet<String>> {
private val includedForwardDeclarationsByPackage: Map<FqName, Set<Name>> by lazy {
buildMap<FqName, MutableSet<Name>> {
for (classId in includedForwardDeclarations) {
getOrPut(classId.packageFqName) { mutableSetOf() }
.add(classId.shortClassName.asString())
.add(classId.shortClassName)
}
}
}
@@ -157,7 +157,7 @@ class NativeForwardDeclarationsSymbolProvider(
}
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProviderWithoutCallables() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
includedForwardDeclarationsByPackage[packageFqName].orEmpty()
}
}
@@ -94,8 +94,11 @@ abstract class AbstractFirDeserializedSymbolProvider(
}
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirCachedSymbolNamesProvider(session) {
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<String>? {
val classesInPackage = knownTopLevelClassesInPackage(packageFqName) ?: return null
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<Name>? {
val classesInPackage = knownTopLevelClassesInPackage(packageFqName)
?.mapTo(mutableSetOf()) { Name.identifier(it) }
?.ifEmpty { emptySet() }
?: return null
if (packageFqName.asString() !in packageNamesForNonClassDeclarations) return classesInPackage
@@ -104,7 +107,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
return buildSet {
addAll(classesInPackage)
typeAliasNames.mapTo(this) { it.asString() }
addAll(typeAliasNames)
}
}
@@ -88,9 +88,9 @@ open class FirBuiltinSymbolProvider(
override fun getPackageNamesWithTopLevelCallables(): Set<String> =
allPackageFragments.keys.mapTo(mutableSetOf()) { it.asString() }
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
allPackageFragments[packageFqName]?.flatMapTo(mutableSetOf()) { fragment ->
fragment.classDataFinder.allClassIds.map { it.shortClassName.asString() }
fragment.classDataFinder.allClassIds.map { it.shortClassName }
}.orEmpty()
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name> =
@@ -71,8 +71,10 @@ open class JavaSymbolProvider(
override fun getPackage(fqName: FqName): FqName? = javaFacade.getPackage(fqName)
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProviderWithoutCallables() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? =
javaFacade.knownClassNamesInPackage(packageFqName)
?.mapTo(mutableSetOf()) { Name.identifier(it) }
?.ifEmpty { emptySet() }
}
}
@@ -64,12 +64,13 @@ class FirExtensionDeclarationsSymbolProvider private constructor(
)
}
private val classNamesInPackageCache: FirLazyValue<Map<FqName, Set<String>>> =
private val classNamesInPackageCache: FirLazyValue<Map<FqName, Set<Name>>> =
cachesFactory.createLazyValue {
computeNamesGroupedByPackage(
FirDeclarationGenerationExtension::getTopLevelClassIds,
ClassId::packageFqName
) { it.shortClassName.asString() }
ClassId::packageFqName,
ClassId::shortClassName,
)
}
private fun <I, N> computeNamesGroupedByPackage(
@@ -148,7 +149,7 @@ class FirExtensionDeclarationsSymbolProvider private constructor(
// ------------------------------------------ provider methods ------------------------------------------
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
classNamesInPackageCache.getValue()[packageFqName] ?: emptySet()
override fun getPackageNamesWithTopLevelCallables(): Set<String> =
@@ -38,7 +38,7 @@ class FirSwitchableExtensionDeclarationsSymbolProvider private constructor(
override fun getPackageNamesWithTopLevelCallables(): Set<String>? =
if (disabled) null else delegate.symbolNamesProvider.getPackageNamesWithTopLevelCallables()
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? =
if (disabled) null else delegate.symbolNamesProvider.getTopLevelClassifierNamesInPackage(packageFqName)
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? =
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
* A [FirSymbolNamesProvider] that caches all name sets.
*/
abstract class FirCachedSymbolNamesProvider(protected val session: FirSession) : FirSymbolNamesProvider() {
abstract fun computeTopLevelClassifierNames(packageFqName: FqName): Set<String>?
abstract fun computeTopLevelClassifierNames(packageFqName: FqName): Set<Name>?
abstract fun computePackageNamesWithTopLevelCallables(): Set<String>?
abstract fun computeTopLevelCallableNames(packageFqName: FqName): Set<Name>?
@@ -32,7 +32,7 @@ abstract class FirCachedSymbolNamesProvider(protected val session: FirSession) :
private val topLevelCallableNamesByPackage =
session.firCachesFactory.createCache(::computeTopLevelCallableNames)
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? =
topLevelClassifierNamesByPackage.getValue(packageFqName)
override fun getPackageNamesWithTopLevelCallables(): Set<String>? = topLevelCallablePackageNames
@@ -49,7 +49,7 @@ class FirDelegatingCachedSymbolNamesProvider(
session: FirSession,
private val delegate: FirSymbolNamesProvider,
) : FirCachedSymbolNamesProvider(session) {
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<String>? =
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<Name>? =
delegate.getTopLevelClassifierNamesInPackage(packageFqName)
override fun computePackageNamesWithTopLevelCallables(): Set<String>? =
@@ -68,7 +68,7 @@ open class FirCompositeCachedSymbolNamesProvider(
session: FirSession,
val providers: List<FirSymbolNamesProvider>,
) : FirCachedSymbolNamesProvider(session) {
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<String>? =
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<Name>? =
providers.flatMapToNullableSet { it.getTopLevelClassifierNamesInPackage(packageFqName) }
override fun computePackageNamesWithTopLevelCallables(): Set<String>? =
@@ -32,7 +32,7 @@ abstract class FirSymbolNamesProvider {
* All usages must take into account that the result might not include `kotlin.FunctionN` (and others for which a [FunctionTypeKind]
* exists).
*/
abstract fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>?
abstract fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>?
/**
* Returns the set of fully qualified package names which contain a top-level callable declaration within the provider's scope.
@@ -96,16 +96,16 @@ abstract class FirSymbolNamesProvider {
}
}
private fun Set<String>.mayContainTopLevelClassifier(shortClassName: Name): Boolean {
private fun Set<Name>.mayContainTopLevelClassifier(shortClassName: Name): Boolean {
// Symbol providers can potentially provide symbols for special names. Hence, special names have to be allowed.
return shortClassName.isSpecial || shortClassName.asString() in this
return shortClassName.isSpecial || shortClassName in this
}
/**
* A [FirSymbolNamesProvider] for symbol providers which can't provide any symbol name sets.
*/
object FirNullSymbolNamesProvider : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? = null
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? = null
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name>? = null
override fun getPackageNamesWithTopLevelCallables(): Set<String>? = null
override fun mayHaveTopLevelClassifier(classId: ClassId): Boolean = true
@@ -116,7 +116,7 @@ object FirNullSymbolNamesProvider : FirSymbolNamesProvider() {
* A [FirSymbolNamesProvider] for symbol providers which don't contain *any* symbols.
*/
object FirEmptySymbolNamesProvider : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> = emptySet()
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
override fun getPackageNamesWithTopLevelCallables(): Set<String> = emptySet()
override fun mayHaveTopLevelClassifier(classId: ClassId): Boolean = false
@@ -130,7 +130,7 @@ abstract class FirSymbolNamesProviderWithoutCallables : FirSymbolNamesProvider()
}
open class FirCompositeSymbolNamesProvider(val providers: List<FirSymbolNamesProvider>) : FirSymbolNamesProvider() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String>? {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name>? {
return providers.flatMapToNullableSet { it.getTopLevelClassifierNamesInPackage(packageFqName) }
}
@@ -43,7 +43,7 @@ class FirCachingCompositeSymbolProvider(
session,
providers.map { it.symbolNamesProvider },
) {
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<String>? =
override fun computeTopLevelClassifierNames(packageFqName: FqName): Set<Name>? =
super.computeTopLevelClassifierNames(packageFqName).also {
ensureNotNull(it) { "classifier names in package $packageFqName" }
}
@@ -92,7 +92,7 @@ abstract class FirSyntheticFunctionInterfaceProviderBase(
override fun mayHaveSyntheticFunctionType(classId: ClassId): Boolean = classId.getAcceptableFunctionTypeKind() != null
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
// Generated function type names aren't included in the top-level classifier names set.
emptySet()
@@ -79,9 +79,9 @@ class FirCloneableSymbolProvider(
}
override val symbolNamesProvider: FirSymbolNamesProvider = object : FirSymbolNamesProviderWithoutCallables() {
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
if (packageFqName == StandardClassIds.Cloneable.packageFqName) {
setOf(StandardClassIds.Cloneable.shortClassName.asString())
setOf(StandardClassIds.Cloneable.shortClassName)
} else emptySet()
}
@@ -85,8 +85,8 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: FirKotli
override fun getPackageNamesWithTopLevelCallables(): Set<String> =
state.allSubPackages.mapTo(mutableSetOf()) { it.asString() }
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<String> =
state.classifierInPackage[packageFqName].orEmpty().mapTo(mutableSetOf()) { it.asString() }
override fun getTopLevelClassifierNamesInPackage(packageFqName: FqName): Set<Name> =
state.classifierInPackage[packageFqName].orEmpty()
override fun getTopLevelCallableNamesInPackage(packageFqName: FqName): Set<Name> = buildSet {
for (key in state.functionMap.keys) {