[FIR] Don't smartcast variables to invisible types

#KT-44802 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-02-18 11:19:08 +03:00
parent 026efca49f
commit 1c0d862e40
24 changed files with 521 additions and 17 deletions
@@ -0,0 +1,43 @@
FILE: smartcastToTypeParameter.kt
public abstract interface FirTypeScope : R|kotlin/Any| {
}
public abstract interface AbstractFirBasedSymbol<E : R|FirSymbolOwner<E>|, R|FirDeclaration|> : R|kotlin/Any| {
public abstract val fir: R|E|
public get(): R|E|
}
public abstract interface FirCallableSymbol<D : R|FirCallableDeclaration<D>|> : R|AbstractFirBasedSymbol<D>| {
}
public abstract interface FirElement : R|kotlin/Any| {
}
public abstract interface FirSymbolOwner<E : R|FirSymbolOwner<E>|, R|FirDeclaration|> : R|FirElement| {
public abstract val symbol: R|AbstractFirBasedSymbol<E>|
public get(): R|AbstractFirBasedSymbol<E>|
}
public abstract interface FirDeclaration : R|FirElement| {
}
public abstract interface FirCallableDeclaration<F : R|FirCallableDeclaration<F>|> : R|FirDeclaration|, R|FirSymbolOwner<F>| {
}
public abstract interface FirCallableMemberDeclaration<F : R|FirCallableMemberDeclaration<F>|> : R|FirCallableDeclaration<F>| {
}
private final inline fun <reified S : R|FirCallableSymbol<*>|> computeBaseSymbols(symbol: R|S|, basedSymbol: R|S|, directOverridden: R|FirTypeScope.(S) -> kotlin/collections/List<S>|): R|kotlin/Unit| {
}
public final fun R|FirCallableSymbol<*>|.dispatchReceiverClassOrNull(): R|kotlin/Boolean?| {
^dispatchReceiverClassOrNull Boolean(true)
}
private final inline fun <reified D : R|FirCallableMemberDeclaration<D>|, reified S : R|FirCallableSymbol<D>|> createFakeOverriddenIfNeeded(originalSymbol: R|FirCallableSymbol<*>|, basedSymbol: R|S|, computeDirectOverridden: R|FirTypeScope.(S) -> kotlin/collections/List<S>|, someCondition: R|kotlin/Boolean|): R|kotlin/Unit| {
when () {
(R|<local>/originalSymbol| !is R|S|) -> {
^createFakeOverriddenIfNeeded Unit
}
}
when () {
==(R|<local>/originalSymbol|.R|/dispatchReceiverClassOrNull|(), Boolean(true)) && R|<local>/someCondition| -> {
^createFakeOverriddenIfNeeded Unit
}
}
R|/computeBaseSymbols|<R|S|>(R|<local>/originalSymbol|, R|<local>/basedSymbol|, R|<local>/computeDirectOverridden|)
}
@@ -0,0 +1,34 @@
interface FirTypeScope
interface AbstractFirBasedSymbol<E> where E : FirSymbolOwner<E>, E : FirDeclaration {
val fir: E
}
interface FirCallableSymbol<D : FirCallableDeclaration<D>> : AbstractFirBasedSymbol<D>
interface FirElement
interface FirSymbolOwner<E> : FirElement where E : FirSymbolOwner<E>, E : FirDeclaration {
val symbol: AbstractFirBasedSymbol<E>
}
interface FirDeclaration : FirElement
interface FirCallableDeclaration<F : FirCallableDeclaration<F>> : FirDeclaration, FirSymbolOwner<F>
interface FirCallableMemberDeclaration<F : FirCallableMemberDeclaration<F>> : FirCallableDeclaration<F>
private inline fun <reified S : FirCallableSymbol<*>> computeBaseSymbols(
symbol: S,
basedSymbol: S,
directOverridden: FirTypeScope.(S) -> List<S>
) {}
fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): Boolean? = true
private inline fun <reified D : FirCallableMemberDeclaration<D>, reified S : FirCallableSymbol<D>> createFakeOverriddenIfNeeded(
originalSymbol: FirCallableSymbol<*>,
basedSymbol: S,
computeDirectOverridden: FirTypeScope.(S) -> List<S>,
someCondition: Boolean
) {
if (originalSymbol !is S) return
if (originalSymbol.dispatchReceiverClassOrNull() == true && someCondition) return
computeBaseSymbols(originalSymbol, basedSymbol, computeDirectOverridden)
}