Removed DescriptorFinder.findPackage.

This commit is contained in:
Evgeny Gerashchenko
2013-11-26 22:07:11 +04:00
parent 557aaf363a
commit 1bbe9b0bd4
8 changed files with 59 additions and 81 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.storage.StorageManager;
@@ -31,7 +32,8 @@ public abstract class AbstractDescriptorFinder implements DescriptorFinder {
public AbstractDescriptorFinder(
@NotNull final StorageManager storageManager,
@NotNull AnnotationDeserializer annotationDeserializer
@NotNull AnnotationDeserializer annotationDeserializer,
@NotNull final PackageFragmentProvider packageFragmentProvider
) {
this.annotationDeserializer = annotationDeserializer;
@@ -45,8 +47,8 @@ public abstract class AbstractDescriptorFinder implements DescriptorFinder {
AbstractDescriptorFinder _this = AbstractDescriptorFinder.this;
ClassDescriptor classDescriptor =
new DeserializedClassDescriptor(storageManager, _this.annotationDeserializer, _this, classData.getNameResolver(),
classData.getClassProto());
new DeserializedClassDescriptor(storageManager, _this.annotationDeserializer, _this, packageFragmentProvider,
classData.getNameResolver(), classData.getClassProto());
classDescriptorCreated(classDescriptor);
return classDescriptor;
}
@@ -19,7 +19,6 @@ package org.jetbrains.jet.descriptors.serialization;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -34,13 +33,6 @@ public interface DescriptorFinder {
return null;
}
// TODO 1 remove it, make owner not lazy
@Nullable
@Override
public PackageFragmentDescriptor findPackage(@NotNull FqName name) {
return null;
}
@NotNull
@Override
public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -51,9 +43,6 @@ public interface DescriptorFinder {
@Nullable
ClassDescriptor findClass(@NotNull ClassId classId);
@Nullable
PackageFragmentDescriptor findPackage(@NotNull FqName name);
@NotNull
Collection<Name> getClassNames(@NotNull FqName packageName);
}
@@ -72,11 +72,13 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
private final ClassKind kind;
private final boolean isInner;
private final DescriptorFinder descriptorFinder;
private final PackageFragmentProvider packageFragmentProvider;
public DeserializedClassDescriptor(
@NotNull StorageManager storageManager,
@NotNull AnnotationDeserializer annotationResolver,
@NotNull DescriptorFinder descriptorFinder,
@NotNull PackageFragmentProvider packageFragmentProvider,
@NotNull NameResolver nameResolver,
@NotNull ProtoBuf.Class classProto
) {
@@ -84,6 +86,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
this.classProto = classProto;
this.classId = nameResolver.getClassId(classProto.getFqName());
this.storageManager = storageManager;
this.packageFragmentProvider = packageFragmentProvider;
this.descriptorFinder = descriptorFinder;
TypeDeserializer notNullTypeDeserializer = new TypeDeserializer(storageManager, null, nameResolver,
@@ -143,10 +146,15 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@NotNull
private DeclarationDescriptor computeContainingDeclaration() {
ClassOrNamespaceDescriptor result = classId.isTopLevelClass() ?
descriptorFinder.findPackage(classId.getPackageFqName()) :
descriptorFinder.findClass(classId.getOuterClassId());
return result != null ? result : ErrorUtils.getErrorModule();
if (classId.isTopLevelClass()) {
List<PackageFragmentDescriptor> fragments = packageFragmentProvider.getPackageFragments(classId.getPackageFqName());
assert fragments.size() == 1 : "there should be exactly one package: " + fragments;
return fragments.iterator().next();
}
else {
ClassOrNamespaceDescriptor result = descriptorFinder.findClass(classId.getOuterClassId());
return result != null ? result : ErrorUtils.getErrorModule();
}
}
@NotNull
@@ -245,8 +253,8 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
throw new IllegalStateException("Object should have a serialized class object: " + classId);
}
return new DeserializedClassDescriptor(storageManager, annotationDeserializer, descriptorFinder, deserializer.getNameResolver(),
classObjectProto.getData());
return new DeserializedClassDescriptor(storageManager, annotationDeserializer, descriptorFinder, packageFragmentProvider,
deserializer.getNameResolver(), classObjectProto.getData());
}
return descriptorFinder.findClass(classId.createNestedClassId(getClassObjectName(getName())));
@@ -26,7 +26,6 @@ import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
@@ -94,7 +93,8 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
MutablePackageFragmentDescriptor packageFragment = JetTestUtils.createTestPackageFragment(TEST_PACKAGE_NAME, "<fake>");
DescriptorFinder descriptorFinder = new DescriptorFinderFromClassDataOrJava(javaDescriptorResolver, packageFragment, classDataMap);
DescriptorFinder descriptorFinder = new DescriptorFinderFromClassDataOrJava(
javaDescriptorResolver, classDataMap, packageFragment.getContainingDeclaration().getPackageFragmentProvider());
for (ClassDescriptor classDescriptor : classesAndObjects) {
ClassId classId = getClassId(classDescriptor);
@@ -161,17 +161,15 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
private static class DescriptorFinderFromClassDataOrJava extends AbstractDescriptorFinder {
private final JavaDescriptorResolver javaDescriptorResolver;
private final PackageFragmentDescriptor packageForClasses;
private final Map<String, ClassData> classDataMap;
public DescriptorFinderFromClassDataOrJava(
@NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull PackageFragmentDescriptor packageForClasses,
@NotNull Map<String, ClassData> classDataMap
@NotNull Map<String, ClassData> classDataMap,
@NotNull PackageFragmentProvider packageFragmentProvider
) {
super(new LockBasedStorageManager(), UNSUPPORTED);
super(new LockBasedStorageManager(), UNSUPPORTED, packageFragmentProvider);
this.javaDescriptorResolver = javaDescriptorResolver;
this.packageForClasses = packageForClasses;
this.classDataMap = classDataMap;
}
@@ -188,13 +186,6 @@ public abstract class AbstractDescriptorSerializationTest extends KotlinTestWith
return classDataMap.get(classId.asSingleFqName().asString());
}
@Nullable
@Override
public PackageFragmentDescriptor findPackage(@NotNull FqName name) {
assert DescriptorUtils.getFQName(packageForClasses).equals(name.toUnsafe()) : name + " : " + packageForClasses;
return packageForClasses;
}
@NotNull
@Override
public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -79,13 +79,8 @@ public class BuiltinsDeserializationTest extends KotlinTestWithEnvironment {
final NameResolver nameResolver = NameSerializationUtil.createNameResolver(serializer.getNameTable());
DescriptorFinder finder = new AbstractDescriptorFinder(new LockBasedStorageManager(), AnnotationDeserializer.UNSUPPORTED) {
@NotNull
@Override
public PackageFragmentDescriptor findPackage(@NotNull FqName fqName) {
assert fqName.equals(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) : "Unsupported package: " + fqName;
return actualPackage;
}
DescriptorFinder finder = new AbstractDescriptorFinder(new LockBasedStorageManager(), AnnotationDeserializer.UNSUPPORTED,
actualPackage.getContainingDeclaration().getPackageFragmentProvider()) {
@NotNull
@Override
@@ -61,12 +61,6 @@ public final class DeserializedDescriptorResolver {
return javaClassResolver.resolveClass(kotlinFqNameToJavaFqName(classId.asSingleFqName()), INCLUDE_KOTLIN_SOURCES);
}
@Nullable
@Override
public PackageFragmentDescriptor findPackage(@NotNull FqName name) {
return javaPackageFragmentProvider.getOrCreatePackage(name);
}
@NotNull
@Override
public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -100,7 +94,7 @@ public final class DeserializedDescriptorResolver {
if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
return new DeserializedClassDescriptor(storageManager, annotationDeserializer, javaDescriptorFinder,
classData.getNameResolver(), classData.getClassProto());
javaPackageFragmentProvider, classData.getNameResolver(), classData.getClassProto());
}
return null;
}
@@ -8,6 +8,7 @@ import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPacka
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -29,12 +30,15 @@ class BuiltinsPackageFragment extends DeclarationDescriptorImpl implements Packa
private final DeserializedPackageMemberScope members;
private final NameResolver nameResolver;
private final ModuleDescriptor module;
final PackageFragmentProvider packageFragmentProvider;
public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) {
super(Collections.<AnnotationDescriptor>emptyList(), KotlinBuiltIns.BUILT_INS_PACKAGE_NAME);
this.module = module;
nameResolver = NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(this)));
packageFragmentProvider = new BuiltinsPackageFragmentProvider();
members = new DeserializedPackageMemberScope(storageManager, this, UNSUPPORTED, new BuiltInsDescriptorFinder(storageManager),
loadPackage(), nameResolver);
}
@@ -94,11 +98,36 @@ class BuiltinsPackageFragment extends DeclarationDescriptorImpl implements Packa
return KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path);
}
private class BuiltinsPackageFragmentProvider implements PackageFragmentProvider {
private final PackageFragmentDescriptor rootPackage = new MutablePackageFragmentDescriptor(module, FqName.ROOT);
@NotNull
@Override
public List<PackageFragmentDescriptor> getPackageFragments(@NotNull FqName fqName) {
if (fqName.isRoot()) {
return Collections.singletonList(rootPackage);
}
else if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.equals(fqName)) {
return Collections.<PackageFragmentDescriptor>singletonList(BuiltinsPackageFragment.this);
}
return Collections.emptyList();
}
@NotNull
@Override
public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) {
if (fqName.isRoot()) {
return Collections.singleton(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME);
}
return Collections.emptyList();
}
}
private class BuiltInsDescriptorFinder extends AbstractDescriptorFinder {
private final NotNullLazyValue<Collection<Name>> classNames;
public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) {
super(storageManager, UNSUPPORTED);
super(storageManager, UNSUPPORTED, packageFragmentProvider);
classNames = storageManager.createLazyValue(new Function0<Collection<Name>>() {
@Override
@@ -153,12 +182,6 @@ class BuiltinsPackageFragment extends DeclarationDescriptorImpl implements Packa
}
}
@Nullable
@Override
public PackageFragmentDescriptor findPackage(@NotNull FqName fqName) {
return fqName.equals(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) ? BuiltinsPackageFragment.this : null;
}
@NotNull
@Override
public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -23,7 +23,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
@@ -157,31 +156,8 @@ public class KotlinBuiltIns {
}
private static void loadBuiltIns(@NotNull ModuleDescriptorImpl module) throws IOException {
final PackageFragmentDescriptor rootPackage = new MutablePackageFragmentDescriptor(module, FqName.ROOT);
final PackageFragmentDescriptor builtinsPackage = new BuiltinsPackageFragment(new LockBasedStorageManager(), module);
module.addFragmentProvider(new PackageFragmentProvider() {
@NotNull
@Override
public List<PackageFragmentDescriptor> getPackageFragments(@NotNull FqName fqName) {
if (fqName.isRoot()) {
return Collections.singletonList(rootPackage);
}
else if (BUILT_INS_PACKAGE_FQ_NAME.equals(fqName)) {
return Collections.singletonList(builtinsPackage);
}
return Collections.emptyList();
}
@NotNull
@Override
public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) {
if (fqName.isRoot()) {
return Collections.singleton(BUILT_INS_PACKAGE_FQ_NAME);
}
return Collections.emptyList();
}
});
BuiltinsPackageFragment builtinsPackageFragment = new BuiltinsPackageFragment(new LockBasedStorageManager(), module);
module.addFragmentProvider(builtinsPackageFragment.packageFragmentProvider);
}
private void doInitialize() {