// FILE: b.kt package foobar.a import java.* val a : util.List? = null val a1 : List? = null // FILE: b.kt package foobar abstract class Foo() { abstract val x : T } // FILE: b.kt package foobar.a import java.util.* val b : List? = a val b1 : util.List? = a // FILE: b.kt package foobar val x1 = a.a val y1 = a.b ///////////////////////////////////////////////////////////////////////// fun done(result : O) : Iteratee = StrangeIterateeImpl(result) abstract class Iteratee { abstract fun process(item : I) : Iteratee abstract val isDone : Boolean abstract val result : O abstract fun done() : O } class StrangeIterateeImpl(val obj: O) : Iteratee() { override fun process(item: I): Iteratee = StrangeIterateeImpl(obj) override val isDone = true override val result = obj override fun done() = obj } abstract class Sum() : Iteratee() { override fun process(item : Int) : Iteratee { return foobar.done(item); } abstract override val isDone : Boolean abstract override val result : Int abstract override fun done() : Int } abstract class Collection : Iterable { fun iterate(var iteratee : Iteratee) : O { for (x in this) { val it = iteratee.process(x) if (it.isDone) return it.result iteratee = it } return iteratee.done() } }