[FIR] KT-57207 JavaSymbolProvider: Accept existing JavaClasses
- `javaFacade.findClass` is a potentially costly operation. This commit extends `JavaSymbolProvider` and its class cache to accept an already existing `JavaClass` if provided, circumventing the `findClass` operation.
This commit is contained in:
committed by
Space Team
parent
b33c5f77ac
commit
f2e3c593a1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -25,12 +26,16 @@ class JavaSymbolProvider(
|
|||||||
session: FirSession,
|
session: FirSession,
|
||||||
private val javaFacade: FirJavaFacade,
|
private val javaFacade: FirJavaFacade,
|
||||||
) : FirSymbolProvider(session) {
|
) : FirSymbolProvider(session) {
|
||||||
|
private class ClassCacheContext(
|
||||||
|
val parentClassSymbol: FirRegularClassSymbol? = null,
|
||||||
|
val foundJavaClass: JavaClass? = null,
|
||||||
|
)
|
||||||
|
|
||||||
private val classCache =
|
private val classCache =
|
||||||
session.firCachesFactory.createCacheWithPostCompute(
|
session.firCachesFactory.createCacheWithPostCompute(
|
||||||
createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? ->
|
createValue = createValue@{ classId: ClassId, context: ClassCacheContext? ->
|
||||||
javaFacade.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) }
|
val javaClass = context?.foundJavaClass ?: javaFacade.findClass(classId) ?: return@createValue (null to (null to null))
|
||||||
?: (null to (null to null))
|
FirRegularClassSymbol(classId) to (javaClass to context?.parentClassSymbol)
|
||||||
},
|
},
|
||||||
postCompute = { _, classSymbol, (javaClass, parentClassSymbol) ->
|
postCompute = { _, classSymbol, (javaClass, parentClassSymbol) ->
|
||||||
if (classSymbol != null && javaClass != null) {
|
if (classSymbol != null && javaClass != null) {
|
||||||
@@ -39,20 +44,17 @@ class JavaSymbolProvider(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): FqName? =
|
|
||||||
javaFacade.getPackage(fqName)
|
|
||||||
|
|
||||||
override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? =
|
override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? =
|
||||||
if (javaFacade.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null
|
if (javaFacade.hasTopLevelClassOf(classId)) getClassLikeSymbolByClassId(classId, null) else null
|
||||||
|
|
||||||
override fun computePackageSetWithTopLevelCallables(): Set<String> = emptySet()
|
fun getClassLikeSymbolByClassId(classId: ClassId, javaClass: JavaClass?): FirRegularClassSymbol? =
|
||||||
|
classCache.getValue(
|
||||||
override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set<String>? = javaFacade.knownClassNamesInPackage(packageFqName)
|
classId,
|
||||||
|
ClassCacheContext(
|
||||||
override fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
|
parentClassSymbol = classId.outerClassId?.let { getClassLikeSymbolByClassId(it, null) },
|
||||||
|
foundJavaClass = javaClass,
|
||||||
private fun getFirJavaClass(classId: ClassId): FirRegularClassSymbol? =
|
)
|
||||||
classCache.getValue(classId, classId.outerClassId?.let { getFirJavaClass(it) })
|
)
|
||||||
|
|
||||||
@OptIn(FirSymbolProviderInternals::class)
|
@OptIn(FirSymbolProviderInternals::class)
|
||||||
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {}
|
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {}
|
||||||
@@ -62,7 +64,12 @@ class JavaSymbolProvider(
|
|||||||
|
|
||||||
@OptIn(FirSymbolProviderInternals::class)
|
@OptIn(FirSymbolProviderInternals::class)
|
||||||
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {}
|
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {}
|
||||||
|
|
||||||
|
override fun getPackage(fqName: FqName): FqName? = javaFacade.getPackage(fqName)
|
||||||
|
|
||||||
|
override fun computePackageSetWithTopLevelCallables(): Set<String> = emptySet()
|
||||||
|
override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set<String>? = javaFacade.knownClassNamesInPackage(packageFqName)
|
||||||
|
override fun computeCallableNamesInPackage(packageFqName: FqName): Set<Name> = emptySet()
|
||||||
}
|
}
|
||||||
|
|
||||||
val FirSession.javaSymbolProvider: JavaSymbolProvider? by FirSession.nullableSessionComponentAccessor()
|
val FirSession.javaSymbolProvider: JavaSymbolProvider? by FirSession.nullableSessionComponentAccessor()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user