Support captured types in ConeTypeCompatibilityChecker

This commit is contained in:
Mikhail Glukhikh
2021-05-07 14:10:05 +03:00
parent df815a64cf
commit 05872fc6a8
6 changed files with 74 additions and 2 deletions
@@ -0,0 +1,30 @@
FILE: capturedTypeInEquality.kt
public abstract interface FirTargetElement : R|kotlin/Any| {
}
public abstract interface FirFunction<F : R|FirFunction<F>|> : R|FirTargetElement| {
}
public abstract interface FirPropertyAccessor : R|FirFunction<FirPropertyAccessor>| {
}
public abstract interface FirProperty : R|kotlin/Any| {
public abstract val getter: R|FirPropertyAccessor|
public get(): R|FirPropertyAccessor|
}
public abstract interface FirTarget<E : R|FirTargetElement|> : R|kotlin/Any| {
public abstract val labeledElement: R|E|
public get(): R|E|
}
public final fun foo(target: R|FirTarget<FirFunction<*>>|, property: R|FirProperty|): R|kotlin/Unit| {
lval functionTarget: R|FirFunction<*>| = R|<local>/target|.R|SubstitutionOverride</FirTarget.labeledElement: R|FirFunction<*>|>|
lval x: R|kotlin/Int?| = (R|<local>/functionTarget| as? R|FirFunction<CapturedType(*)>|)?.{ $subj$.R|kotlin/let|<R|FirFunction<*>|, R|kotlin/Int|>(<L> = let@fun <anonymous>(it: R|FirFunction<*>|): R|kotlin/Int| <inline=Inline, kind=EXACTLY_ONCE> {
when () {
===(R|<local>/property|.R|/FirProperty.getter|, R|<local>/functionTarget|) -> {
^@let Int(1)
}
}
^ Int(0)
}
) }
}
@@ -0,0 +1,23 @@
interface FirTargetElement
interface FirFunction<F : FirFunction<F>> : FirTargetElement
interface FirPropertyAccessor : FirFunction<FirPropertyAccessor>
interface FirProperty {
val getter: FirPropertyAccessor
}
interface FirTarget<E : FirTargetElement> {
val labeledElement: E
}
fun foo(target: FirTarget<FirFunction<*>>, property: FirProperty) {
val functionTarget = target.labeledElement
val x = (functionTarget as? FirFunction)?.let {
if (<!EQUALITY_NOT_APPLICABLE_WARNING!>property.getter === functionTarget<!>) {
return@let 1
}
0
}
}