Allow names to be loaded individually for each class
This commit is contained in:
committed by
Alexander Udalov
parent
bcab329195
commit
df57ce5a7f
+33
-12
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user