| // TARGET_BACKEND: JVM | |
| // LAMBDAS: CLASS | |
| // WITH_STDLIB | |
| package test | |
| class C { | |
| val f by foo { | |
| {} | |
| } | |
| } | |
| fun foo(f: () -> Any): Any = f() | |
| operator fun Any.getValue(thiz: Any?, metadata: Any?): Any = this | |
| fun box(): String { | |
| // This is the class for lambda inside the `foo` call (`{}`) | |
| val innerLambda = C().f.javaClass | |
| val emInner = innerLambda.getEnclosingMethod() | |
| if (emInner?.getName() != "invoke") return "Fail: incorrect enclosing method for inner lambda: $emInner" | |
| val ecInner = innerLambda.getEnclosingClass() | |
| if (ecInner?.getName() != "test.C\$f\$2") return "Fail: incorrect enclosing class for inner lambda: $ecInner" | |
| val ectorInner = innerLambda.getEnclosingConstructor() | |
| if (ectorInner != null) return "Fail: inner lambda should not have enclosing constructor: $ectorInner" | |
| val dcInner = innerLambda.getDeclaringClass() | |
| if (dcInner != null) return "Fail: inner lambda should not have declaring class: $dcInner" | |
| // This is the class for lambda that is passed as an argument to `foo` | |
| val outerLambda = ecInner | |
| val emOuter = outerLambda.getEnclosingMethod() | |
| if (emOuter != null) return "Fail: outer lambda should not have enclosing method: $emOuter" | |
| val ecOuter = outerLambda.getEnclosingClass() | |
| if (ecOuter?.getName() != "test.C") return "Fail: incorrect enclosing class for outer lambda: $ecOuter" | |
| val ectorOuter = outerLambda.getEnclosingConstructor() | |
| if (ectorOuter == null) return "Fail: outer lambda _should_ have enclosing constructor" | |
| val dcOuter = outerLambda.getDeclaringClass() | |
| if (dcOuter != null) return "Fail: outer lambda should not have declaring class: $dcOuter" | |
| return "OK" | |
| } |