// TARGET_BACKEND: JVM // MODULE: lib // WITH_RUNTIME // FILE: A.kt abstract class IrConst : IrExpression(), IrExpressionWithCopy { abstract val kind: IrConstKind abstract val value: T abstract override fun copy(): IrConst abstract fun copyWithOffsets(startOffset: Int, endOffset: Int): IrConst } sealed class IrConstKind(val asString: kotlin.String) { @Suppress("UNCHECKED_CAST") fun valueOf(aConst: IrConst<*>) = (aConst as IrConst).value object Null : IrConstKind("Null") object Boolean : IrConstKind("Boolean") object Char : IrConstKind("Char") object Byte : IrConstKind("Byte") object Short : IrConstKind("Short") object Int : IrConstKind("Int") object Long : IrConstKind("Long") object String : IrConstKind("String") object Float : IrConstKind("Float") object Double : IrConstKind("Double") override fun toString() = asString } interface IrType abstract class IrExpression : IrElementBase(), IrStatement, IrVarargElement, IrAttributeContainer { @Suppress("LeakingThis") override var attributeOwnerId: IrAttributeContainer = this abstract var type: IrType override fun transform(transformer: IrElementTransformer, data: D): IrExpression = accept(transformer, data) as IrExpression override fun acceptChildren(visitor: IrElementVisitor, data: D) { // No children by default } override fun transformChildren(transformer: IrElementTransformer, data: D) { // No children by default } } interface IrExpressionWithCopy { fun copy(): IrExpression } interface IrAttributeContainer : IrElement { var attributeOwnerId: IrAttributeContainer } abstract class IrElementBase : IrElement interface IrStatement : IrElement interface IrVarargElement : IrElement interface IrElement { val startOffset: Int val endOffset: Int fun accept(visitor: IrElementVisitor, data: D): R fun acceptChildren(visitor: IrElementVisitor, data: D): Unit fun transform(transformer: IrElementTransformer, data: D): IrElement = accept(transformer, data) fun transformChildren(transformer: IrElementTransformer, data: D): Unit } interface IrElementVisitor interface IrElementTransformer : IrElementVisitor // MODULE: main(lib) // WITH_RUNTIME // FILE: B.kt fun foo(cases: Collection>, exprTransformer: IrElementTransformer, context: Any) { cases.map { it.accept(exprTransformer, context) } } fun box(): String { return "OK" }