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:
+4
-2
@@ -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"
|
||||
}
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+2
-8
@@ -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
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user