diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index f13b28632c4..ecb09add760 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -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.FirPropertySymbol 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.FqName import org.jetbrains.kotlin.name.Name @@ -25,12 +26,16 @@ class JavaSymbolProvider( session: FirSession, private val javaFacade: FirJavaFacade, ) : FirSymbolProvider(session) { + private class ClassCacheContext( + val parentClassSymbol: FirRegularClassSymbol? = null, + val foundJavaClass: JavaClass? = null, + ) private val classCache = session.firCachesFactory.createCacheWithPostCompute( - createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? -> - javaFacade.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) } - ?: (null to (null to null)) + createValue = createValue@{ classId: ClassId, context: ClassCacheContext? -> + val javaClass = context?.foundJavaClass ?: javaFacade.findClass(classId) ?: return@createValue (null to (null to null)) + FirRegularClassSymbol(classId) to (javaClass to context?.parentClassSymbol) }, postCompute = { _, classSymbol, (javaClass, parentClassSymbol) -> 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? = - if (javaFacade.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null + if (javaFacade.hasTopLevelClassOf(classId)) getClassLikeSymbolByClassId(classId, null) else null - override fun computePackageSetWithTopLevelCallables(): Set = emptySet() - - override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set? = javaFacade.knownClassNamesInPackage(packageFqName) - - override fun computeCallableNamesInPackage(packageFqName: FqName): Set = emptySet() - - private fun getFirJavaClass(classId: ClassId): FirRegularClassSymbol? = - classCache.getValue(classId, classId.outerClassId?.let { getFirJavaClass(it) }) + fun getClassLikeSymbolByClassId(classId: ClassId, javaClass: JavaClass?): FirRegularClassSymbol? = + classCache.getValue( + classId, + ClassCacheContext( + parentClassSymbol = classId.outerClassId?.let { getClassLikeSymbolByClassId(it, null) }, + foundJavaClass = javaClass, + ) + ) @OptIn(FirSymbolProviderInternals::class) override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) {} @@ -62,7 +64,12 @@ class JavaSymbolProvider( @OptIn(FirSymbolProviderInternals::class) override fun getTopLevelPropertySymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) {} + + override fun getPackage(fqName: FqName): FqName? = javaFacade.getPackage(fqName) + + override fun computePackageSetWithTopLevelCallables(): Set = emptySet() + override fun knownTopLevelClassifiersInPackage(packageFqName: FqName): Set? = javaFacade.knownClassNamesInPackage(packageFqName) + override fun computeCallableNamesInPackage(packageFqName: FqName): Set = emptySet() } val FirSession.javaSymbolProvider: JavaSymbolProvider? by FirSession.nullableSessionComponentAccessor() -