[LL FIR] KTIJ-24296 Extract symbol provider name cache into a class
- The caching logic from `LLFirProvider` may be used in other symbol providers.
This commit is contained in:
committed by
Space Team
parent
d9a024bab2
commit
ece038b49b
+25
-25
@@ -79,31 +79,6 @@ abstract class FirSymbolProvider(val session: FirSession) : FirSessionComponent
|
||||
* @returns top-level callable names that belong to `packageFqName` or null if it's complicated to compute the set
|
||||
*/
|
||||
abstract fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name>?
|
||||
|
||||
/**
|
||||
* Whether [classId] may be contained in the [knownClassifierNames].
|
||||
*
|
||||
* If it's certain that [classId] cannot be a function class (for example when [classId] is known to come from a package without
|
||||
* function classes), [mayBeFunctionClass] can be set to `false`. This avoids a hash map access in
|
||||
* [org.jetbrains.kotlin.builtins.functions.FunctionTypeKindExtractor.getFunctionalClassKindWithArity].
|
||||
*/
|
||||
protected fun mayHaveTopLevelClassifier(
|
||||
classId: ClassId,
|
||||
knownClassifierNames: Set<String>,
|
||||
mayBeFunctionClass: Boolean = true,
|
||||
): Boolean {
|
||||
if (mayBeFunctionClass && isNameForFunctionClass(classId)) return true
|
||||
|
||||
val outerClassId = classId.outerClassId
|
||||
if (outerClassId == null && classId.shortClassName.asString() !in knownClassifierNames) return false
|
||||
if (outerClassId != null && classId.outermostClassId.shortClassName.asString() !in knownClassifierNames) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun isNameForFunctionClass(classId: ClassId): Boolean {
|
||||
return session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -142,6 +117,31 @@ fun FirSymbolProvider.getRegularClassSymbolByClassId(classId: ClassId): FirRegul
|
||||
return getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether [classId] may be contained in the set of known classifier names.
|
||||
*
|
||||
* If it's certain that [classId] cannot be a function class (for example when [classId] is known to come from a package without
|
||||
* function classes), [mayBeFunctionClass] can be set to `false`. This avoids a hash map access in
|
||||
* [org.jetbrains.kotlin.builtins.functions.FunctionTypeKindExtractor.getFunctionalClassKindWithArity].
|
||||
*/
|
||||
fun Set<String>.mayHaveTopLevelClassifier(
|
||||
classId: ClassId,
|
||||
session: FirSession,
|
||||
mayBeFunctionClass: Boolean = true,
|
||||
): 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
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean {
|
||||
return session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null
|
||||
}
|
||||
|
||||
fun ClassId.toSymbol(session: FirSession): FirClassifierSymbol<*>? {
|
||||
return session.symbolProvider.getClassLikeSymbolByClassId(this)
|
||||
}
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.caches.getValue
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.flatMapToNullableSet
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.mayHaveTopLevelClassifier
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
@@ -106,7 +107,7 @@ class FirCachingCompositeSymbolProvider(
|
||||
|
||||
override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
val knownClassifierNames = knownTopLevelClassifierNamesInPackage.getValue(classId.packageFqName)
|
||||
if (knownClassifierNames != null && !mayHaveTopLevelClassifier(classId, knownClassifierNames)) return null
|
||||
if (knownClassifierNames != null && !knownClassifierNames.mayHaveTopLevelClassifier(classId, session)) return null
|
||||
|
||||
return classLikeCache.getValue(classId)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user