From 2d7cadc0ab9878b9cbfe253508ec837454ef6e3a Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 25 Oct 2023 13:46:22 +0200 Subject: [PATCH] [FE, Java Resolve] Filter out canonical record constructors This fixes a false positive overload resolution ambiguity in FIR when invoking a record constructor when it also defines a canonical constructor (compact or explicit). #KT-62151 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/fir/java/FirJavaFacade.kt | 8 ++++++-- .../javaRecordWithCanonicalConstructor.kt | 19 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 7deb2409036..b7dd5e0fb37 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -34631,6 +34631,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/irrelevantFields.kt"); } + @Test + @TestMetadata("javaRecordWithCanonicalConstructor.kt") + public void testJavaRecordWithCanonicalConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt"); + } + @Test @TestMetadata("javaRecordWithExplicitComponent.kt") public void testJavaRecordWithExplicitComponent() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index ba70371ad4a..dc938e96ff0 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -34631,6 +34631,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/irrelevantFields.kt"); } + @Test + @TestMetadata("javaRecordWithCanonicalConstructor.kt") + public void testJavaRecordWithCanonicalConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt"); + } + @Test @TestMetadata("javaRecordWithExplicitComponent.kt") public void testJavaRecordWithExplicitComponent() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 3a11045160e..1ebd6f85001 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -34517,6 +34517,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/irrelevantFields.kt"); } + @Test + @TestMetadata("javaRecordWithCanonicalConstructor.kt") + public void testJavaRecordWithCanonicalConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt"); + } + @Test @TestMetadata("javaRecordWithExplicitComponent.kt") public void testJavaRecordWithExplicitComponent() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 9d1b4f4d85a..f0dba44b2aa 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -34631,6 +34631,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/irrelevantFields.kt"); } + @Test + @TestMetadata("javaRecordWithCanonicalConstructor.kt") + public void testJavaRecordWithCanonicalConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt"); + } + @Test @TestMetadata("javaRecordWithExplicitComponent.kt") public void testJavaRecordWithExplicitComponent() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 5cbcf07c409..8e3ce151d88 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.fir.java +import com.intellij.psi.PsiMethod import com.intellij.psi.impl.light.LightRecordCanonicalConstructor +import com.intellij.psi.util.JavaPsiRecordUtil import org.jetbrains.kotlin.* import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.descriptors.ClassKind @@ -449,7 +451,8 @@ abstract class FirJavaFacade( } /** - * It is possible that JavaClass already has a synthetic primary constructor ([LightRecordCanonicalConstructor]) + * It is possible that JavaClass already has a synthetic primary constructor ([LightRecordCanonicalConstructor]) or a + * canonical constructor ([JavaPsiRecordUtil.isCanonicalConstructor]). * Such behavior depends on a platform version and psi providers * (e.g., in IntelliJ plugin Java class can have additional declarations) */ @@ -649,7 +652,8 @@ abstract class FirJavaFacade( hasStableParameterNames = false } this.visibility = visibility - isPrimary = javaConstructor == null || source?.psi is LightRecordCanonicalConstructor + // TODO get rid of dependency on PSI KT-63046 + isPrimary = javaConstructor == null || source?.psi.let { it is PsiMethod && JavaPsiRecordUtil.isCanonicalConstructor(it) } returnTypeRef = buildResolvedTypeRef { type = ownerClassBuilder.buildSelfTypeRef() } diff --git a/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt b/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt new file mode 100644 index 00000000000..65be7dd0a19 --- /dev/null +++ b/compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt @@ -0,0 +1,19 @@ +// FIR_IDENTICAL + +// FILE: WithCompactCtor.java +public record WithCompactCtor(String s) { + public WithCompactCtor {} +} + +// FILE: WithExplicitCanonicalCtor.java +public record WithExplicitCanonicalCtor(String s) { + public WithExplicitCanonicalCtor(String s) { + this.s = s; + } +} + +// FILE: test.kt +fun test() { + WithCompactCtor("") + WithExplicitCanonicalCtor("") +} \ No newline at end of file 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 125bce0e1ea..ae9c89eb8e8 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 @@ -36565,6 +36565,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/irrelevantFields.kt"); } + @Test + @TestMetadata("javaRecordWithCanonicalConstructor.kt") + public void testJavaRecordWithCanonicalConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/testsWithJava17/jvmRecord/javaRecordWithCanonicalConstructor.kt"); + } + @Test @TestMetadata("javaRecordWithExplicitComponent.kt") public void testJavaRecordWithExplicitComponent() throws Exception {