I'm not understanding how inlining a closure expression could help reduce the burden of saving state to a temporary variable and then restoring it after execution, unless there was some additional AST processing.
macro method take 2: class Foo { def bar() { push { field1 = value, field2 -> baz() } } } macro method take 1 -- I think this would have better IDE support: class Foo { def bar() { push (field1 = value, field2) { baz() } } } An alternative to the macro method would be a local transform. A variable declaration would allow an annotation. So maybe something like this could be a more general capture-restore: @CaptureRestore({ -> ... }) def (one, two) = [field1 = value, field2] // maybe "_" or something would prevent the need for typing temp var names. converts to def one = field1 def two = field2 one = value try { ... } finally { field1 = one field2 = two } This idea has the code to execute come before the state capture and update, which is not the best IMO. Especially if "..." represents a lot of code. To flip it, the closure could be assigned to something: @CaptureRestore({ field1 = value, field2 }) def ___ = { -> ... }