[FIR] Handle receiver types of extension methods when computing maximally specific types.
Test case (from testPrimitiveReceiver): fun Short.foo() = 3 fun Int.foo() = 4 1::foo
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
f7dc06a772
commit
a1e0e8b0e7
+3
-3
@@ -6,14 +6,14 @@ fun IB.extFun(x: IA) {}
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
val extFun1 = IA::extFun
|
val extFun1 = IA::extFun
|
||||||
val extFun2 = IB::extFun
|
val extFun2 = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testWithExpectedType() {
|
fun testWithExpectedType() {
|
||||||
// NB: should be resolved to kotlin/FunctionX, not kotlin/reflect/FunctionX
|
// NB: should be resolved to kotlin/FunctionX, not kotlin/reflect/FunctionX
|
||||||
val extFun_AB_A: IA.(IB) -> Unit = IA::extFun
|
val extFun_AB_A: IA.(IB) -> Unit = IA::extFun
|
||||||
val extFun_AA_B: IA.(IA) -> Unit = IB::extFun
|
val extFun_AA_B: IA.(IA) -> Unit = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
val extFun_BB_A: IB.(IB) -> Unit = IA::extFun
|
val extFun_BB_A: IB.(IB) -> Unit = IA::extFun
|
||||||
val extFun_BA_B: IB.(IA) -> Unit = IB::extFun
|
val extFun_BA_B: IB.(IA) -> Unit = IB::extFun
|
||||||
val extFun_BB_B: IB.(IB) -> Unit = IB::extFun
|
val extFun_BB_B: IB.(IB) -> Unit = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -9,12 +9,12 @@ FILE: moreSpecificAmbiguousExtensions.kt
|
|||||||
}
|
}
|
||||||
public final fun test(): R|kotlin/Unit| {
|
public final fun test(): R|kotlin/Unit| {
|
||||||
lval extFun1: R|kotlin/reflect/KFunction2<IA, IB, kotlin/Unit>| = Q|IA|::R|/extFun|
|
lval extFun1: R|kotlin/reflect/KFunction2<IA, IB, kotlin/Unit>| = Q|IA|::R|/extFun|
|
||||||
lval extFun2: R|kotlin/reflect/KFunction2<IB, IB, kotlin/Unit>| = Q|IB|::R|/extFun|
|
lval extFun2: <ERROR TYPE REF: No result type for initializer> = Q|IB|::<Unresolved reference: extFun>#
|
||||||
}
|
}
|
||||||
public final fun testWithExpectedType(): R|kotlin/Unit| {
|
public final fun testWithExpectedType(): R|kotlin/Unit| {
|
||||||
lval extFun_AB_A: R|IA.(IB) -> kotlin/Unit| = Q|IA|::R|/extFun|
|
lval extFun_AB_A: R|IA.(IB) -> kotlin/Unit| = Q|IA|::R|/extFun|
|
||||||
lval extFun_AA_B: R|IA.(IA) -> kotlin/Unit| = Q|IB|::R|/extFun|
|
lval extFun_AA_B: R|IA.(IA) -> kotlin/Unit| = Q|IB|::<Unresolved reference: extFun>#
|
||||||
lval extFun_BB_A: R|IB.(IB) -> kotlin/Unit| = Q|IA|::R|/extFun|
|
lval extFun_BB_A: R|IB.(IB) -> kotlin/Unit| = Q|IA|::R|/extFun|
|
||||||
lval extFun_BA_B: R|IB.(IA) -> kotlin/Unit| = Q|IB|::R|/extFun|
|
lval extFun_BA_B: R|IB.(IA) -> kotlin/Unit| = Q|IB|::R|/extFun|
|
||||||
lval extFun_BB_B: R|IB.(IB) -> kotlin/Unit| = Q|IB|::R|/extFun|
|
lval extFun_BB_B: R|IB.(IB) -> kotlin/Unit| = Q|IB|::<Unresolved reference: extFun>#
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -163,9 +163,9 @@ abstract class AbstractConeCallConflictResolver(
|
|||||||
call: Candidate,
|
call: Candidate,
|
||||||
function: FirFunction<*>
|
function: FirFunction<*>
|
||||||
): List<ConeKotlinType> {
|
): List<ConeKotlinType> {
|
||||||
return (call.resultingTypeForCallableReference?.typeArguments?.map { it as ConeKotlinType }
|
return listOfNotNull(function.receiverTypeRef?.coneTypeUnsafe()) +
|
||||||
?: (listOfNotNull(function.receiverTypeRef?.coneTypeUnsafe()) +
|
(call.resultingTypeForCallableReference?.typeArguments?.map { it as ConeKotlinType }
|
||||||
call.argumentMapping?.map { it.value.argumentType() }.orEmpty()))
|
?: call.argumentMapping?.map { it.value.argumentType() }.orEmpty())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createFlatSignature(call: Candidate, klass: FirClass<*>): FlatSignature<Candidate> {
|
private fun createFlatSignature(call: Candidate, klass: FirClass<*>): FlatSignature<Candidate> {
|
||||||
|
|||||||
Vendored
-1
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference
|
// !LANGUAGE: +NewInference
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
|
|
||||||
interface JsonParser
|
interface JsonParser
|
||||||
interface JsonCodingParser : JsonParser
|
interface JsonCodingParser : JsonParser
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
|
||||||
|
|
||||||
open class A
|
|
||||||
class B: A()
|
|
||||||
|
|
||||||
fun A.foo() {}
|
|
||||||
fun B.foo() {} // more specific
|
|
||||||
|
|
||||||
fun bar(a: Any) {}
|
|
||||||
fun bar(a: Int) {} // more specific
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
<!UNRESOLVED_REFERENCE!>B::foo<!>
|
|
||||||
::bar
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||||
|
|
||||||
open class A
|
open class A
|
||||||
|
|||||||
compiler/testData/diagnostics/tests/callableReference/resolve/moreSpecificAmbiguousExtensions.fir.kt
Vendored
+3
-3
@@ -9,13 +9,13 @@ fun IB.extFun(x: IA) {}
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
val extFun1 = IA::extFun
|
val extFun1 = IA::extFun
|
||||||
val extFun2 = IB::extFun
|
val extFun2 = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testWithExpectedType() {
|
fun testWithExpectedType() {
|
||||||
val extFun_AB_A: IA.(IB) -> Unit = IA::extFun
|
val extFun_AB_A: IA.(IB) -> Unit = IA::extFun
|
||||||
val extFun_AA_B: IA.(IA) -> Unit = IB::extFun
|
val extFun_AA_B: IA.(IA) -> Unit = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
val extFun_BB_A: IB.(IB) -> Unit = IA::extFun
|
val extFun_BB_A: IB.(IB) -> Unit = IA::extFun
|
||||||
val extFun_BA_B: IB.(IA) -> Unit = IB::extFun
|
val extFun_BA_B: IB.(IA) -> Unit = IB::extFun
|
||||||
val extFun_BB_B: IB.(IB) -> Unit = IB::extFun
|
val extFun_BB_B: IB.(IB) -> Unit = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
||||||
}
|
}
|
||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
// !CHECK_TYPE
|
|
||||||
|
|
||||||
interface IA
|
|
||||||
interface IB : IA
|
|
||||||
|
|
||||||
fun IA.extFun() {}
|
|
||||||
fun IB.extFun() {}
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
val extFun = <!UNRESOLVED_REFERENCE!>IB::extFun<!>
|
|
||||||
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><IB.() -> Unit>(extFun)
|
|
||||||
}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
|
|
||||||
interface IA
|
interface IA
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ fun fas() {}
|
|||||||
fun fas(i: Int = 1) {}
|
fun fas(i: Int = 1) {}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
<!UNRESOLVED_REFERENCE!>B::foo<!> // todo KT-9601 Chose maximally specific function in callable reference
|
B::foo // todo KT-9601 Chose maximally specific function in callable reference
|
||||||
|
|
||||||
B::bar checkType { _<KFunction1<B, Unit>>() }
|
B::bar checkType { _<KFunction1<B, Unit>>() }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user