FIR: try to load as Java class if KotlinClassFinder returns null

The IDE implementation of KotlinClassFinder does not always return the
class file contents.
This commit is contained in:
pyos
2021-09-15 11:43:46 +02:00
committed by teamcityserver
parent f1befc0108
commit 36b02082a6
@@ -88,6 +88,17 @@ class KotlinDeserializedJvmSymbolsProvider(
private val KotlinJvmBinaryClass.isPreReleaseInvisible: Boolean private val KotlinJvmBinaryClass.isPreReleaseInvisible: Boolean
get() = classHeader.isPreRelease get() = classHeader.isPreRelease
private fun loadJavaClass(classId: ClassId, content: ByteArray?): ClassMetadataFindResult? {
val javaClass = try {
javaClassConverter.findClass(classId, content) ?: return null
} catch (e: ProcessCanceledException) {
return null
}
return ClassMetadataFindResult.NoMetadata { symbol ->
javaClassConverter.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
}
}
override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? { override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
// Kotlin classes are annotated Java classes, so this check also looks for them. // Kotlin classes are annotated Java classes, so this check also looks for them.
if (!javaClassConverter.hasTopLevelClassOf(classId)) return null if (!javaClassConverter.hasTopLevelClassOf(classId)) return null
@@ -99,17 +110,8 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
val kotlinClass = when (result) { val kotlinClass = when (result) {
is KotlinClassFinder.Result.KotlinClass -> result.kotlinJvmBinaryClass is KotlinClassFinder.Result.KotlinClass -> result.kotlinJvmBinaryClass
is KotlinClassFinder.Result.ClassFileContent -> { is KotlinClassFinder.Result.ClassFileContent -> return loadJavaClass(classId, result.content)
val javaClass = try { null -> return loadJavaClass(classId, null)
javaClassConverter.findClass(classId, result.content) ?: return null
} catch (e: ProcessCanceledException) {
return null
}
return ClassMetadataFindResult.NoMetadata { symbol ->
javaClassConverter.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
}
}
null -> return null
} }
if (kotlinClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null if (kotlinClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
val data = kotlinClass.classHeader.data ?: return null val data = kotlinClass.classHeader.data ?: return null