Do not create primary constructor for enum entry synthetic class

The change in DescriptorSerializer is needed so that serialized protos
of enum entry classes which are resolved in sources
(LazyClassDescriptor) and are deserialized from binaries
(EnumEntrySyntheticClassDescriptor) are the same. There are tests on
incremental compilation in JS that check that the serialized proto is
exactly the same after rebuild and after an incremental build.

 #KT-22048 Fixed
This commit is contained in:
Alexander Udalov
2018-01-04 19:06:56 +01:00
parent b52b07ec79
commit 17fc41e0f9
8 changed files with 55 additions and 10 deletions
@@ -89,8 +89,10 @@ class DescriptorSerializer private constructor(
}
}
for (descriptor in classDescriptor.constructors) {
builder.addConstructor(constructorProto(descriptor))
if (classDescriptor.kind != ClassKind.ENUM_ENTRY) {
for (descriptor in classDescriptor.constructors) {
builder.addConstructor(constructorProto(descriptor))
}
}
val callableMembers =
@@ -0,0 +1,24 @@
// IGNORE_BACKEND: JS_IR, JS, NATIVE
// WITH_REFLECT
import kotlin.test.assertEquals
enum class TestEnum(val id: String? = null) {
ENUM1(id = "enum1_id"),
ENUM2(id = "enum2_id") {
override fun test() {
ENUM1.test()
}
};
open fun test() {
}
}
fun box(): String {
assertEquals(listOf("fun <init>(kotlin.String?): TestEnum"), TestEnum.ENUM1::class.constructors.map { it.toString() })
assertEquals(listOf(), TestEnum.ENUM2::class.constructors.map { it.toString() })
return "OK"
}
@@ -16890,6 +16890,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/reflection/constructors/constructorName.kt");
}
@TestMetadata("enumEntry.kt")
public void testEnumEntry() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/enumEntry.kt");
}
@TestMetadata("primaryConstructor.kt")
public void testPrimaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt");
@@ -16890,6 +16890,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/reflection/constructors/constructorName.kt");
}
@TestMetadata("enumEntry.kt")
public void testEnumEntry() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/enumEntry.kt");
}
@TestMetadata("primaryConstructor.kt")
public void testPrimaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt");
@@ -16890,6 +16890,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/reflection/constructors/constructorName.kt");
}
@TestMetadata("enumEntry.kt")
public void testEnumEntry() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/enumEntry.kt");
}
@TestMetadata("primaryConstructor.kt")
public void testPrimaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt");
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.incremental.components.LookupLocation;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorFactory;
import org.jetbrains.kotlin.resolve.NonReportingOverrideStrategy;
import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
@@ -32,7 +31,6 @@ import java.util.*;
public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
private final TypeConstructor typeConstructor;
private final ClassConstructorDescriptor primaryConstructor;
private final MemberScope scope;
private final NotNullLazyValue<Set<Name>> enumMemberNames;
private final Annotations annotations;
@@ -74,10 +72,6 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
this.scope = new EnumEntryScope(storageManager);
this.enumMemberNames = enumMemberNames;
ClassConstructorDescriptorImpl primaryConstructor = DescriptorFactory.createPrimaryConstructorForObject(this, source);
primaryConstructor.setReturnType(getDefaultType());
this.primaryConstructor = primaryConstructor;
}
@NotNull
@@ -95,7 +89,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull
@Override
public Collection<ClassConstructorDescriptor> getConstructors() {
return Collections.singleton(primaryConstructor);
return Collections.emptyList();
}
@NotNull
@@ -161,7 +155,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@Nullable
@Override
public ClassConstructorDescriptor getUnsubstitutedPrimaryConstructor() {
return primaryConstructor;
return null;
}
@NotNull
@@ -15205,6 +15205,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/reflection/constructors/constructorName.kt");
}
@TestMetadata("enumEntry.kt")
public void testEnumEntry() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/enumEntry.kt");
}
@TestMetadata("primaryConstructor.kt")
public void testPrimaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt");
@@ -15205,6 +15205,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/reflection/constructors/constructorName.kt");
}
@TestMetadata("enumEntry.kt")
public void testEnumEntry() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/enumEntry.kt");
}
@TestMetadata("primaryConstructor.kt")
public void testPrimaryConstructor() throws Exception {
runTest("compiler/testData/codegen/box/reflection/constructors/primaryConstructor.kt");