Deduplicate code in JavaClassDataFinder

This commit is contained in:
Alexander Udalov
2016-12-07 18:51:16 +03:00
parent 41f2048f96
commit 921694e13a
2 changed files with 11 additions and 13 deletions
@@ -39,16 +39,18 @@ class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) {
}
fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? {
val classData = readClassData(kotlinClass) ?: return null
return components.classDeserializer.deserializeClass(kotlinClass.classId, classData)
}
internal fun readClassData(kotlinClass: KotlinJvmBinaryClass): ClassDataWithSource? {
val data = readData(kotlinClass, KOTLIN_CLASS) ?: return null
val strings = kotlinClass.classHeader.strings.sure { "String table not found in $kotlinClass" }
val classData = parseProto(kotlinClass) {
JvmProtoBufUtil.readClassDataFrom(data, strings)
}
val sourceElement = KotlinJvmBinarySourceElement(kotlinClass)
return components.classDeserializer.deserializeClass(
kotlinClass.classId,
ClassDataWithSource(classData, sourceElement)
)
return ClassDataWithSource(classData, sourceElement)
}
fun createKotlinPackagePartScope(descriptor: PackageFragmentDescriptor, kotlinClass: KotlinJvmBinaryClass): MemberScope? {
@@ -64,7 +66,7 @@ class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) {
}
}
internal fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
private fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
val header = kotlinClass.classHeader
if (!header.metadataVersion.isCompatible()) {
errorReporter.reportIncompatibleMetadataVersion(kotlinClass.classId, kotlinClass.location, header.metadataVersion)
@@ -19,20 +19,16 @@ package org.jetbrains.kotlin.load.kotlin
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.ClassDataWithSource
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
class JavaClassDataFinder(
internal val kotlinClassFinder: KotlinClassFinder,
private val deserializedDescriptorResolver: DeserializedDescriptorResolver
) : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassDataWithSource? {
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId) ?: return null
assert(kotlinJvmBinaryClass.classId == classId) {
"Class with incorrect id found: expected $classId, actual ${kotlinJvmBinaryClass.classId}"
val kotlinClass = kotlinClassFinder.findKotlinClass(classId) ?: return null
assert(kotlinClass.classId == classId) {
"Class with incorrect id found: expected $classId, actual ${kotlinClass.classId}"
}
val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, DeserializedDescriptorResolver.KOTLIN_CLASS) ?: return null
val strings = kotlinJvmBinaryClass.classHeader.strings ?: error("String table not found in $kotlinJvmBinaryClass")
val classData = JvmProtoBufUtil.readClassDataFrom(data, strings)
return ClassDataWithSource(classData, KotlinJvmBinarySourceElement(kotlinJvmBinaryClass))
return deserializedDescriptorResolver.readClassData(kotlinClass)
}
}