Refactor: DescriptorFinder -> ClassDataFinder
Deserialization subsystem only need to know about the way to obtain class data, it can construct descriptors itself (no need to call DeserializedClassDescriptor constructor from other modules)
This commit is contained in:
+1
-1
@@ -98,7 +98,7 @@ public class LazyJavaPackageFragmentProvider(
|
||||
|
||||
override fun getSubPackagesOf(fqName: FqName) = getPackageFragment(fqName)?.getMemberScope()?.getSubPackages().orEmpty()
|
||||
|
||||
fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClassCached(kotlinClass)
|
||||
fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClass(kotlinClass)
|
||||
|
||||
fun getClass(javaClass: JavaClass): ClassDescriptor? = c.javaClassResolver.resolveClass(javaClass)
|
||||
|
||||
|
||||
+2
-2
@@ -25,9 +25,9 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
|
||||
public class DeserializationGlobalContextForJava(
|
||||
storageManager: StorageManager,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
descriptorFinder: JavaDescriptorFinder,
|
||||
classDataFinder: JavaClassDataFinder,
|
||||
annotationLoader: AnnotationDescriptorLoader,
|
||||
constantLoader: ConstantDescriptorLoader,
|
||||
packageFragmentProvider: LazyJavaPackageFragmentProvider
|
||||
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
|
||||
) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
|
||||
constantLoader, packageFragmentProvider)
|
||||
+1
-11
@@ -22,7 +22,6 @@ import org.jetbrains.jet.descriptors.serialization.ClassData;
|
||||
import org.jetbrains.jet.descriptors.serialization.ClassId;
|
||||
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
|
||||
import org.jetbrains.jet.descriptors.serialization.NameResolver;
|
||||
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
|
||||
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
|
||||
@@ -52,15 +51,6 @@ public final class DeserializedDescriptorResolver {
|
||||
|
||||
@Nullable
|
||||
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||
String[] data = readData(kotlinClass, CLASS);
|
||||
if (data != null) {
|
||||
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
|
||||
return new DeserializedClassDescriptor(context, classData);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Nullable
|
||||
public ClassDescriptor resolveClassCached(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||
String[] data = readData(kotlinClass, CLASS);
|
||||
if (data != null) {
|
||||
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
|
||||
@@ -81,7 +71,7 @@ public final class DeserializedDescriptorResolver {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
|
||||
public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
|
||||
KotlinClassHeader header = kotlinClass.getClassHeader();
|
||||
if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) {
|
||||
errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion());
|
||||
|
||||
+12
-5
@@ -17,7 +17,7 @@
|
||||
package org.jetbrains.jet.lang.resolve.kotlin
|
||||
|
||||
import org.jetbrains.jet.descriptors.serialization.ClassId
|
||||
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
|
||||
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
@@ -26,17 +26,24 @@ import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqN
|
||||
import java.util.Collections
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider
|
||||
import org.jetbrains.jet.descriptors.serialization.ClassData
|
||||
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
|
||||
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader
|
||||
|
||||
public class JavaDescriptorFinder(
|
||||
//TODO: correct dependencies
|
||||
public class JavaClassDataFinder(
|
||||
private val javaDescriptorResolver: JavaDescriptorResolver,
|
||||
private val javaPackageFragmentProvider: JavaPackageFragmentProvider
|
||||
) : DescriptorFinder {
|
||||
) : ClassDataFinder {
|
||||
|
||||
override fun findClass(classId: ClassId): ClassDescriptor? {
|
||||
override fun findClassData(classId: ClassId): ClassData? {
|
||||
val lazyJavaPackageFragmentProvider = javaDescriptorResolver.getPackageFragmentProvider() as LazyJavaPackageFragmentProvider
|
||||
val c = lazyJavaPackageFragmentProvider.c
|
||||
val kotlinJvmBinaryClass = c.kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(classId.asSingleFqName())) ?: return null
|
||||
return c.deserializedDescriptorResolver.resolveClass(kotlinJvmBinaryClass)
|
||||
val deserializedDescriptorResolver = c.deserializedDescriptorResolver
|
||||
val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, KotlinClassHeader.Kind.CLASS) ?: return null
|
||||
return JavaProtoBufUtil.readClassDataFrom(data)
|
||||
}
|
||||
|
||||
override fun getClassNames(packageName: FqName): Collection<Name> {
|
||||
+8
-15
@@ -41,7 +41,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
||||
private final DeserializedPackageMemberScope members;
|
||||
private final NameResolver nameResolver;
|
||||
private final PackageFragmentProvider packageFragmentProvider;
|
||||
private final DeserializationContext deserializationContext;
|
||||
|
||||
public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) {
|
||||
super(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME);
|
||||
@@ -49,12 +48,12 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
||||
|
||||
packageFragmentProvider = new BuiltinsPackageFragmentProvider();
|
||||
|
||||
BuiltInsDescriptorFinder descriptorFinder = new BuiltInsDescriptorFinder(storageManager);
|
||||
deserializationContext = new DeserializationContext(
|
||||
storageManager, module, descriptorFinder,
|
||||
BuiltInsClassDataFinder builtInsClassDataFinder = new BuiltInsClassDataFinder(storageManager);
|
||||
DeserializationContext deserializationContext = new DeserializationContext(
|
||||
storageManager, module, builtInsClassDataFinder,
|
||||
// TODO: support annotations
|
||||
AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider,
|
||||
new ClassDeserializer(storageManager, descriptorFinder), nameResolver
|
||||
new ClassDeserializer(storageManager, builtInsClassDataFinder), nameResolver
|
||||
);
|
||||
members = new DeserializedPackageMemberScope(this, loadPackage(), deserializationContext);
|
||||
}
|
||||
@@ -116,10 +115,10 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
||||
}
|
||||
}
|
||||
|
||||
private class BuiltInsDescriptorFinder implements DescriptorFinder {
|
||||
private class BuiltInsClassDataFinder implements ClassDataFinder {
|
||||
private final NotNullLazyValue<Collection<Name>> classNames;
|
||||
|
||||
public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) {
|
||||
public BuiltInsClassDataFinder(@NotNull StorageManager storageManager) {
|
||||
// TODO: support annotations
|
||||
classNames = storageManager.createLazyValue(new Function0<Collection<Name>>() {
|
||||
@Override
|
||||
@@ -149,7 +148,8 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private ClassData getClassData(@NotNull ClassId classId) {
|
||||
@Override
|
||||
public ClassData findClassData(@NotNull ClassId classId) {
|
||||
InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
|
||||
if (stream == null) {
|
||||
return null;
|
||||
@@ -173,13 +173,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ClassDescriptor findClass(@NotNull ClassId classId) {
|
||||
ClassData classData = getClassData(classId);
|
||||
return classData == null ? null : new DeserializedClassDescriptor(deserializationContext, classData);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<Name> getClassNames(@NotNull FqName packageName) {
|
||||
|
||||
+2
-2
@@ -26,9 +26,9 @@ import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
public interface DescriptorFinder {
|
||||
public interface ClassDataFinder {
|
||||
@Nullable
|
||||
ClassDescriptor findClass(@NotNull ClassId classId);
|
||||
ClassData findClassData(@NotNull ClassId classId);
|
||||
|
||||
@ReadOnly
|
||||
@NotNull
|
||||
+13
-2
@@ -18,12 +18,23 @@ package org.jetbrains.jet.descriptors.serialization
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.storage.StorageManager
|
||||
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
public class ClassDeserializer(val storageManager: StorageManager, val descriptorFinder: DescriptorFinder) {
|
||||
public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
|
||||
private val classes = storageManager.createMemoizedFunctionWithNullableValues {
|
||||
(classId: ClassId) ->
|
||||
descriptorFinder.findClass(classId)
|
||||
val classData = classDataFinder.findClassData(classId)
|
||||
if (classData != null) {
|
||||
DeserializedClassDescriptor(context, classData)
|
||||
}
|
||||
else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
var context: DeserializationGlobalContext by Delegates.notNull()
|
||||
|
||||
public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId)
|
||||
}
|
||||
+13
-9
@@ -19,7 +19,7 @@ package org.jetbrains.jet.descriptors.serialization.context
|
||||
import org.jetbrains.jet.storage.StorageManager
|
||||
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader
|
||||
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider
|
||||
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
|
||||
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
|
||||
import org.jetbrains.jet.descriptors.serialization.NameResolver
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.descriptors.serialization.TypeDeserializer
|
||||
@@ -36,14 +36,18 @@ import org.jetbrains.jet.descriptors.serialization.ClassDeserializer
|
||||
public open class DeserializationGlobalContext(
|
||||
public val storageManager: StorageManager,
|
||||
public val moduleDescriptor: ModuleDescriptor,
|
||||
public val descriptorFinder: DescriptorFinder,
|
||||
public val classDataFinder: ClassDataFinder,
|
||||
public val annotationLoader: AnnotationLoader,
|
||||
public val constantLoader: ConstantLoader,
|
||||
public val packageFragmentProvider: PackageFragmentProvider,
|
||||
public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, descriptorFinder)
|
||||
public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, classDataFinder)
|
||||
) {
|
||||
{
|
||||
classDeserializer.context = this
|
||||
}
|
||||
|
||||
public fun withNameResolver(nameResolver: NameResolver): DeserializationContext {
|
||||
return DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
|
||||
return DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
|
||||
constantLoader, packageFragmentProvider, classDeserializer, nameResolver)
|
||||
}
|
||||
}
|
||||
@@ -52,13 +56,13 @@ public open class DeserializationGlobalContext(
|
||||
public open class DeserializationContext(
|
||||
storageManager: StorageManager,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
descriptorFinder: DescriptorFinder,
|
||||
classDataFinder: ClassDataFinder,
|
||||
annotationLoader: AnnotationLoader,
|
||||
constantLoader: ConstantLoader,
|
||||
packageFragmentProvider: PackageFragmentProvider,
|
||||
classDeserializer: ClassDeserializer,
|
||||
public val nameResolver: NameResolver
|
||||
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
|
||||
) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
|
||||
constantLoader, packageFragmentProvider, classDeserializer) {
|
||||
fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes {
|
||||
val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}",
|
||||
@@ -67,7 +71,7 @@ public open class DeserializationContext(
|
||||
}
|
||||
|
||||
fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes {
|
||||
return DeserializationContextWithTypes(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
|
||||
return DeserializationContextWithTypes(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
|
||||
constantLoader, packageFragmentProvider, classDeserializer,
|
||||
nameResolver, containingDeclaration, typeDeserializer)
|
||||
}
|
||||
@@ -78,7 +82,7 @@ public open class DeserializationContext(
|
||||
class DeserializationContextWithTypes(
|
||||
storageManager: StorageManager,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
descriptorFinder: DescriptorFinder,
|
||||
classDataFinder: ClassDataFinder,
|
||||
annotationLoader: AnnotationLoader,
|
||||
constantLoader: ConstantLoader,
|
||||
packageFragmentProvider: PackageFragmentProvider,
|
||||
@@ -86,7 +90,7 @@ class DeserializationContextWithTypes(
|
||||
nameResolver: NameResolver,
|
||||
val containingDeclaration: DeclarationDescriptor,
|
||||
val typeDeserializer: TypeDeserializer
|
||||
) : DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
|
||||
) : DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
|
||||
constantLoader, packageFragmentProvider, classDeserializer, nameResolver) {
|
||||
val deserializer: MemberDeserializer = MemberDeserializer(this)
|
||||
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
|
||||
|
||||
@Override
|
||||
protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
|
||||
for (Name className : context.getDescriptorFinder().getClassNames(packageFqName)) {
|
||||
for (Name className : context.getClassDataFinder().getClassNames(packageFqName)) {
|
||||
ClassDescriptor classDescriptor = getClassDescriptor(className);
|
||||
|
||||
if (classDescriptor != null) {
|
||||
|
||||
Reference in New Issue
Block a user