J2K DeserializedDescriptorResolver: prettify
This commit is contained in:
+30
-42
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user