| interface B<T> { | |
| val bar: T | |
| } | |
| fun String.foo() = object : B<String> { | |
| override val bar: String = length.toString() | |
| } | |
| class C { | |
| fun String.extension() = this.length | |
| fun String.fooInClass() = object : B<String> { | |
| override val bar: String = extension().toString() | |
| } | |
| fun String.fooInClassNoReceiver() = object : B<String> { | |
| override val bar: String = "123".extension().toString() | |
| } | |
| fun fooInClass(s: String) = s.fooInClass().bar | |
| fun fooInClassNoReceiver(s: String) = s.fooInClassNoReceiver().bar | |
| } | |
| fun box(): String { | |
| var result = "Hello, world!".foo().bar | |
| if (result != "13") return "fail 1: $result" | |
| result = C().fooInClass("Hello, world!") | |
| if (result != "13") return "fail 2: $result" | |
| result = C().fooInClassNoReceiver("Hello, world!") | |
| if (result != "3") return "fail 3: $result" | |
| return "OK" | |
| } | |