diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index 55a15e410fa..1884ba4bcbc 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -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.kotlin.DeserializedDescriptorResolver; 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.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; @@ -63,7 +63,7 @@ public class InjectorForJavaDescriptorResolver { private final GlobalJavaResolverContext globalJavaResolverContext; private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializationGlobalContextForJava deserializationGlobalContextForJava; - private final JavaDescriptorFinder javaDescriptorFinder; + private final JavaClassDataFinder javaClassDataFinder; private final AnnotationDescriptorLoader annotationDescriptorLoader; private final DescriptorDeserializersStorage descriptorDeserializersStorage; 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.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule()); - this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); + this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); 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.javaClassFinder.setProject(project); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java index 3992c9a295a..5924539a93d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java @@ -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.kotlin.DeserializedDescriptorResolver; 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.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; @@ -107,7 +107,7 @@ public class InjectorForLazyResolveWithJava { private final GlobalJavaResolverContext globalJavaResolverContext; private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializationGlobalContextForJava deserializationGlobalContextForJava; - private final JavaDescriptorFinder javaDescriptorFinder; + private final JavaClassDataFinder javaClassDataFinder; private final AnnotationDescriptorLoader annotationDescriptorLoader; private final DescriptorDeserializersStorage descriptorDeserializersStorage; private final ConstantDescriptorLoader constantDescriptorLoader; @@ -157,10 +157,10 @@ public class InjectorForLazyResolveWithJava { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); - this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); + this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); 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.resolveSession.setAnnotationResolve(annotationResolver); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 5f39318c1b2..2ecc155edbe 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -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.GlobalJavaResolverContext; 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.DescriptorDeserializersStorage; import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader; @@ -127,7 +127,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final GlobalJavaResolverContext globalJavaResolverContext; private final DeserializedDescriptorResolver deserializedDescriptorResolver; - private final JavaDescriptorFinder javaDescriptorFinder; + private final JavaClassDataFinder javaClassDataFinder; private final AnnotationDescriptorLoader annotationDescriptorLoader; private final DescriptorDeserializersStorage descriptorDeserializersStorage; 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.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor()); - this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); + this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider); this.annotationDescriptorLoader = new AnnotationDescriptorLoader(); 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.annotationResolver = new AnnotationResolver(); this.callResolver = new CallResolver(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt index 6b2d0e78bf4..0835c390c0f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt @@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptorImpl import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.storage.StorageManager 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.lang.resolve.java.JavaDescriptorResolver import org.jetbrains.jet.descriptors.serialization.ClassId diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt index f5ac3b9876a..39000a60df7 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -98,7 +98,7 @@ public class LazyJavaPackageFragmentProvider( 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) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt index 8f111ce2192..400bb97136f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt @@ -25,9 +25,9 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor public class DeserializationGlobalContextForJava( storageManager: StorageManager, moduleDescriptor: ModuleDescriptor, - descriptorFinder: JavaDescriptorFinder, + classDataFinder: JavaClassDataFinder, annotationLoader: AnnotationDescriptorLoader, constantLoader: ConstantDescriptorLoader, packageFragmentProvider: LazyJavaPackageFragmentProvider -) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, +) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider) \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java index 73734a6ef37..12e8f71bad5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java @@ -22,7 +22,6 @@ import org.jetbrains.jet.descriptors.serialization.ClassData; import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; 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.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; @@ -52,15 +51,6 @@ public final class DeserializedDescriptorResolver { @Nullable 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); if (data != null) { ClassData classData = JavaProtoBufUtil.readClassDataFrom(data); @@ -81,7 +71,7 @@ public final class DeserializedDescriptorResolver { } @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(); if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) { errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion()); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaClassDataFinder.kt similarity index 70% rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaClassDataFinder.kt index 87696f010ef..d3c2dc6276c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaClassDataFinder.kt @@ -17,7 +17,7 @@ package org.jetbrains.jet.lang.resolve.kotlin 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.resolve.java.resolver.JavaPackageFragmentProvider 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 org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver 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 javaPackageFragmentProvider: JavaPackageFragmentProvider -) : DescriptorFinder { +) : ClassDataFinder { - override fun findClass(classId: ClassId): ClassDescriptor? { + override fun findClassData(classId: ClassId): ClassData? { val lazyJavaPackageFragmentProvider = javaDescriptorResolver.getPackageFragmentProvider() as LazyJavaPackageFragmentProvider val c = lazyJavaPackageFragmentProvider.c 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 { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java index bf35073b121..0c00262f642 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java @@ -41,7 +41,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl { private final DeserializedPackageMemberScope members; private final NameResolver nameResolver; private final PackageFragmentProvider packageFragmentProvider; - private final DeserializationContext deserializationContext; public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) { super(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME); @@ -49,12 +48,12 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl { packageFragmentProvider = new BuiltinsPackageFragmentProvider(); - BuiltInsDescriptorFinder descriptorFinder = new BuiltInsDescriptorFinder(storageManager); - deserializationContext = new DeserializationContext( - storageManager, module, descriptorFinder, + BuiltInsClassDataFinder builtInsClassDataFinder = new BuiltInsClassDataFinder(storageManager); + DeserializationContext deserializationContext = new DeserializationContext( + storageManager, module, builtInsClassDataFinder, // TODO: support annotations AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider, - new ClassDeserializer(storageManager, descriptorFinder), nameResolver + new ClassDeserializer(storageManager, builtInsClassDataFinder), nameResolver ); 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> classNames; - public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) { + public BuiltInsClassDataFinder(@NotNull StorageManager storageManager) { // TODO: support annotations classNames = storageManager.createLazyValue(new Function0>() { @Override @@ -149,7 +148,8 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl { } @Nullable - private ClassData getClassData(@NotNull ClassId classId) { + @Override + public ClassData findClassData(@NotNull ClassId classId) { InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId)); if (stream == 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 @Override public Collection getClassNames(@NotNull FqName packageName) { diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorFinder.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDataFinder.java similarity index 92% rename from core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorFinder.java rename to core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDataFinder.java index 595d313ef72..bc9c79dc938 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorFinder.java +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDataFinder.java @@ -26,9 +26,9 @@ import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; import java.util.Collections; -public interface DescriptorFinder { +public interface ClassDataFinder { @Nullable - ClassDescriptor findClass(@NotNull ClassId classId); + ClassData findClassData(@NotNull ClassId classId); @ReadOnly @NotNull diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt index f6ac9d89fe8..bfbe81170de 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt @@ -18,12 +18,23 @@ package org.jetbrains.jet.descriptors.serialization import org.jetbrains.jet.lang.descriptors.ClassDescriptor 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 { (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) } \ No newline at end of file diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt index 07047ffe200..9a91b4f3431 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt @@ -19,7 +19,7 @@ package org.jetbrains.jet.descriptors.serialization.context import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader 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.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.descriptors.serialization.TypeDeserializer @@ -36,14 +36,18 @@ import org.jetbrains.jet.descriptors.serialization.ClassDeserializer public open class DeserializationGlobalContext( public val storageManager: StorageManager, public val moduleDescriptor: ModuleDescriptor, - public val descriptorFinder: DescriptorFinder, + public val classDataFinder: ClassDataFinder, public val annotationLoader: AnnotationLoader, public val constantLoader: ConstantLoader, 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 { - return DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, + return DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider, classDeserializer, nameResolver) } } @@ -52,13 +56,13 @@ public open class DeserializationGlobalContext( public open class DeserializationContext( storageManager: StorageManager, moduleDescriptor: ModuleDescriptor, - descriptorFinder: DescriptorFinder, + classDataFinder: ClassDataFinder, annotationLoader: AnnotationLoader, constantLoader: ConstantLoader, packageFragmentProvider: PackageFragmentProvider, classDeserializer: ClassDeserializer, public val nameResolver: NameResolver -) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, +) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider, classDeserializer) { fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes { val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}", @@ -67,7 +71,7 @@ public open class DeserializationContext( } fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes { - return DeserializationContextWithTypes(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, + return DeserializationContextWithTypes(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider, classDeserializer, nameResolver, containingDeclaration, typeDeserializer) } @@ -78,7 +82,7 @@ public open class DeserializationContext( class DeserializationContextWithTypes( storageManager: StorageManager, moduleDescriptor: ModuleDescriptor, - descriptorFinder: DescriptorFinder, + classDataFinder: ClassDataFinder, annotationLoader: AnnotationLoader, constantLoader: ConstantLoader, packageFragmentProvider: PackageFragmentProvider, @@ -86,7 +90,7 @@ class DeserializationContextWithTypes( nameResolver: NameResolver, val containingDeclaration: DeclarationDescriptor, val typeDeserializer: TypeDeserializer -) : DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, +) : DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider, classDeserializer, nameResolver) { val deserializer: MemberDeserializer = MemberDeserializer(this) diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.java index b0f0cbf6c48..8f676871c44 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.java +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.java @@ -64,7 +64,7 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope { @Override protected void addAllClassDescriptors(@NotNull Collection result) { - for (Name className : context.getDescriptorFinder().getClassNames(packageFqName)) { + for (Name className : context.getClassDataFinder().getClassNames(packageFqName)) { ClassDescriptor classDescriptor = getClassDescriptor(className); if (classDescriptor != null) { diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt b/idea/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt index e76a8d33ff1..6f9aa1cdd30 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt @@ -17,9 +17,8 @@ package org.jetbrains.jet.plugin.libraries 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.descriptors.DeserializedClassDescriptor import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor 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.lang.PlatformToKotlinClassMap 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 { val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) @@ -117,9 +116,15 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di constantLoader.setStorage(deserializerStorage) } - private val descriptorFinder = object : DescriptorFinder { - override fun findClass(classId: ClassId): ClassDescriptor? { - return resolveClassByClassId(classId) + private val classDataFinder = object : ClassDataFinder { + override fun findClassData(classId: ClassId): ClassData? { + 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 { @@ -143,27 +148,13 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di moduleDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider) moduleDescriptor.addFragmentProvider(DependencyKind.BINARIES, PackageFragmentProviderForMissingDependencies(moduleDescriptor)) } - val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader, + val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider) private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor { 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 // 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