interface FirElement { fun accept(visitor: FirVisitor, data: D): R fun accept(visitor: FirVisitorVoid) = accept(visitor, null) fun transform(visitor: FirTransformer, data: D): E } abstract class FirVisitor abstract class FirVisitorVoid : FirVisitor() abstract class FirTransformer : FirVisitor() interface FirAnnotationContainer : FirElement { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirStatement : FirAnnotationContainer { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirTypeParameterRefsOwner : FirElement { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirDeclaration : FirElement { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirAnnotatedDeclaration : FirDeclaration, FirAnnotationContainer { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirSymbolOwner : FirElement where E : FirSymbolOwner, E : FirDeclaration { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirClassLikeDeclaration> : FirAnnotatedDeclaration, FirStatement, FirSymbolOwner interface FirClass> : FirClassLikeDeclaration, FirStatement, FirTypeParameterRefsOwner private class FirApplySupertypesTransformer() : FirTransformer() fun > F.runSupertypeResolvePhaseForLocalClass(): F { val applySupertypesTransformer = FirApplySupertypesTransformer() return this.transform(applySupertypesTransformer, null) } abstract class FirPureAbstractElement : FirElement interface FirTypedDeclaration : FirAnnotatedDeclaration { abstract override fun accept(visitor: FirVisitor, data: D): R } interface FirCallableDeclaration> : FirTypedDeclaration, FirSymbolOwner { abstract override fun accept(visitor: FirVisitor, data: D): R } abstract class FirVariable> : FirPureAbstractElement(), FirCallableDeclaration, FirAnnotatedDeclaration, FirStatement { abstract override fun accept(visitor: FirVisitor, data: D): R } abstract class FirWhenExpression { abstract val subjectVariable: FirVariable<*>? } class FirRenderer : FirVisitorVoid() { fun foo(expression: FirWhenExpression) { val variable = expression.subjectVariable if (variable != null) { variable.accept(this) } } }