// !WITH_NEW_INFERENCE // FILE: b.kt package foobar.a import java.* val a : java.util.List? = null val a2 : util.List? = null val a3 : LinkedList? = 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 x2 = foobar.a.a val y1 = foobar.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(iteratee : Iteratee) : O { var current = iteratee for (x in this) { val it = current.process(x) if (it.isDone) return it.result current = it } return current.done() } }