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:
+13
-11
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user