[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
This commit is contained in:
Kirill Rakhman
2023-10-25 13:46:22 +02:00
committed by Space Team
parent 3327bed5bd
commit 2d7cadc0ab
7 changed files with 55 additions and 2 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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()
}
@@ -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("")
}
@@ -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 {