[FIR] Filter out SAM constructors from MemberScopeTowerLevel

This tower level is for calls on a dispatch receiver, and it's not
allowed to call SAM constructors on a dispatch receiver.

#KT-60983 Fixed
This commit is contained in:
Kirill Rakhman
2023-10-24 14:27:02 +02:00
committed by Space Team
parent 576d8d1c10
commit 907ebb36d0
8 changed files with 151 additions and 5 deletions
@@ -29218,6 +29218,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/samConversions/kt50477.kt");
}
@Test
@TestMetadata("kt60983.kt")
public void testKt60983() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
}
@Test
@TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception {
@@ -29218,6 +29218,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/samConversions/kt50477.kt");
}
@Test
@TestMetadata("kt60983.kt")
public void testKt60983() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
}
@Test
@TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception {
@@ -29206,6 +29206,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/samConversions/kt50477.kt");
}
@Test
@TestMetadata("kt60983.kt")
public void testKt60983() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
}
@Test
@TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception {
@@ -29218,6 +29218,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/samConversions/kt50477.kt");
}
@Test
@TestMetadata("kt60983.kt")
public void testKt60983() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
}
@Test
@TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception {
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.ContextReceiverGroup
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -174,7 +171,10 @@ class MemberScopeTowerLevel(
empty = false
if (candidate.hasConsistentExtensionReceiver(givenExtensionReceiverOptions)) {
val fir = candidate.fir
if ((fir as? FirConstructor)?.isInner == false) {
// Calls on a dispatch receiver cannot be:
// - a constructor call unless it's an inner class
// - a SAM constructor call
if ((fir as? FirConstructor)?.isInner == false || fir.origin == FirDeclarationOrigin.SamConstructor) {
return@processScopeMembers
}
result += MemberWithBaseScope(candidate, this)
@@ -0,0 +1,58 @@
// MODULE: m1
// FILE: J.java
public class J {
public static class C {}
public class C2 {}
public interface I {
void x();
}
}
// FILE: test.kt
class K {
open class C
inner class C2
fun interface I {
fun x()
}
}
fun J.testJ() {
<!UNRESOLVED_REFERENCE!>C<!>()
C2()
<!UNRESOLVED_REFERENCE!>I<!> {}
}
fun testJ2(j: J) {
j.<!UNRESOLVED_REFERENCE!>C<!>()
j.C2()
j.<!UNRESOLVED_REFERENCE!>I<!> {}
}
fun K.testK() {
<!UNRESOLVED_REFERENCE!>C<!>()
C2()
<!UNRESOLVED_REFERENCE!>I<!> {}
}
fun testK2(k: K) {
k.<!UNRESOLVED_REFERENCE!>C<!>()
k.C2()
k.<!UNRESOLVED_REFERENCE!>I<!> {}
}
// MODULE: m2(m1)
// FILE: testResolutionContinues.kt
fun J.testResolutionContinues() {
acceptI(I {})
}
fun K.testResolutionContinues() {
acceptI(I {})
}
fun interface I {
fun x()
}
fun acceptI(i: I) {}
@@ -0,0 +1,58 @@
// MODULE: m1
// FILE: J.java
public class J {
public static class C {}
public class C2 {}
public interface I {
void x();
}
}
// FILE: test.kt
class K {
open class C
inner class C2
fun interface I {
fun x()
}
}
fun J.testJ() {
<!UNRESOLVED_REFERENCE!>C<!>()
C2()
<!UNRESOLVED_REFERENCE!>I<!> {}
}
fun testJ2(j: J) {
j.<!UNRESOLVED_REFERENCE!>C<!>()
j.C2()
j.<!RESOLUTION_TO_CLASSIFIER!>I<!> {}
}
fun K.testK() {
<!UNRESOLVED_REFERENCE!>C<!>()
C2()
<!UNRESOLVED_REFERENCE!>I<!> {}
}
fun testK2(k: K) {
k.<!UNRESOLVED_REFERENCE!>C<!>()
k.C2()
k.<!RESOLUTION_TO_CLASSIFIER!>I<!> {}
}
// MODULE: m2(m1)
// FILE: testResolutionContinues.kt
fun J.testResolutionContinues() {
acceptI(I {})
}
fun K.testResolutionContinues() {
acceptI(I {})
}
fun interface I {
fun x()
}
fun acceptI(i: I) {}
@@ -31152,6 +31152,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/samConversions/kt50477.kt");
}
@Test
@TestMetadata("kt60983.kt")
public void testKt60983() throws Exception {
runTest("compiler/testData/diagnostics/tests/samConversions/kt60983.kt");
}
@Test
@TestMetadata("OverloadPriority.kt")
public void testOverloadPriority() throws Exception {