fun expression(expression: IrConst<*>) { when (val kind = expression.kind) { is Kind.Null -> kind.valueOf(expression) else -> {} } } sealed class Kind(val asString: String) { @Suppress("UNCHECKED_CAST") fun valueOf(aConst: IrConst<*>) = (aConst as IrConst).value object Null : Kind("Null") override fun toString() = asString } abstract class IrConst { abstract var kind: Kind abstract var value: T }