From 36b02082a67cac751366f542853dfc6188d50f01 Mon Sep 17 00:00:00 2001 From: pyos Date: Wed, 15 Sep 2021 11:43:46 +0200 Subject: [PATCH] FIR: try to load as Java class if KotlinClassFinder returns null The IDE implementation of KotlinClassFinder does not always return the class file contents. --- .../KotlinDeserializedJvmSymbolsProvider.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) 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 aa152fa3c0a..80101d3d8dd 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 @@ -88,6 +88,17 @@ class KotlinDeserializedJvmSymbolsProvider( private val KotlinJvmBinaryClass.isPreReleaseInvisible: Boolean 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? { // Kotlin classes are annotated Java classes, so this check also looks for them. if (!javaClassConverter.hasTopLevelClassOf(classId)) return null @@ -99,17 +110,8 @@ class KotlinDeserializedJvmSymbolsProvider( } val kotlinClass = when (result) { is KotlinClassFinder.Result.KotlinClass -> result.kotlinJvmBinaryClass - is KotlinClassFinder.Result.ClassFileContent -> { - val javaClass = try { - 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 + is KotlinClassFinder.Result.ClassFileContent -> return loadJavaClass(classId, result.content) + null -> return loadJavaClass(classId, null) } if (kotlinClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null val data = kotlinClass.classHeader.data ?: return null