Refactor: DescriptorFinder -> ClassDataFinder

Deserialization subsystem only need to know about the way to obtain class data, it can construct descriptors itself (no need to call DeserializedClassDescriptor constructor from other modules)
This commit is contained in:
Pavel V. Talanov
2014-06-16 15:00:57 +04:00
parent 53337f793b
commit 0c8956a36e
14 changed files with 77 additions and 82 deletions
@@ -34,7 +34,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext; import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava; import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder; import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -63,7 +63,7 @@ public class InjectorForJavaDescriptorResolver {
private final GlobalJavaResolverContext globalJavaResolverContext; private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final DeserializationGlobalContextForJava deserializationGlobalContextForJava; private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
private final JavaDescriptorFinder javaDescriptorFinder; private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader; private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage; private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader; private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -89,10 +89,10 @@ public class InjectorForJavaDescriptorResolver {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator); this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule()); this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader(); this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager); this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
this.javaClassFinder.setProject(project); this.javaClassFinder.setProject(project);
@@ -56,7 +56,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext; import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava; import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder; import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -107,7 +107,7 @@ public class InjectorForLazyResolveWithJava {
private final GlobalJavaResolverContext globalJavaResolverContext; private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final DeserializationGlobalContextForJava deserializationGlobalContextForJava; private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
private final JavaDescriptorFinder javaDescriptorFinder; private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader; private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage; private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader; private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -157,10 +157,10 @@ public class InjectorForLazyResolveWithJava {
this.jetImportsFactory = new JetImportsFactory(); this.jetImportsFactory = new JetImportsFactory();
this.scopeProvider = new ScopeProvider(getResolveSession()); this.scopeProvider = new ScopeProvider(getResolveSession());
this.scriptBodyResolver = new ScriptBodyResolver(); this.scriptBodyResolver = new ScriptBodyResolver();
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader(); this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager); this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
this.resolveSession.setAnnotationResolve(annotationResolver); this.resolveSession.setAnnotationResolve(annotationResolver);
@@ -66,7 +66,7 @@ import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext; import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder; import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -127,7 +127,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext; private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final JavaDescriptorFinder javaDescriptorFinder; private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader; private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage; private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader; private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -159,10 +159,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator); this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor()); this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor());
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader(); this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(storageManager, getModuleDescriptor(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(storageManager, getModuleDescriptor(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.bodyResolver = new BodyResolver(); this.bodyResolver = new BodyResolver();
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver(); this.callResolver = new CallResolver();
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptorImpl
import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
import org.jetbrains.jet.descriptors.serialization.ClassId import org.jetbrains.jet.descriptors.serialization.ClassId
@@ -98,7 +98,7 @@ public class LazyJavaPackageFragmentProvider(
override fun getSubPackagesOf(fqName: FqName) = getPackageFragment(fqName)?.getMemberScope()?.getSubPackages().orEmpty() override fun getSubPackagesOf(fqName: FqName) = getPackageFragment(fqName)?.getMemberScope()?.getSubPackages().orEmpty()
fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClassCached(kotlinClass) fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClass(kotlinClass)
fun getClass(javaClass: JavaClass): ClassDescriptor? = c.javaClassResolver.resolveClass(javaClass) fun getClass(javaClass: JavaClass): ClassDescriptor? = c.javaClassResolver.resolveClass(javaClass)
@@ -25,9 +25,9 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
public class DeserializationGlobalContextForJava( public class DeserializationGlobalContextForJava(
storageManager: StorageManager, storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
descriptorFinder: JavaDescriptorFinder, classDataFinder: JavaClassDataFinder,
annotationLoader: AnnotationDescriptorLoader, annotationLoader: AnnotationDescriptorLoader,
constantLoader: ConstantDescriptorLoader, constantLoader: ConstantDescriptorLoader,
packageFragmentProvider: LazyJavaPackageFragmentProvider packageFragmentProvider: LazyJavaPackageFragmentProvider
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, ) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider) constantLoader, packageFragmentProvider)
@@ -22,7 +22,6 @@ import org.jetbrains.jet.descriptors.serialization.ClassData;
import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.descriptors.serialization.ClassId;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
import org.jetbrains.jet.descriptors.serialization.NameResolver; import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
@@ -52,15 +51,6 @@ public final class DeserializedDescriptorResolver {
@Nullable @Nullable
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) { public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, CLASS);
if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
return new DeserializedClassDescriptor(context, classData);
}
return null;
}
@Nullable
public ClassDescriptor resolveClassCached(@NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, CLASS); String[] data = readData(kotlinClass, CLASS);
if (data != null) { if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data); ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
@@ -81,7 +71,7 @@ public final class DeserializedDescriptorResolver {
} }
@Nullable @Nullable
private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) { public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
KotlinClassHeader header = kotlinClass.getClassHeader(); KotlinClassHeader header = kotlinClass.getClassHeader();
if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) { if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) {
errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion()); errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion());
@@ -17,7 +17,7 @@
package org.jetbrains.jet.lang.resolve.kotlin package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.jet.descriptors.serialization.ClassId import org.jetbrains.jet.descriptors.serialization.ClassId
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
@@ -26,17 +26,24 @@ import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqN
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.jet.descriptors.serialization.ClassData
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader
public class JavaDescriptorFinder( //TODO: correct dependencies
public class JavaClassDataFinder(
private val javaDescriptorResolver: JavaDescriptorResolver, private val javaDescriptorResolver: JavaDescriptorResolver,
private val javaPackageFragmentProvider: JavaPackageFragmentProvider private val javaPackageFragmentProvider: JavaPackageFragmentProvider
) : DescriptorFinder { ) : ClassDataFinder {
override fun findClass(classId: ClassId): ClassDescriptor? { override fun findClassData(classId: ClassId): ClassData? {
val lazyJavaPackageFragmentProvider = javaDescriptorResolver.getPackageFragmentProvider() as LazyJavaPackageFragmentProvider val lazyJavaPackageFragmentProvider = javaDescriptorResolver.getPackageFragmentProvider() as LazyJavaPackageFragmentProvider
val c = lazyJavaPackageFragmentProvider.c val c = lazyJavaPackageFragmentProvider.c
val kotlinJvmBinaryClass = c.kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(classId.asSingleFqName())) ?: return null val kotlinJvmBinaryClass = c.kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(classId.asSingleFqName())) ?: return null
return c.deserializedDescriptorResolver.resolveClass(kotlinJvmBinaryClass) val deserializedDescriptorResolver = c.deserializedDescriptorResolver
val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, KotlinClassHeader.Kind.CLASS) ?: return null
return JavaProtoBufUtil.readClassDataFrom(data)
} }
override fun getClassNames(packageName: FqName): Collection<Name> { override fun getClassNames(packageName: FqName): Collection<Name> {
@@ -41,7 +41,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
private final DeserializedPackageMemberScope members; private final DeserializedPackageMemberScope members;
private final NameResolver nameResolver; private final NameResolver nameResolver;
private final PackageFragmentProvider packageFragmentProvider; private final PackageFragmentProvider packageFragmentProvider;
private final DeserializationContext deserializationContext;
public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) { public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) {
super(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME); super(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME);
@@ -49,12 +48,12 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
packageFragmentProvider = new BuiltinsPackageFragmentProvider(); packageFragmentProvider = new BuiltinsPackageFragmentProvider();
BuiltInsDescriptorFinder descriptorFinder = new BuiltInsDescriptorFinder(storageManager); BuiltInsClassDataFinder builtInsClassDataFinder = new BuiltInsClassDataFinder(storageManager);
deserializationContext = new DeserializationContext( DeserializationContext deserializationContext = new DeserializationContext(
storageManager, module, descriptorFinder, storageManager, module, builtInsClassDataFinder,
// TODO: support annotations // TODO: support annotations
AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider, AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider,
new ClassDeserializer(storageManager, descriptorFinder), nameResolver new ClassDeserializer(storageManager, builtInsClassDataFinder), nameResolver
); );
members = new DeserializedPackageMemberScope(this, loadPackage(), deserializationContext); members = new DeserializedPackageMemberScope(this, loadPackage(), deserializationContext);
} }
@@ -116,10 +115,10 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
} }
} }
private class BuiltInsDescriptorFinder implements DescriptorFinder { private class BuiltInsClassDataFinder implements ClassDataFinder {
private final NotNullLazyValue<Collection<Name>> classNames; private final NotNullLazyValue<Collection<Name>> classNames;
public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) { public BuiltInsClassDataFinder(@NotNull StorageManager storageManager) {
// TODO: support annotations // TODO: support annotations
classNames = storageManager.createLazyValue(new Function0<Collection<Name>>() { classNames = storageManager.createLazyValue(new Function0<Collection<Name>>() {
@Override @Override
@@ -149,7 +148,8 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
} }
@Nullable @Nullable
private ClassData getClassData(@NotNull ClassId classId) { @Override
public ClassData findClassData(@NotNull ClassId classId) {
InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId)); InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
if (stream == null) { if (stream == null) {
return null; return null;
@@ -173,13 +173,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
} }
} }
@Nullable
@Override
public ClassDescriptor findClass(@NotNull ClassId classId) {
ClassData classData = getClassData(classId);
return classData == null ? null : new DeserializedClassDescriptor(deserializationContext, classData);
}
@NotNull @NotNull
@Override @Override
public Collection<Name> getClassNames(@NotNull FqName packageName) { public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -26,9 +26,9 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
public interface DescriptorFinder { public interface ClassDataFinder {
@Nullable @Nullable
ClassDescriptor findClass(@NotNull ClassId classId); ClassData findClassData(@NotNull ClassId classId);
@ReadOnly @ReadOnly
@NotNull @NotNull
@@ -18,12 +18,23 @@ package org.jetbrains.jet.descriptors.serialization
import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
import kotlin.properties.Delegates
public class ClassDeserializer(val storageManager: StorageManager, val descriptorFinder: DescriptorFinder) { public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
private val classes = storageManager.createMemoizedFunctionWithNullableValues { private val classes = storageManager.createMemoizedFunctionWithNullableValues {
(classId: ClassId) -> (classId: ClassId) ->
descriptorFinder.findClass(classId) val classData = classDataFinder.findClassData(classId)
if (classData != null) {
DeserializedClassDescriptor(context, classData)
}
else {
null
}
} }
var context: DeserializationGlobalContext by Delegates.notNull()
public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId) public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId)
} }
@@ -19,7 +19,7 @@ package org.jetbrains.jet.descriptors.serialization.context
import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.descriptors.serialization.NameResolver import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.descriptors.serialization.TypeDeserializer import org.jetbrains.jet.descriptors.serialization.TypeDeserializer
@@ -36,14 +36,18 @@ import org.jetbrains.jet.descriptors.serialization.ClassDeserializer
public open class DeserializationGlobalContext( public open class DeserializationGlobalContext(
public val storageManager: StorageManager, public val storageManager: StorageManager,
public val moduleDescriptor: ModuleDescriptor, public val moduleDescriptor: ModuleDescriptor,
public val descriptorFinder: DescriptorFinder, public val classDataFinder: ClassDataFinder,
public val annotationLoader: AnnotationLoader, public val annotationLoader: AnnotationLoader,
public val constantLoader: ConstantLoader, public val constantLoader: ConstantLoader,
public val packageFragmentProvider: PackageFragmentProvider, public val packageFragmentProvider: PackageFragmentProvider,
public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, descriptorFinder) public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, classDataFinder)
) { ) {
{
classDeserializer.context = this
}
public fun withNameResolver(nameResolver: NameResolver): DeserializationContext { public fun withNameResolver(nameResolver: NameResolver): DeserializationContext {
return DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, return DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer, nameResolver) constantLoader, packageFragmentProvider, classDeserializer, nameResolver)
} }
} }
@@ -52,13 +56,13 @@ public open class DeserializationGlobalContext(
public open class DeserializationContext( public open class DeserializationContext(
storageManager: StorageManager, storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
descriptorFinder: DescriptorFinder, classDataFinder: ClassDataFinder,
annotationLoader: AnnotationLoader, annotationLoader: AnnotationLoader,
constantLoader: ConstantLoader, constantLoader: ConstantLoader,
packageFragmentProvider: PackageFragmentProvider, packageFragmentProvider: PackageFragmentProvider,
classDeserializer: ClassDeserializer, classDeserializer: ClassDeserializer,
public val nameResolver: NameResolver public val nameResolver: NameResolver
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, ) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer) { constantLoader, packageFragmentProvider, classDeserializer) {
fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes { fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes {
val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}", val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}",
@@ -67,7 +71,7 @@ public open class DeserializationContext(
} }
fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes { fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes {
return DeserializationContextWithTypes(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, return DeserializationContextWithTypes(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer, constantLoader, packageFragmentProvider, classDeserializer,
nameResolver, containingDeclaration, typeDeserializer) nameResolver, containingDeclaration, typeDeserializer)
} }
@@ -78,7 +82,7 @@ public open class DeserializationContext(
class DeserializationContextWithTypes( class DeserializationContextWithTypes(
storageManager: StorageManager, storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
descriptorFinder: DescriptorFinder, classDataFinder: ClassDataFinder,
annotationLoader: AnnotationLoader, annotationLoader: AnnotationLoader,
constantLoader: ConstantLoader, constantLoader: ConstantLoader,
packageFragmentProvider: PackageFragmentProvider, packageFragmentProvider: PackageFragmentProvider,
@@ -86,7 +90,7 @@ class DeserializationContextWithTypes(
nameResolver: NameResolver, nameResolver: NameResolver,
val containingDeclaration: DeclarationDescriptor, val containingDeclaration: DeclarationDescriptor,
val typeDeserializer: TypeDeserializer val typeDeserializer: TypeDeserializer
) : DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, ) : DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer, nameResolver) { constantLoader, packageFragmentProvider, classDeserializer, nameResolver) {
val deserializer: MemberDeserializer = MemberDeserializer(this) val deserializer: MemberDeserializer = MemberDeserializer(this)
@@ -64,7 +64,7 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@Override @Override
protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) { protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
for (Name className : context.getDescriptorFinder().getClassNames(packageFqName)) { for (Name className : context.getClassDataFinder().getClassNames(packageFqName)) {
ClassDescriptor classDescriptor = getClassDescriptor(className); ClassDescriptor classDescriptor = getClassDescriptor(className);
if (classDescriptor != null) { if (classDescriptor != null) {
@@ -17,9 +17,8 @@
package org.jetbrains.jet.plugin.libraries package org.jetbrains.jet.plugin.libraries
import org.jetbrains.jet.descriptors.serialization.ClassId import org.jetbrains.jet.descriptors.serialization.ClassId
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass
@@ -43,7 +42,7 @@ import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
import org.jetbrains.jet.lang.PlatformToKotlinClassMap import org.jetbrains.jet.lang.PlatformToKotlinClassMap
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.types.ErrorUtils import org.jetbrains.jet.descriptors.serialization.ClassData
public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler { public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler {
val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile)
@@ -117,9 +116,15 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
constantLoader.setStorage(deserializerStorage) constantLoader.setStorage(deserializerStorage)
} }
private val descriptorFinder = object : DescriptorFinder { private val classDataFinder = object : ClassDataFinder {
override fun findClass(classId: ClassId): ClassDescriptor? { override fun findClassData(classId: ClassId): ClassData? {
return resolveClassByClassId(classId) val binaryClass = localClassFinder.findKotlinClass(classId) ?: return null
val data = binaryClass.getClassHeader().annotationData
if (data == null) {
LOG.error("Annotation data missing for ${binaryClass.getClassName()}")
return null
}
return JavaProtoBufUtil.readClassDataFrom(data)
} }
override fun getClassNames(packageName: FqName): Collection<Name> { override fun getClassNames(packageName: FqName): Collection<Name> {
@@ -143,27 +148,13 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
moduleDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider) moduleDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider)
moduleDescriptor.addFragmentProvider(DependencyKind.BINARIES, PackageFragmentProviderForMissingDependencies(moduleDescriptor)) moduleDescriptor.addFragmentProvider(DependencyKind.BINARIES, PackageFragmentProviderForMissingDependencies(moduleDescriptor))
} }
val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider) constantLoader, packageFragmentProvider)
private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor { private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor {
return MutablePackageFragmentDescriptor(moduleDescriptor, fqName) return MutablePackageFragmentDescriptor(moduleDescriptor, fqName)
} }
private fun resolveClassByClassId(classId: ClassId): ClassDescriptor? {
val binaryClass = localClassFinder.findKotlinClass(classId) ?: return null
return deserializeBinaryClass(binaryClass)
}
private fun deserializeBinaryClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor {
val data = kotlinClass.getClassHeader().annotationData
if (data == null) {
LOG.error("Annotation data missing for ${kotlinClass.getClassName()}")
}
val classData = JavaProtoBufUtil.readClassDataFrom(data!!)
return DeserializedClassDescriptor(deserializationContext, classData)
}
// we need a "magic" way to obtain ClassId from FqName // we need a "magic" way to obtain ClassId from FqName
// the idea behind this function is that we need accurate class ids only for "neighbouring" classes (inner classes, class object, etc) // the idea behind this function is that we need accurate class ids only for "neighbouring" classes (inner classes, class object, etc)
// for all others we can build any ClassId since it will resolve to MissingDependencyErrorClassDescriptor which only stores fqName // for all others we can build any ClassId since it will resolve to MissingDependencyErrorClassDescriptor which only stores fqName