[FIR] Handle non-kotlin class results from findKotlinClassOrContent
This commit is contained in:
committed by
Mikhail Glukhikh
parent
2f53bd24dd
commit
2c5bd46a97
@@ -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)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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<ConeCallableSymbol> =
|
||||
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 {
|
||||
|
||||
+14
-3
@@ -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<ClassId, FirTypeAliasSymbol?>()
|
||||
private val packagePartsCache = HashMap<FqName, Collection<PackagePartsCacheData>>()
|
||||
|
||||
private val handledByJava = HashSet<ClassId>()
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user