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