KT-44378 don't generate no-arg constructor for sealed classes
This commit is contained in:
committed by
TeamCityServer
parent
ee93efc19d
commit
0c463d3260
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.psi.KtParameter
|
|||||||
import org.jetbrains.kotlin.psi.KtPureClassOrObject
|
import org.jetbrains.kotlin.psi.KtPureClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtPureElement
|
import org.jetbrains.kotlin.psi.KtPureElement
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
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.calls.components.hasDefaultValue
|
||||||
import org.jetbrains.kotlin.resolve.isInlineClass
|
import org.jetbrains.kotlin.resolve.isInlineClass
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
@@ -269,6 +270,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
|||||||
if (classOrObject.isLocal) return false
|
if (classOrObject.isLocal) return false
|
||||||
if (classDescriptor.isInlineClass()) return false
|
if (classDescriptor.isInlineClass()) return false
|
||||||
if (shouldHideConstructorDueToInlineClassTypeValueParameters(constructorDescriptor)) return false
|
if (shouldHideConstructorDueToInlineClassTypeValueParameters(constructorDescriptor)) return false
|
||||||
|
if (DescriptorUtils.isSealedClass(classDescriptor)) return false
|
||||||
|
|
||||||
if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false
|
if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
|||||||
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters
|
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
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.declarations.addConstructor
|
||||||
import org.jetbrains.kotlin.ir.builders.irBlockBody
|
import org.jetbrains.kotlin.ir.builders.irBlockBody
|
||||||
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
|
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
|
||||||
@@ -36,7 +37,9 @@ internal val jvmDefaultConstructorPhase = makeIrFilePhase(
|
|||||||
private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : ClassLoweringPass {
|
private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : ClassLoweringPass {
|
||||||
|
|
||||||
override fun lower(irClass: IrClass) {
|
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
|
return
|
||||||
|
|
||||||
val primaryConstructor = irClass.constructors.firstOrNull { it.isPrimary } ?: return
|
val primaryConstructor = irClass.constructors.firstOrNull { it.isPrimary } ?: return
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
// !LANGUAGE: +AllowSealedInheritorsInDifferentFilesOfSamePackage
|
||||||
|
|
||||||
|
sealed class Test(val x: Int = 0)
|
||||||
+8
@@ -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
|
||||||
|
}
|
||||||
+5
@@ -230,6 +230,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/rawTypeInSignature.kt");
|
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")
|
@TestMetadata("strictfpFlag.kt")
|
||||||
public void testStrictfpFlag() throws Exception {
|
public void testStrictfpFlag() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");
|
||||||
|
|||||||
+5
@@ -230,6 +230,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/rawTypeInSignature.kt");
|
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")
|
@TestMetadata("strictfpFlag.kt")
|
||||||
public void testStrictfpFlag() throws Exception {
|
public void testStrictfpFlag() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/strictfpFlag.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user