From 50c515deca60f259bc9af3707fee573706de8353 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 5 Jan 2018 16:21:23 +0100 Subject: [PATCH] Do not serialize constructors for anonymous objects The only client of this data is reflection, and since anonymous objects do not have constructors in the source code, they shouldn't in reflection as well #KT-20442 Fixed --- .../jetbrains/kotlin/serialization/DescriptorSerializer.kt | 2 +- .../box/reflection/constructors/classesWithoutConstructors.kt | 1 + .../codegen/box/reflection/constructors/primaryConstructor.kt | 4 +++- compiler/testData/serialization/local/anonymousObject.txt | 1 - .../jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt | 2 +- .../kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt | 2 +- .../kotlin/metadata/builtins/BuiltInsBinaryVersion.kt | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 0bae3e96fca..295ce365156 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -89,7 +89,7 @@ class DescriptorSerializer private constructor( } } - if (classDescriptor.kind != ClassKind.ENUM_ENTRY) { + if (!DescriptorUtils.isAnonymousObject(classDescriptor) && classDescriptor.kind != ClassKind.ENUM_ENTRY) { for (descriptor in classDescriptor.constructors) { builder.addConstructor(constructorProto(descriptor)) } diff --git a/compiler/testData/codegen/box/reflection/constructors/classesWithoutConstructors.kt b/compiler/testData/codegen/box/reflection/constructors/classesWithoutConstructors.kt index a0ec6be94ff..4c9a5e84c6d 100644 --- a/compiler/testData/codegen/box/reflection/constructors/classesWithoutConstructors.kt +++ b/compiler/testData/codegen/box/reflection/constructors/classesWithoutConstructors.kt @@ -18,6 +18,7 @@ fun box(): String { assertTrue(Interface::class.constructors.isEmpty()) assertTrue(Obj::class.constructors.isEmpty()) assertTrue(C.Companion::class.constructors.isEmpty()) + assertTrue(object {}::class.constructors.isEmpty()) return "OK" } diff --git a/compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt b/compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt index 05da836d9b8..59f7bb06c5f 100644 --- a/compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt +++ b/compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt @@ -49,11 +49,13 @@ fun box(): String { val p4 = TwoSecondaries::class.primaryConstructor assertNull(p4) - assertNotNull(En::class.primaryConstructor) // TODO: maybe primaryConstructor should be null for enum classes + assertNotNull(En::class.primaryConstructor) assertNull(I::class.primaryConstructor) assertNull(O::class.primaryConstructor) assertNull(C.Companion::class.primaryConstructor) + assertNull(object {}::class.primaryConstructor) + return "OK" } diff --git a/compiler/testData/serialization/local/anonymousObject.txt b/compiler/testData/serialization/local/anonymousObject.txt index 57a3b9a86d7..a8cd5787ca7 100644 --- a/compiler/testData/serialization/local/anonymousObject.txt +++ b/compiler/testData/serialization/local/anonymousObject.txt @@ -1,4 +1,3 @@ local final class `AnonymousObjectKt$main$1` : java.lang.Runnable -public constructor `AnonymousObjectKt$main$1`() public open override /*1*/ fun run(): kotlin.Unit diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 0ad45f44f37..1852306cc5b 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -32,7 +32,7 @@ class JsMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = JsMetadataVersion(1, 2, 2) + val INSTANCE = JsMetadataVersion(1, 2, 3) @JvmField val INVALID_VERSION = JsMetadataVersion() diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt index 63994c1cb7d..af2d12e09f4 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt @@ -18,7 +18,7 @@ class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = JvmMetadataVersion(1, 1, 10) + val INSTANCE = JvmMetadataVersion(1, 1, 11) @JvmField val INVALID_VERSION = JvmMetadataVersion() diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt index a1e16792f66..1b546ff8000 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt @@ -18,7 +18,7 @@ class BuiltInsBinaryVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = BuiltInsBinaryVersion(1, 0, 3) + val INSTANCE = BuiltInsBinaryVersion(1, 0, 4) @JvmField val INVALID_VERSION = BuiltInsBinaryVersion()