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.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<ClassId, ClassDescriptor> findClass;
private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> 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<ClassId, ClassDescriptor>() {
@NotNull
this.findClass = new MemoizedFunctionToNullableImpl<ClassId, ClassDescriptor>() {
@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;
}
}
}
@@ -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