diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt index 898db253fbc..1f9db9f5a96 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt @@ -17,7 +17,7 @@ package org.jetbrains.jet.lang.types.lang import org.jetbrains.jet.descriptors.serialization.* -import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext +import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantLoader import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope @@ -28,9 +28,7 @@ import org.jetbrains.jet.lang.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.jet.lang.resolve.name.ClassId import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.Name -import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.storage.StorageManager - import java.io.DataInputStream import java.io.IOException import java.io.InputStream @@ -44,17 +42,11 @@ class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDesc public val provider: PackageFragmentProvider = BuiltinsPackageFragmentProvider() private val members: DeserializedPackageMemberScope = run { - val builtInsClassDataFinder = BuiltInsClassDataFinder() - val deserializationContext = DeserializationContext(storageManager, - module, - builtInsClassDataFinder, - AnnotationLoader.UNSUPPORTED, // TODO: support annotations - ConstantLoader.UNSUPPORTED, - provider, - FlexibleTypeCapabilitiesDeserializer.ThrowException, - ClassDeserializer(storageManager, builtInsClassDataFinder), - nameResolver) - DeserializedPackageMemberScope(this, loadPackage(), deserializationContext, { readClassNames() }) + val deserializationContext = DeserializationGlobalContext( + storageManager, module, BuiltInsClassDataFinder(), AnnotationLoader.UNSUPPORTED, // TODO: support annotations + ConstantLoader.UNSUPPORTED, provider, FlexibleTypeCapabilitiesDeserializer.ThrowException + ).withNameResolver(nameResolver) + DeserializedPackageMemberScope(this, loadPackage(), deserializationContext, { readClassNames() }) } private fun loadPackage(): ProtoBuf.Package { 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 32dda547c35..5b7847f559e 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt @@ -23,13 +23,14 @@ import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobal import kotlin.properties.Delegates import org.jetbrains.jet.lang.resolve.name.ClassId -public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) { +public class ClassDeserializer(storageManager: StorageManager) { + // This should have been a constructor parameter, but this class and the context depend circularly on each other var globalContext: DeserializationGlobalContext by Delegates.notNull() private val classes: (ClassKey) -> DeserializedClassDescriptor? = storageManager.createMemoizedFunctionWithNullableValues { (key: ClassKey) -> val classId = key.classId - val classData = key.classData ?: classDataFinder.findClassData(classId) + val classData = key.classData ?: globalContext.classDataFinder.findClassData(classId) if (classData != null) { val outerClassContext = if (classId.isTopLevelClass()) null 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 0ad81df8fca..17eca04b20e 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 @@ -40,7 +40,7 @@ public open class DeserializationGlobalContext( public val constantLoader: ConstantLoader, public val packageFragmentProvider: PackageFragmentProvider, public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer, - public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, classDataFinder) + public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager) ) { { classDeserializer.globalContext = this @@ -48,10 +48,15 @@ public open class DeserializationGlobalContext( public fun withNameResolver(nameResolver: NameResolver): DeserializationContext { return DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, - constantLoader, packageFragmentProvider, flexibleTypeCapabilitiesDeserializer, classDeserializer, nameResolver) + constantLoader, packageFragmentProvider, flexibleTypeCapabilitiesDeserializer, + classDeserializer, nameResolver) } } +fun DeserializationGlobalContext.deserializeClass(classId: ClassId): ClassDescriptor? { + return classDeserializer.deserializeClass(classId) +} + public open class DeserializationContext( storageManager: StorageManager, @@ -72,8 +77,8 @@ public open class DeserializationContext( fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes { return DeserializationContextWithTypes(storageManager, moduleDescriptor, classDataFinder, annotationLoader, - constantLoader, packageFragmentProvider, classDeserializer, - nameResolver, flexibleTypeCapabilitiesDeserializer, containingDeclaration, typeDeserializer) + constantLoader, packageFragmentProvider, flexibleTypeCapabilitiesDeserializer, + classDeserializer, nameResolver, containingDeclaration, typeDeserializer) } } @@ -86,16 +91,16 @@ class DeserializationContextWithTypes( annotationLoader: AnnotationLoader, constantLoader: ConstantLoader, packageFragmentProvider: PackageFragmentProvider, + flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer, classDeserializer: ClassDeserializer, nameResolver: NameResolver, - flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer, val containingDeclaration: DeclarationDescriptor, val typeDeserializer: TypeDeserializer ) : DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader, constantLoader, packageFragmentProvider, flexibleTypeCapabilitiesDeserializer, classDeserializer, nameResolver) { val deserializer: MemberDeserializer = MemberDeserializer(this) - public fun childContext(descriptor: DeclarationDescriptor, typeParameterProtos: List): DeserializationContextWithTypes { + fun childContext(descriptor: DeclarationDescriptor, typeParameterProtos: List): DeserializationContextWithTypes { val childTypeDeserializer = TypeDeserializer(this, typeDeserializer, "Child deserializer for ${descriptor.getName()}") val childContext = withTypes(descriptor, childTypeDeserializer) @@ -106,7 +111,3 @@ class DeserializationContextWithTypes( return childContext } } - -fun DeserializationGlobalContext.deserializeClass(classId: ClassId): ClassDescriptor? { - return classDeserializer.deserializeClass(classId) -} diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt index 4976bce7a40..5d018308316 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.descriptors.serialization.ClassData import org.jetbrains.jet.lang.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.jet.plugin.decompiler.isKotlinWithCompatibleAbiVersion +import org.jetbrains.jet.descriptors.serialization.context.deserializeClass public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler { val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) @@ -53,7 +54,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di private fun createDummyModule(name: String) = ModuleDescriptorImpl(Name.special("<$name>"), listOf(), PlatformToKotlinClassMap.EMPTY) - override fun resolveTopLevelClass(classId: ClassId) = deserializationContext.classDeserializer.deserializeClass(classId) + override fun resolveTopLevelClass(classId: ClassId) = deserializationContext.deserializeClass(classId) override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection { assert(packageFqName == directoryPackageFqName, "Was called for $packageFqName but only $directoryPackageFqName is expected.")