Hi there, > On 17 Feb 2021, at 20:41, MG <mg...@arscreat.com> wrote: > Is telling the user that the Closure cannot be empty the only application for > this ?
Not quite; the particular application is a bit complicated and not worth to detail it here, but the gist is that my application offers a kind of API where in some cases an empty “onerror” closure bears a meaning “I don't care of errors if some happen”, and it would be nice if the core recognised that and did not log these errors either. Nevertheless, it's not a particularly good API, and I guess I'll think of a way to improve it somehow, which would also get rid of a need for the empty-closure-based hack, too :) > On 17/02/2021 19:51, Daniel Sun wrote: >> Groovy does not support checking empty closure at runtime AFAIK, but we >> could check and set some property to closure while compiling, then get the >> property at runtime. Probably not worth implementing Groovy-side; if I really need that, I can create an ASTT to do this at my side. Thanks a lot! OC > If yes, given that a user can easily pass a non-empty but non-meaningful > closure anyway I would question whether it is worth the effort. > > Cheers, > mg > > PS: Also wondering whether we could achieve the same thing through the > Closure return type, e.g.: > @Test > @Ignore > void closureFooTest() { > println closureFoo {} > println closureFoo { "abc" } > } > > def closureFoo(Closure<String> cls) { > return "the string is: ${cls()}" > } > Should imho fail to compile, since an empty Closure should have return type > void. > Currently it does compile and run though (under 2.5.x) , even with > @CompileStatic, since the empty closure implicitely returns null (imho one of > the few bad design decisions in Groovy (whether in closures or somewhere > else)), but at least IntelliJ marks it as invalid... > > > > On 17/02/2021 19:51, Daniel Sun wrote: >> Groovy does not support checking empty closure at runtime AFAIK, but we >> could check and set some property to closure while compiling, then get the >> property at runtime. It will be an new improvement, not sure if others like >> it or not. >> >> Cheers, >> Daniel Sun >> >> On 2021/02/17 15:06:47, OCsite <o...@ocs.cz> <mailto:o...@ocs.cz> wrote: >>> Hi there, >>> >>> is it possible to reliably recognise an empty closure, i.e., „{}“, >>> programmatically? >>> >>> def foo(Closure bar) { >>> if (?bar-is-empty?) throw new Exception('The closure cannot be empty!') >>> else bar() >>> } >>> foo { println "ok" } // OK >>> foo { 1 } // OK >>> foo { } // throws >>> >>> Thanks! >>> OC >