From d898e256cafc59c14d5a8a0eb0928188d396bdb9 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 6 Dec 2022 12:39:57 +0200 Subject: [PATCH] [FIR] Don't update explicit delegated constructor calls of classes with @JvmRecord ^KT-54573 Fixed --- ...gnosisCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...ontendDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../FirBlackBoxModernJdkCodegenTestGenerated.java | 6 ++++++ .../kotlin/fir/java/JvmSupertypeUpdater.kt | 10 ++++++++++ .../boxModernJdk/testsWithJava17/records/kt54573.kt | 10 ++++++++++ .../jvmRecord/explicitSuperConstructorCall.kt | 13 +++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ .../IrBlackBoxModernJdkCodegenTestGenerated.java | 6 ++++++ 9 files changed, 69 insertions(+) create mode 100644 compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt create mode 100644 compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 8fc68a71fe8..34784227c87 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -32309,6 +32309,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/disabledFeature.kt"); } + @Test + @TestMetadata("explicitSuperConstructorCall.kt") + public void testExplicitSuperConstructorCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt"); + } + @Test @TestMetadata("irrelevantFields.kt") public void testIrrelevantFields() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index aa653e18f7e..6b42eca6a63 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -32405,6 +32405,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/disabledFeature.kt"); } + @Test + @TestMetadata("explicitSuperConstructorCall.kt") + public void testExplicitSuperConstructorCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt"); + } + @Test @TestMetadata("irrelevantFields.kt") public void testIrrelevantFields() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 7c7797ea604..efab1d9eeb4 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -32309,6 +32309,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/disabledFeature.kt"); } + @Test + @TestMetadata("explicitSuperConstructorCall.kt") + public void testExplicitSuperConstructorCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt"); + } + @Test @TestMetadata("irrelevantFields.kt") public void testIrrelevantFields() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxModernJdkCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxModernJdkCodegenTestGenerated.java index 2f8646149f0..7fe063ada9c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxModernJdkCodegenTestGenerated.java @@ -364,6 +364,12 @@ public class FirBlackBoxModernJdkCodegenTestGenerated extends AbstractFirBlackBo runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/jvmRecordBinary.kt"); } + @Test + @TestMetadata("kt54573.kt") + public void testKt54573() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt"); + } + @Test @TestMetadata("propertiesOverrides.kt") public void testPropertiesOverrides() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JvmSupertypeUpdater.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JvmSupertypeUpdater.kt index 4120b776eb1..80f46b9e8be 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JvmSupertypeUpdater.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JvmSupertypeUpdater.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.java +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession @@ -15,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.hasAnnotationSafe import org.jetbrains.kotlin.fir.declarations.utils.isData import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.expressions.impl.FirLazyDelegatedConstructorCall import org.jetbrains.kotlin.fir.java.JvmSupertypeUpdater.DelegatedConstructorCallTransformer.Companion.recordType import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -80,6 +82,14 @@ class JvmSupertypeUpdater(private val session: FirSession) : PlatformSupertypeUp delegatedConstructorCall: FirDelegatedConstructorCall, data: ScopeSession ): FirStatement { + /* + * Here we need to update only implicit calls to Any() + * And such calls don't have a real source and can not be an lazy calls + */ + if ( + delegatedConstructorCall is FirLazyDelegatedConstructorCall || + delegatedConstructorCall.source?.kind != KtFakeSourceElementKind.DelegatingConstructorCall + ) return delegatedConstructorCall val constructedTypeRef = delegatedConstructorCall.constructedTypeRef if (constructedTypeRef is FirImplicitTypeRef || constructedTypeRef.coneTypeSafe()?.isAny == true) { delegatedConstructorCall.replaceConstructedTypeRef(constructedTypeRef.resolvedTypeFromPrototype(recordType)) diff --git a/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt b/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt new file mode 100644 index 00000000000..02011567e25 --- /dev/null +++ b/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt @@ -0,0 +1,10 @@ +// TARGET_BACKEND: JVM_IR +// ISSUE: KT-54573 +// WITH_STDLIB + +@JvmRecord +data class A constructor(val x: Int, val s: String) { + constructor(s: String) : this(s.length, s) +} + +fun box(): String = A("OK").s diff --git a/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt b/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt new file mode 100644 index 00000000000..6efbef347a9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt @@ -0,0 +1,13 @@ +// FIR_IDENTICAL +// SKIP_TXT +// ISSUE: KT-54573 +// JVM_TARGET: 17 + +@JvmRecord +data class A constructor(val x: Int, val s: String) { + constructor(x: Long, s: String) : super(x.toInt(), s) + constructor(x: Byte, s: String) : super(x.toInt(), s.unresolved()) + + constructor(s: String) : this(s.length, s) + constructor(s: CharSequence) : this(s.length, s.unresolved()) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index e6b69b252ab..9f80978c1b8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -32405,6 +32405,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/disabledFeature.kt"); } + @Test + @TestMetadata("explicitSuperConstructorCall.kt") + public void testExplicitSuperConstructorCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/explicitSuperConstructorCall.kt"); + } + @Test @TestMetadata("irrelevantFields.kt") public void testIrrelevantFields() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java index 3d8b2b0b020..71c40d14f82 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java @@ -364,6 +364,12 @@ public class IrBlackBoxModernJdkCodegenTestGenerated extends AbstractIrBlackBoxC runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/jvmRecordBinary.kt"); } + @Test + @TestMetadata("kt54573.kt") + public void testKt54573() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/kt54573.kt"); + } + @Test @TestMetadata("propertiesOverrides.kt") public void testPropertiesOverrides() throws Exception {