[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:
committed by
Space Team
parent
3327bed5bd
commit
2d7cadc0ab
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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()
|
||||
}
|
||||
|
||||
Vendored
+19
@@ -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("")
|
||||
}
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user