J2K DeserializedDescriptorResolver: convert

This commit is contained in:
Alexander Udalov
2016-01-19 18:06:36 +03:00
parent 432d458c02
commit 3efa51af40
@@ -14,114 +14,93 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.load.kotlin; package org.jetbrains.kotlin.load.kotlin
import kotlin.jvm.functions.Function0; import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.Kind.*
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.serialization.ClassDataWithSource
import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope; import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.serialization.ClassData; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.ClassDataWithSource; import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import org.jetbrains.kotlin.serialization.PackageData; import java.util.*
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents; import javax.inject.Inject
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter;
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil;
import javax.inject.Inject; class DeserializedDescriptorResolver(private val errorReporter: ErrorReporter) {
import java.util.*; private var components: DeserializationComponents? = null
import static kotlin.collections.SetsKt.setOf;
import static org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader.Kind.*;
public final class DeserializedDescriptorResolver {
private final ErrorReporter errorReporter;
private DeserializationComponents components;
public static final Set<KotlinClassHeader.Kind> KOTLIN_CLASS = setOf(CLASS);
public static final Set<KotlinClassHeader.Kind> KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART = setOf(FILE_FACADE, MULTIFILE_CLASS_PART);
public DeserializedDescriptorResolver(@NotNull ErrorReporter errorReporter) {
this.errorReporter = errorReporter;
}
// component dependency cycle // component dependency cycle
@Inject @Inject
public void setComponents(@NotNull DeserializationComponentsForJava context) { fun setComponents(context: DeserializationComponentsForJava) {
this.components = context.getComponents(); this.components = context.components
} }
@Nullable fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? {
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) { val data = readData(kotlinClass, KOTLIN_CLASS)
String[] data = readData(kotlinClass, KOTLIN_CLASS);
if (data != null) { if (data != null) {
String[] strings = kotlinClass.getClassHeader().getStrings(); val strings = kotlinClass.classHeader.strings
assert strings != null : "String table not found in " + kotlinClass; assert(strings != null) { "String table not found in " + kotlinClass }
ClassData classData = JvmProtoBufUtil.readClassDataFrom(data, strings); val classData = JvmProtoBufUtil.readClassDataFrom(data, strings)
KotlinJvmBinarySourceElement sourceElement = new KotlinJvmBinarySourceElement(kotlinClass); val sourceElement = KotlinJvmBinarySourceElement(kotlinClass)
return components.getClassDeserializer().deserializeClass( return components!!.classDeserializer.deserializeClass(
kotlinClass.getClassId(), kotlinClass.classId,
new ClassDataWithSource(classData, sourceElement) ClassDataWithSource(classData, sourceElement))
);
} }
return null; return null
} }
@Nullable fun createKotlinPackagePartScope(descriptor: PackageFragmentDescriptor, kotlinClass: KotlinJvmBinaryClass): MemberScope? {
public MemberScope createKotlinPackagePartScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) { val data = readData(kotlinClass, KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART)
String[] data = readData(kotlinClass, KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART);
if (data != null) { if (data != null) {
String[] strings = kotlinClass.getClassHeader().getStrings(); val strings = kotlinClass.classHeader.strings
assert strings != null : "String table not found in " + kotlinClass; assert(strings != null) { "String table not found in " + kotlinClass }
PackageData packageData = JvmProtoBufUtil.readPackageDataFrom(data, strings); val packageData = JvmProtoBufUtil.readPackageDataFrom(data, strings)
JvmPackagePartSource source = new JvmPackagePartSource(kotlinClass.getClassId()); val source = JvmPackagePartSource(kotlinClass.classId)
return new DeserializedPackageMemberScope( return DeserializedPackageMemberScope(
descriptor, packageData.getPackageProto(), packageData.getNameResolver(), source, components, descriptor, packageData.packageProto, packageData.nameResolver, source, components
new Function0<Collection<Name>>() { ) {
@Override // All classes are included into Java scope
public Collection<Name> invoke() { emptyList()
// All classes are included into Java scope }
return Collections.emptyList();
}
}
);
} }
return null; return null
} }
@NotNull fun createKotlinPackageScope(
public MemberScope createKotlinPackageScope( descriptor: PackageFragmentDescriptor,
@NotNull PackageFragmentDescriptor descriptor, packageParts: List<KotlinJvmBinaryClass>): MemberScope {
@NotNull List<KotlinJvmBinaryClass> packageParts val list = ArrayList<MemberScope>(packageParts.size)
) { for (callable in packageParts) {
List<MemberScope> list = new ArrayList<MemberScope>(packageParts.size()); val scope = createKotlinPackagePartScope(descriptor, callable)
for (KotlinJvmBinaryClass callable : packageParts) {
MemberScope scope = createKotlinPackagePartScope(descriptor, callable);
if (scope != null) { if (scope != null) {
list.add(scope); list.add(scope)
} }
} }
if (list.isEmpty()) { if (list.isEmpty()) {
return MemberScope.Empty.INSTANCE; return MemberScope.Empty
} }
return new ChainedMemberScope("Member scope for union of package parts data", list); return ChainedMemberScope("Member scope for union of package parts data", list)
} }
@Nullable fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull Set<KotlinClassHeader.Kind> expectedKinds) { val header = kotlinClass.classHeader
KotlinClassHeader header = kotlinClass.getClassHeader(); if (!header.metadataVersion.isCompatible()) {
if (!header.getMetadataVersion().isCompatible()) { errorReporter.reportIncompatibleMetadataVersion(kotlinClass.classId, kotlinClass.location, header.metadataVersion)
errorReporter.reportIncompatibleMetadataVersion(kotlinClass.getClassId(), kotlinClass.getLocation(), header.getMetadataVersion());
} }
else if (expectedKinds.contains(header.getKind())) { else if (expectedKinds.contains(header.kind)) {
return header.getData(); return header.data
} }
return null; return null
}
companion object {
val KOTLIN_CLASS: Set<KotlinClassHeader.Kind> = setOf<Kind>(CLASS)
val KOTLIN_FILE_FACADE_OR_MULTIFILE_CLASS_PART: Set<KotlinClassHeader.Kind> = setOf<Kind>(FILE_FACADE, MULTIFILE_CLASS_PART)
} }
} }