KT-44378 don't generate no-arg constructor for sealed classes

This commit is contained in:
Dmitry Petrov
2021-01-15 18:58:10 +03:00
committed by TeamCityServer
parent ee93efc19d
commit 0c463d3260
6 changed files with 27 additions and 1 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtPureClassOrObject
import org.jetbrains.kotlin.psi.KtPureElement
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue
import org.jetbrains.kotlin.resolve.isInlineClass
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -269,6 +270,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
if (classOrObject.isLocal) return false
if (classDescriptor.isInlineClass()) return false
if (shouldHideConstructorDueToInlineClassTypeValueParameters(constructorDescriptor)) return false
if (DescriptorUtils.isSealedClass(classDescriptor)) return false
if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
@@ -36,7 +37,9 @@ internal val jvmDefaultConstructorPhase = makeIrFilePhase(
private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : ClassLoweringPass {
override fun lower(irClass: IrClass) {
if (irClass.kind != ClassKind.CLASS || irClass.visibility == DescriptorVisibilities.LOCAL || irClass.isInline || irClass.isInner)
if (irClass.kind != ClassKind.CLASS || irClass.visibility == DescriptorVisibilities.LOCAL || irClass.isInline || irClass.isInner ||
irClass.modality == Modality.SEALED
)
return
val primaryConstructor = irClass.constructors.firstOrNull { it.isPrimary } ?: return
@@ -0,0 +1,3 @@
// !LANGUAGE: +AllowSealedInheritorsInDifferentFilesOfSamePackage
sealed class Test(val x: Int = 0)
@@ -0,0 +1,8 @@
@kotlin.Metadata
public abstract class Test {
// source: 'sealedClassConstructorWithDefaultParams.kt'
private final field x: int
public method <init>(p0: int): void
public synthetic method <init>(p0: int, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public final method getX(): int
}
@@ -230,6 +230,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
runTest("compiler/testData/codegen/bytecodeListing/rawTypeInSignature.kt");
}
@TestMetadata("sealedClassConstructorWithDefaultParams.kt")
public void testSealedClassConstructorWithDefaultParams() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/sealedClassConstructorWithDefaultParams.kt");
}
@TestMetadata("strictfpFlag.kt")
public void testStrictfpFlag() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");
@@ -230,6 +230,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
runTest("compiler/testData/codegen/bytecodeListing/rawTypeInSignature.kt");
}
@TestMetadata("sealedClassConstructorWithDefaultParams.kt")
public void testSealedClassConstructorWithDefaultParams() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/sealedClassConstructorWithDefaultParams.kt");
}
@TestMetadata("strictfpFlag.kt")
public void testStrictfpFlag() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");