> On 27 Feb 2014, at 17:50, Adam Murdoch <adam.murd...@gradleware.com> wrote:
> 
> 
>> On 28 Feb 2014, at 11:58 am, Luke Daley <luke.da...@gradleware.com> wrote:
>> 
>> Hi,
>> 
>> Since we are now considering Groovy 2 for Gradle 2, I wanted to throw this 
>> into the conversation…
>> 
>> One of the great additions to Groovy 2.2 was implicit closure coercion for 
>> Single Abstract Method types. In 2.3 this gets better with closure param 
>> type inference. This means you can do the following…
>> 
>>  // Setup…
>> 
>>  interface Action<T> {
>>    void execute(T thing)
>>  }
>> 
>>  class Thing {
>>    String name
>>  }
>> 
>>  class ThingConfigurer {
>>    Thing thing
>>    void conf(Action<Thing> action) {
>>        action.execute(thing)
>>    }
>>  }
>> 
>>  def t = new Thing()
>>  def tc = new ThingConfigurer(thing: t)
>> 
>>  // The point…
>> 
>>  tc.conf {
>>      it.name = "foo"
>>  }
>> 
>>  assert t.name == "foo"
>> 
>> 
>> 
>> That is, closures are implicitly converted to types. This works if the SAM 
>> has a return type and even for multiple params (and generics are inferred).
>> 
>> This would be great for us because it means we don't have to generate 
>> overloads at runtime and IDEA at least understands these closure coercion 
>> rules really well where as it does not understand our runtime overloads. I 
>> say “would” because it doesn't quite match our pattern of making the param 
>> the delegate in the Action case.
>> 
>> I think we can still get some benefit out of this for other cases (e.g. 
>> Test#beforeTest), but I can't find any way to leverage this and avoid our 
>> runtime generated overloads because of the delegate issue. It's a shame.
>> 
>> The end result, is that we could potentially drop Closure from our API 
>> completely for Gradle 2 without forcing users to change their buildscripts. 
>> In the Closure usages that aren't actually used for configure-by-closure 
>> (e.g. Test#beforeTest) would could replace with real types.
> 
> It’s not just build scripts that use the API, it’s also compiled plugins 
> implemented in Java. Does the coercion also work for compiled plugins 
> implemented in Groovy 1.8 running under Groovy 2?

Yes. The coercion is at runtime.

> Let’s just use the regular deprecate-then-remove approach to remove these 
> methods. They don’t cause us much pain. We do want to get rid of them, 
> however.

It means it's harder to enforce Groovy not creeping into the public API because 
it means we have to joint compile the API.

Now I think about this though, we leak more than just Closure so it's a non 
starter regardless.

> 
> 
> --
> Adam Murdoch
> Gradle Co-founder
> http://www.gradle.org
> VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
> http://www.gradleware.com
> 
> 
> 

Reply via email to