From df57ce5a7fe021df89fa6054049703afa82e32a7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 31 May 2013 21:55:00 +0400 Subject: [PATCH] Allow names to be loaded individually for each class --- .../serialization/AbstractClassResolver.java | 45 ++++++++++++++----- .../BuiltinsDeserializationTest.java | 8 ++-- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java index dea6cd941c6..ea384686722 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractClassResolver.java @@ -22,20 +22,18 @@ import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeseria import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull; -import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNullImpl; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullableImpl; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; public abstract class AbstractClassResolver implements ClassResolver { - private final NameResolver nameResolver; private final NestedClassResolver nestedClassResolver; - private final MemoizedFunctionToNotNull findClass; + private final MemoizedFunctionToNullable findClass; private final AnnotationDeserializer annotationDeserializer; - public AbstractClassResolver(@NotNull NameResolver nameResolver, @NotNull AnnotationDeserializer annotationDeserializer) { - this.nameResolver = nameResolver; + public AbstractClassResolver(@NotNull AnnotationDeserializer annotationDeserializer) { this.annotationDeserializer = annotationDeserializer; this.nestedClassResolver = new NestedClassResolver() { @@ -52,12 +50,15 @@ public abstract class AbstractClassResolver implements ClassResolver { } }; - this.findClass = new MemoizedFunctionToNotNullImpl() { - @NotNull + this.findClass = new MemoizedFunctionToNullableImpl() { @Override protected ClassDescriptor doCompute(ClassId classId) { - ProtoBuf.Class classProto = getClassProto(classId); - assert classProto != null : "No class found: " + classId; + ClassData classData = getClassData(classId); + if (classData == null) { + return null; + } + + ProtoBuf.Class classProto = classData.getClassProto(); DeclarationDescriptor owner = classId.isTopLevelClass() ? getPackage(classId.getPackageFqName()) : findClass(classId.getOuterClassId()); @@ -65,7 +66,7 @@ public abstract class AbstractClassResolver implements ClassResolver { AbstractClassResolver outer = AbstractClassResolver.this; ClassDescriptor classDescriptor = new DeserializedClassDescriptor( - owner, outer.nameResolver, outer.annotationDeserializer, outer, nestedClassResolver, classProto, null + owner, classData.getNameResolver(), outer.annotationDeserializer, outer, nestedClassResolver, classProto, null ); classDescriptorCreated(classDescriptor); return classDescriptor; @@ -80,7 +81,7 @@ public abstract class AbstractClassResolver implements ClassResolver { } @Nullable - protected abstract ProtoBuf.Class getClassProto(@NotNull ClassId classId); + protected abstract ClassData getClassData(@NotNull ClassId classId); @NotNull protected abstract DeclarationDescriptor getPackage(@NotNull FqName fqName); @@ -92,4 +93,24 @@ public abstract class AbstractClassResolver implements ClassResolver { protected abstract Name getClassObjectName(@NotNull ClassDescriptor outerClass); protected abstract void classDescriptorCreated(@NotNull ClassDescriptor classDescriptor); + + protected static class ClassData { + private final NameResolver nameResolver; + private final ProtoBuf.Class classProto; + + public ClassData(@NotNull NameResolver nameResolver, @NotNull ProtoBuf.Class classProto) { + this.nameResolver = nameResolver; + this.classProto = classProto; + } + + @NotNull + public NameResolver getNameResolver() { + return nameResolver; + } + + @NotNull + public ProtoBuf.Class getClassProto() { + return classProto; + } + } } diff --git a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java index 15948d71d14..cc5c29ec4a3 100644 --- a/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java +++ b/compiler/tests/org/jetbrains/jet/descriptors/serialization/BuiltinsDeserializationTest.java @@ -83,9 +83,9 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment { final NamespaceDescriptorImpl actualNamespace = createTestNamespace(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.shortName().asString()); - NameResolver nameResolver = NameSerializationUtil.createNameResolver(serializer.getNameTable()); + final NameResolver nameResolver = NameSerializationUtil.createNameResolver(serializer.getNameTable()); - ClassResolver classResolver = new AbstractClassResolver(nameResolver, AnnotationDeserializer.UNSUPPORTED) { + ClassResolver classResolver = new AbstractClassResolver(AnnotationDeserializer.UNSUPPORTED) { @NotNull @Override @@ -108,8 +108,8 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment { @Nullable @Override - protected ProtoBuf.Class getClassProto(@NotNull ClassId classId) { - return classProtos.get(classId); + protected ClassData getClassData(@NotNull ClassId classId) { + return new ClassData(nameResolver, classProtos.get(classId)); } @Override