Support captured types in ConeTypeCompatibilityChecker
This commit is contained in:
Vendored
+30
@@ -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)
|
||||
}
|
||||
) }
|
||||
}
|
||||
+23
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user