| // 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" |
| } |