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 03ac9298361..35bdeec5a6d 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 @@ -54,7 +54,7 @@ public final class DeserializedDescriptorResolver { public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) { String[] data = readData(kotlinClass, CLASS); if (data != null) { - return context.getClassDeserializer().deserializeClass(JavaProtoBufUtil.readClassDataFrom(data)); + return context.getClassDeserializer().deserializeClass(kotlinClass.getClassId(), JavaProtoBufUtil.readClassDataFrom(data)); } return null; } @@ -64,13 +64,14 @@ public final class DeserializedDescriptorResolver { String[] data = readData(kotlinClass, PACKAGE_FACADE); if (data != null) { //all classes are included in java scope - return DescriptorsPackage.DeserializedPackageMemberScope(descriptor, JavaProtoBufUtil.readPackageDataFrom(data), context, - new Function0>() { - @Override - public Collection invoke() { - return Collections.emptyList(); - } - }); + return DescriptorsPackage.DeserializedPackageMemberScope( + descriptor, JavaProtoBufUtil.readPackageDataFrom(data), context, + new Function0>() { + @Override + public Collection invoke() { + return Collections.emptyList(); + } + }); } return null; } 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 a6afda8e8a6..32dda547c35 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt @@ -24,35 +24,30 @@ import kotlin.properties.Delegates import org.jetbrains.jet.lang.resolve.name.ClassId public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) { - private val classes = storageManager.createMemoizedFunctionWithNullableValues { + var globalContext: DeserializationGlobalContext by Delegates.notNull() + + private val classes: (ClassKey) -> DeserializedClassDescriptor? = storageManager.createMemoizedFunctionWithNullableValues { (key: ClassKey) -> - val classData = key.classData ?: classDataFinder.findClassData(key.classId) + val classId = key.classId + val classData = key.classData ?: classDataFinder.findClassData(classId) if (classData != null) { - DeserializedClassDescriptor(context, classData) + val outerClassContext = + if (classId.isTopLevelClass()) null + else classes(ClassKey(classId.getOuterClassId(), null))?.context + val context = outerClassContext ?: globalContext + DeserializedClassDescriptor(context.withNameResolver(classData.getNameResolver()), classData.getClassProto()) } else { null } } - var context: DeserializationGlobalContext by Delegates.notNull() - - public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(ClassKey(classId, null)) - - //needed to avoid calling ClassDataFinder#findClassData() if it is already computed at call site - public fun deserializeClass(classData: ClassData): ClassDescriptor? = classes(ClassKey(classData.readId(), classData)) + // Additional ClassData parameter is needed to avoid calling ClassDataFinder#findClassData() if it is already computed at call site + public fun deserializeClass(classId: ClassId, classData: ClassData? = null): ClassDescriptor? = classes(ClassKey(classId, classData)) private inner class ClassKey(val classId: ClassId, val classData: ClassData?) { - override fun equals(other: Any?): Boolean { - return other is ClassKey && classId == other.classId - } - - override fun hashCode(): Int { - return classId.hashCode() - } + override fun equals(other: Any?): Boolean = other is ClassKey && classId == other.classId + override fun hashCode(): Int = classId.hashCode() + override fun toString(): String = classId.toString() } - - private fun ClassData.readId(): ClassId { - return getNameResolver().getClassId(getClassProto().getFqName()) - } -} \ 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 3f85fb5f24c..fbb002306ac 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 @@ -45,7 +45,7 @@ public open class DeserializationGlobalContext( public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, classDataFinder) ) { { - classDeserializer.context = this + classDeserializer.globalContext = this } public fun withNameResolver(nameResolver: NameResolver): DeserializationContext { diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt index 63110beca93..5a735b39924 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt @@ -16,7 +16,6 @@ package org.jetbrains.jet.descriptors.serialization.descriptors -import org.jetbrains.jet.descriptors.serialization.ClassData import org.jetbrains.jet.descriptors.serialization.Flags import org.jetbrains.jet.descriptors.serialization.ProtoBuf import org.jetbrains.jet.descriptors.serialization.context.* @@ -31,23 +30,21 @@ import org.jetbrains.jet.lang.resolve.scopes.StaticScopeForKotlinClass import org.jetbrains.jet.lang.types.AbstractClassTypeConstructor import org.jetbrains.jet.lang.types.ErrorUtils import org.jetbrains.jet.lang.types.JetType -import org.jetbrains.jet.storage.MemoizedFunctionToNullable - -import java.util.* - import org.jetbrains.jet.descriptors.serialization import org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName import org.jetbrains.jet.descriptors.serialization.classKind import org.jetbrains.jet.utils.addIfNotNull import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.lang.resolve.scopes.DescriptorKindFilter +import java.util.* -public fun DeserializedClassDescriptor(globalContext: DeserializationGlobalContext, classData: ClassData): DeserializedClassDescriptor - = DeserializedClassDescriptor(globalContext.withNameResolver(classData.getNameResolver()), classData.getClassProto()) - -public class DeserializedClassDescriptor(outerContext: DeserializationContext, private val classProto: ProtoBuf.Class) -: AbstractClassDescriptor(outerContext.storageManager, outerContext.nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName()), ClassDescriptor { - +public class DeserializedClassDescriptor( + outerContext: DeserializationContext, + private val classProto: ProtoBuf.Class +) : ClassDescriptor, AbstractClassDescriptor( + outerContext.storageManager, + outerContext.nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName() +) { private val modality = serialization.modality(Flags.MODALITY.get(classProto.getFlags())) private val visibility = serialization.visibility(Flags.VISIBILITY.get(classProto.getFlags())) private val kind = classKind(Flags.CLASS_KIND.get(classProto.getFlags())) @@ -55,7 +52,7 @@ public class DeserializedClassDescriptor(outerContext: DeserializationContext, p private val classId = outerContext.nameResolver.getClassId(classProto.getFqName()) private val typeParameters = ArrayList(classProto.getTypeParameterCount()) - private val context = outerContext.withTypes(this).childContext(this, classProto.getTypeParameterList(), typeParameters) + val context = outerContext.withTypes(this).childContext(this, classProto.getTypeParameterList(), typeParameters) private val staticScope = StaticScopeForKotlinClass(this) private val typeConstructor = DeserializedClassTypeConstructor(typeParameters)