Serialize metadata for Cloneable and discard it during deserialization
#KT-16358 Fixed
This commit is contained in:
+5
-2
@@ -27,11 +27,14 @@ import org.jetbrains.kotlin.storage.getValue
|
||||
|
||||
class JvmBuiltInClassDescriptorFactory(
|
||||
storageManager: StorageManager,
|
||||
private val moduleDescriptor: ModuleDescriptor
|
||||
private val moduleDescriptor: ModuleDescriptor,
|
||||
private val computeContainingDeclaration: (ModuleDescriptor) -> DeclarationDescriptor = { module ->
|
||||
module.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().first()
|
||||
}
|
||||
) : ClassDescriptorFactory {
|
||||
private val cloneable by storageManager.createLazyValue {
|
||||
ClassDescriptorImpl(
|
||||
moduleDescriptor.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().first(),
|
||||
computeContainingDeclaration(moduleDescriptor),
|
||||
CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType),
|
||||
SourceElement.NO_SOURCE, /* isExternal = */ false
|
||||
).apply {
|
||||
|
||||
+5
-4
@@ -38,9 +38,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.serialization.deserialization.AdditionalClassPartsProvider
|
||||
import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter
|
||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
@@ -66,7 +64,10 @@ open class JvmBuiltInsSettings(
|
||||
|
||||
private val mockSerializableType = storageManager.createMockJavaIoSerializableType()
|
||||
private val cloneableType by storageManager.createLazyValue {
|
||||
moduleDescriptor.builtIns.getBuiltInClassByName(JvmBuiltInClassDescriptorFactory.CLONEABLE_CLASS_ID.shortClassName).defaultType
|
||||
ownerModuleDescriptor.findNonGenericClassAcrossDependencies(
|
||||
JvmBuiltInClassDescriptorFactory.CLONEABLE_CLASS_ID,
|
||||
NotFoundClasses(storageManager, ownerModuleDescriptor)
|
||||
).defaultType
|
||||
}
|
||||
|
||||
private val javaAnalogueClassesWithCustomSupertypeCache = storageManager.createCacheWithNotNullValues<FqName, ClassDescriptor>()
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.builtins
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||
@@ -53,6 +54,8 @@ class BuiltInsPackageFragment(
|
||||
override fun computeMemberScope() =
|
||||
DeserializedPackageMemberScope(
|
||||
this, proto.`package`, nameResolver, containerSource = null, components = components,
|
||||
classNames = { classDataFinder.allClassIds.filter { classId -> !classId.isNestedClass }.map { it.shortClassName } }
|
||||
classNames = { classDataFinder.allClassIds.filter { classId ->
|
||||
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
|
||||
}.map { it.shortClassName } }
|
||||
)
|
||||
}
|
||||
|
||||
+15
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.serialization.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.serialization.ClassDataWithSource
|
||||
@@ -36,6 +37,8 @@ class ClassDeserializer(private val components: DeserializationComponents) {
|
||||
for (factory in components.fictitiousClassDescriptorFactories) {
|
||||
factory.createClass(classId)?.let { return it }
|
||||
}
|
||||
if (classId in BLACK_LIST) return null
|
||||
|
||||
val (classData, sourceElement) = key.classDataWithSource
|
||||
?: components.classDataFinder.findClassData(classId)
|
||||
?: return null
|
||||
@@ -76,4 +79,16 @@ class ClassDeserializer(private val components: DeserializationComponents) {
|
||||
|
||||
override fun hashCode() = classId.hashCode()
|
||||
}
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* FQ names of classes that should be ignored during deserialization.
|
||||
*
|
||||
* We ignore kotlin.Cloneable because since Kotlin 1.1, the descriptor for it is created via JvmBuiltInClassDescriptorFactory,
|
||||
* but the metadata is still serialized for kotlin-reflect 1.0 to work (see BuiltInsSerializer.kt).
|
||||
*/
|
||||
val BLACK_LIST = setOf(
|
||||
ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.cloneable.toSafe())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user