J2K DeserializedDescriptorResolver: prettify

This commit is contained in:
Alexander Udalov
2016-01-19 18:13:21 +03:00
parent 3efa51af40
commit 4d93d18af7
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.load.kotlin
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.Kind.*
import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.ClassDataWithSource
@@ -27,66 +26,54 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationCompone
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import java.util.* import org.jetbrains.kotlin.utils.sure
import javax.inject.Inject import javax.inject.Inject
class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) { class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) {
private var components: DeserializationComponents? = null lateinit var components: DeserializationComponents
// component dependency cycle // component dependency cycle
@Inject @Inject
fun setComponents(context: DeserializationComponentsForJava) { fun setComponents(components: DeserializationComponentsForJava) {
this.components = context.components this.components = components.components
} }
fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? { fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? {
val data = readData(kotlinClass, KOTLIN_CLASS) val data = readData(kotlinClass, KOTLIN_CLASS) ?: return null
if (data != null) { val strings = kotlinClass.classHeader.strings.sure { "String table not found in $kotlinClass" }
val strings = kotlinClass.classHeader.strings val classData = JvmProtoBufUtil.readClassDataFrom(data, strings)
assert(strings != null) { "String table not found in " + kotlinClass } val sourceElement = KotlinJvmBinarySourceElement(kotlinClass)
val classData = JvmProtoBufUtil.readClassDataFrom(data, strings) return components.classDeserializer.deserializeClass(
val sourceElement = KotlinJvmBinarySourceElement(kotlinClass) kotlinClass.classId,
return components!!.classDeserializer.deserializeClass( ClassDataWithSource(classData, sourceElement)
kotlinClass.classId, )
ClassDataWithSource(classData, sourceElement))
}
return null
} }
fun createKotlinPackagePartScope(descriptor: PackageFragmentDescriptor, kotlinClass: KotlinJvmBinaryClass): MemberScope? { private fun createKotlinPackagePartScope(descriptor: PackageFragmentDescriptor, kotlinClass: KotlinJvmBinaryClass): MemberScope? {
val data = readData(kotlinClass, KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART) val data = readData(kotlinClass, KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART) ?: return null
if (data != null) { val strings = kotlinClass.classHeader.strings.sure { "String table not found in $kotlinClass" }
val strings = kotlinClass.classHeader.strings val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(data, strings)
assert(strings != null) { "String table not found in " + kotlinClass } val source = JvmPackagePartSource(kotlinClass.classId)
val packageData = JvmProtoBufUtil.readPackageDataFrom(data, strings) return DeserializedPackageMemberScope(descriptor, packageProto, nameResolver, source, components) {
val source = JvmPackagePartSource(kotlinClass.classId) // All classes are included into Java scope
return DeserializedPackageMemberScope( emptyList()
descriptor, packageData.packageProto, packageData.nameResolver, source, components
) {
// All classes are included into Java scope
emptyList()
}
} }
return null
} }
fun createKotlinPackageScope( fun createKotlinPackageScope(
descriptor: PackageFragmentDescriptor, descriptor: PackageFragmentDescriptor,
packageParts: List<KotlinJvmBinaryClass>): MemberScope { packageParts: List<KotlinJvmBinaryClass>
val list = ArrayList<MemberScope>(packageParts.size) ): MemberScope {
for (callable in packageParts) { val scopes = packageParts.mapNotNull { callable ->
val scope = createKotlinPackagePartScope(descriptor, callable) createKotlinPackagePartScope(descriptor, callable)
if (scope != null) {
list.add(scope)
}
} }
if (list.isEmpty()) { if (scopes.isEmpty()) {
return MemberScope.Empty return MemberScope.Empty
} }
return ChainedMemberScope("Member scope for union of package parts data", list) return ChainedMemberScope("Member scope for union of package parts data", scopes)
} }
fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? { internal fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
val header = kotlinClass.classHeader val header = kotlinClass.classHeader
if (!header.metadataVersion.isCompatible()) { if (!header.metadataVersion.isCompatible()) {
errorReporter.reportIncompatibleMetadataVersion(kotlinClass.classId, kotlinClass.location, header.metadataVersion) errorReporter.reportIncompatibleMetadataVersion(kotlinClass.classId, kotlinClass.location, header.metadataVersion)
@@ -99,8 +86,9 @@ class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) {
} }
companion object { companion object {
internal val KOTLIN_CLASS = setOf(KotlinClassHeader.Kind.CLASS)
val KOTLIN_CLASS: Set<KotlinClassHeader.Kind> = setOf<Kind>(CLASS) private val KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART =
val KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART: Set<KotlinClassHeader.Kind> = setOf<Kind>(FILE_FACADE, MULTIFILE_CLASS_PART) setOf(KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART)
} }
} }