Allow names to be loaded individually for each class

This commit is contained in:
Andrey Breslav
2013-05-31 21:55:00 +04:00
committed by Alexander Udalov
parent bcab329195
commit df57ce5a7f
2 changed files with 37 additions and 16 deletions
@@ -22,20 +22,18 @@ import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeseria
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull; import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNullImpl; import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullableImpl;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
public abstract class AbstractClassResolver implements ClassResolver { public abstract class AbstractClassResolver implements ClassResolver {
private final NameResolver nameResolver;
private final NestedClassResolver nestedClassResolver; private final NestedClassResolver nestedClassResolver;
private final MemoizedFunctionToNotNull<ClassId, ClassDescriptor> findClass; private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass;
private final AnnotationDeserializer annotationDeserializer; private final AnnotationDeserializer annotationDeserializer;
public AbstractClassResolver(@NotNull NameResolver nameResolver, @NotNull AnnotationDeserializer annotationDeserializer) { public AbstractClassResolver(@NotNull AnnotationDeserializer annotationDeserializer) {
this.nameResolver = nameResolver;
this.annotationDeserializer = annotationDeserializer; this.annotationDeserializer = annotationDeserializer;
this.nestedClassResolver = new NestedClassResolver() { this.nestedClassResolver = new NestedClassResolver() {
@@ -52,12 +50,15 @@ public abstract class AbstractClassResolver implements ClassResolver {
} }
}; };
this.findClass = new MemoizedFunctionToNotNullImpl<ClassId, ClassDescriptor>() { this.findClass = new MemoizedFunctionToNullableImpl<ClassId, ClassDescriptor>() {
@NotNull
@Override @Override
protected ClassDescriptor doCompute(ClassId classId) { protected ClassDescriptor doCompute(ClassId classId) {
ProtoBuf.Class classProto = getClassProto(classId); ClassData classData = getClassData(classId);
assert classProto != null : "No class found: " + classId; if (classData == null) {
return null;
}
ProtoBuf.Class classProto = classData.getClassProto();
DeclarationDescriptor owner = DeclarationDescriptor owner =
classId.isTopLevelClass() ? getPackage(classId.getPackageFqName()) : findClass(classId.getOuterClassId()); classId.isTopLevelClass() ? getPackage(classId.getPackageFqName()) : findClass(classId.getOuterClassId());
@@ -65,7 +66,7 @@ public abstract class AbstractClassResolver implements ClassResolver {
AbstractClassResolver outer = AbstractClassResolver.this; AbstractClassResolver outer = AbstractClassResolver.this;
ClassDescriptor classDescriptor = new DeserializedClassDescriptor( ClassDescriptor classDescriptor = new DeserializedClassDescriptor(
owner, outer.nameResolver, outer.annotationDeserializer, outer, nestedClassResolver, classProto, null owner, classData.getNameResolver(), outer.annotationDeserializer, outer, nestedClassResolver, classProto, null
); );
classDescriptorCreated(classDescriptor); classDescriptorCreated(classDescriptor);
return classDescriptor; return classDescriptor;
@@ -80,7 +81,7 @@ public abstract class AbstractClassResolver implements ClassResolver {
} }
@Nullable @Nullable
protected abstract ProtoBuf.Class getClassProto(@NotNull ClassId classId); protected abstract ClassData getClassData(@NotNull ClassId classId);
@NotNull @NotNull
protected abstract DeclarationDescriptor getPackage(@NotNull FqName fqName); 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 Name getClassObjectName(@NotNull ClassDescriptor outerClass);
protected abstract void classDescriptorCreated(@NotNull ClassDescriptor classDescriptor); 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;
}
}
} }
@@ -83,9 +83,9 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
final NamespaceDescriptorImpl actualNamespace = createTestNamespace(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.shortName().asString()); 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 @NotNull
@Override @Override
@@ -108,8 +108,8 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
@Nullable @Nullable
@Override @Override
protected ProtoBuf.Class getClassProto(@NotNull ClassId classId) { protected ClassData getClassData(@NotNull ClassId classId) {
return classProtos.get(classId); return new ClassData(nameResolver, classProtos.get(classId));
} }
@Override @Override