diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index bac1603ae21..2c11962fe1e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -59,16 +59,19 @@ class FirLibrarySession private constructor( init { sessionProvider.sessionCache[moduleInfo] = this + val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, scope) _firSymbolProvider = FirCompositeSymbolProvider( listOf( FirLibrarySymbolProviderImpl(this), KotlinDeserializedJvmSymbolsProvider( this, sessionProvider.project, - packagePartProvider, kotlinClassFinder, + packagePartProvider, + javaSymbolProvider, + kotlinClassFinder, javaClassFinder ), - JavaSymbolProvider(this, sessionProvider.project, scope), + javaSymbolProvider, FirDependenciesSymbolProviderImpl(this) ) ) 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 0554b706772..354dfeaa7aa 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 @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter +import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -53,7 +54,10 @@ class JavaSymbolProvider( private val facade: KotlinJavaPsiFacade get() = KotlinJavaPsiFacade.getInstance(project) - private fun findClass(classId: ClassId): JavaClass? = facade.findClass(JavaClassFinder.Request(classId), searchScope) + private fun findClass( + classId: ClassId, + content: KotlinClassFinder.Result.ClassFileContent? + ): JavaClass? = facade.findClass(JavaClassFinder.Request(classId, previouslyFoundClassFileContent = content?.content), searchScope) override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List = emptyList() @@ -136,10 +140,12 @@ class JavaSymbolProvider( } } - override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? { + override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? = getFirJavaClass(classId) + + fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): ConeClassLikeSymbol? { if (!hasTopLevelClassOf(classId)) return null return classCache.lookupCacheOrCalculateWithPostCompute(classId, { - val foundClass = findClass(classId) + val foundClass = findClass(classId, content) if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) { null to null } else { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 70e82b87dbe..e870a67db16 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.* +import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.createConstant import org.jetbrains.kotlin.fir.java.topLevelName import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -61,6 +62,7 @@ class KotlinDeserializedJvmSymbolsProvider( val session: FirSession, val project: Project, private val packagePartProvider: PackagePartProvider, + private val javaSymbolProvider: JavaSymbolProvider, private val kotlinClassFinder: KotlinClassFinder, private val javaClassFinder: JavaClassFinder ) : AbstractFirSymbolProvider() { @@ -68,6 +70,8 @@ class KotlinDeserializedJvmSymbolsProvider( private val typeAliasCache = HashMap() private val packagePartsCache = HashMap>() + private val handledByJava = HashSet() + private class PackagePartsCacheData( val proto: ProtoBuf.Package, val context: FirDeserializationContext, @@ -313,10 +317,17 @@ class KotlinDeserializedJvmSymbolsProvider( if (!hasTopLevelClassOf(classId)) return null if (classesCache.containsKey(classId)) return classesCache[classId] + if (classId in handledByJava) return null -// return classesCache.getOrPut(classId) { - //return null - val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId) + val result = kotlinClassFinder.findKotlinClassOrContent(classId) + val kotlinJvmBinaryClass = when (result) { + is KotlinClassFinder.Result.KotlinClass -> result.kotlinJvmBinaryClass + is KotlinClassFinder.Result.ClassFileContent -> { + handledByJava.add(classId) + return javaSymbolProvider.getFirJavaClass(classId, result) as FirClassSymbol? + } + null -> null + } if (kotlinJvmBinaryClass == null) { val outerClassId = classId.outerClassId ?: return null val outerJvmBinaryClass = kotlinClassFinder.findKotlinClass(outerClassId) ?: return null