| abstract class AbstractFirBasedSymbol<E> where E : FirDeclaration, E : FirSymbolOwner<E> { |
| lateinit var fir: E |
| get |
| set |
| |
| constructor() /* primary */ { |
| super/*Any*/() |
| /* <init>() */ |
| |
| } |
| |
| } |
| |
| class Candidate { |
| val symbol: AbstractFirBasedSymbol<*> |
| field = symbol |
| get |
| |
| constructor(symbol: AbstractFirBasedSymbol<*>) /* primary */ { |
| super/*Any*/() |
| /* <init>() */ |
| |
| } |
| |
| } |
| |
| interface FirCallableMemberDeclaration<F : FirCallableMemberDeclaration<F>> : FirDeclaration, FirSymbolOwner<F> { |
| abstract override val symbol: AbstractFirBasedSymbol<F> |
| abstract override get |
| |
| } |
| |
| interface FirDeclaration { |
| } |
| |
| interface FirSymbolOwner<E> where E : FirDeclaration, E : FirSymbolOwner<E> { |
| abstract val symbol: AbstractFirBasedSymbol<E> |
| abstract get |
| |
| } |
| |
| fun foo(candidate: Candidate) { |
| val me: Any = candidate.<get-symbol>().<get-fir>() |
| when { |
| when { |
| me is FirCallableMemberDeclaration<*> -> EQEQ(arg0 = me /*as FirCallableMemberDeclaration<*> */.<get-symbol>(), arg1 = null).not() |
| else -> false |
| } -> { // BLOCK |
| } |
| } |
| } |
| |