Serialize metadata for Cloneable and discard it during deserialization

#KT-16358 Fixed
This commit is contained in:
Alexander Udalov
2017-02-15 12:07:55 +03:00
parent 46bd64f59a
commit bae955aafd
8 changed files with 67 additions and 8 deletions
@@ -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())
)
}
}