# How to translate task keyword in DSL into groovy call?

**URL:** <https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243>\
**Category:** Old Forum Archive\
**Created:** [July 24, 2014, 9:28pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243 "2014-07-24T21:28:00Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Guojun\_Zhu](https://avatars.discourse-cdn.com/v4/letter/g/4491bb/32.png) [@Guojun\_Zhu](https://discuss.gradle.org/u/Guojun_Zhu)\
**Post date:** [July 24, 2014, 9:28pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/1 "2014-07-24T21:28:00Z")

</div>

I am a java programmer. I understand that most of the DSL magic happens with the groovy syntax sugar over java. I am trying to understand the one with task. For example

```gradle
task myTask (type:Tar, dependsOn anotherTask){
//clousre
}

```

How is this translated? I guess it first go to ‘Project.task(myTask)’, which gives you a Task object. But how to handle the next section ‘(type:Tar, dependsOn anotherTask)’?

---

<div class="post-metadata">

**Author:** ![Rene](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/rene/32/8082_2.png) [@Rene](https://discuss.gradle.org/u/Rene)\
**Post date:** [July 24, 2014, 11:48pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/2 "2014-07-24T23:48:00Z")

</div>

Hi, the snippet above is resolved to a method call

Project#task(“myTask”, type:Jar, dependsOn: anotherTask)

to get this working with the snippet above, AST transformation is used. See

[http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations](http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations) for more details

cheers, René

---

<div class="post-metadata">

**Author:** ![Guojun\_Zhu](https://avatars.discourse-cdn.com/v4/letter/g/4491bb/32.png) [@Guojun\_Zhu](https://discuss.gradle.org/u/Guojun_Zhu)\
**Post date:** [July 25, 2014, 2:14pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/3 "2014-07-25T14:14:00Z")

</div>

Thanks.

But here is the API info I found for Project:

```gradle
Task task(String name, Closure configureClosure)
  Task task(Map<String, ?> args, String name)
   Task task(Map<String, ?> args, String name, Closure configureClosure)

```

Which one fits this call?

---

<div class="post-metadata">

**Author:** ![Peter\_Niederwieser](https://avatars.discourse-cdn.com/v4/letter/p/9f8e36/32.png) [@Peter\_Niederwieser](https://discuss.gradle.org/u/Peter_Niederwieser)\
**Post date:** [July 25, 2014, 2:25pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/4 "2014-07-25T14:25:00Z")

</div>

The second one.

---

<div class="post-metadata">

**Author:** ![stigkj](https://avatars.discourse-cdn.com/v4/letter/s/aeb1de/32.png) [@stigkj](https://discuss.gradle.org/u/stigkj)\
**Post date:** [July 25, 2014, 4:10pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/5 "2014-07-25T16:10:00Z")

</div>

But what about the closure? Is it the second because the closure is empty?

---

<div class="post-metadata">

**Author:** ![Peter\_Niederwieser](https://avatars.discourse-cdn.com/v4/letter/p/9f8e36/32.png) [@Peter\_Niederwieser](https://discuss.gradle.org/u/Peter_Niederwieser)\
**Post date:** [July 25, 2014, 4:16pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/6 "2014-07-25T16:16:00Z")

</div>

My comment referred to Rene’s code. The original code corresponds to ‘Task task(Map\<String, ?\> args, String name, Closure configureClosure)’.

---

<div class="post-metadata">

**Author:** ![Guojun\_Zhu](https://avatars.discourse-cdn.com/v4/letter/g/4491bb/32.png) [@Guojun\_Zhu](https://discuss.gradle.org/u/Guojun_Zhu)\
**Post date:** [July 25, 2014, 4:55pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/7 "2014-07-25T16:55:00Z")

</div>

Why is that? Groovy can automatically guess the wrong order? Should my original one be ‘Task task(String name,Map args, Closure configureClosure)’ ?

---

<div class="post-metadata">

**Author:** ![Peter\_Niederwieser](https://avatars.discourse-cdn.com/v4/letter/p/9f8e36/32.png) [@Peter\_Niederwieser](https://discuss.gradle.org/u/Peter_Niederwieser)\
**Post date:** [July 25, 2014, 4:57pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/8 "2014-07-25T16:57:00Z")

</div>

It’s due to how named arguments work in Groovy. They are “collected” into a leading parameter of type ‘Map’ at compile time.

---

<div class="post-metadata">

**Author:** ![Guojun\_Zhu](https://avatars.discourse-cdn.com/v4/letter/g/4491bb/32.png) [@Guojun\_Zhu](https://discuss.gradle.org/u/Guojun_Zhu)\
**Post date:** [July 25, 2014, 5:12pm UTC](https://discuss.gradle.org/t/how-to-translate-task-keyword-in-dsl-into-groovy-call/7243/9 "2014-07-25T17:12:00Z")

</div>

Thank you very much. I read this post [http://mrhaki.blogspot.de/2009/09/groovy-goodness-named-parameters-are.html](http://mrhaki.blogspot.de/2009/09/groovy-goodness-named-parameters-are.html) and now I understand. Very interesting. So in principle, I can have code like the following?

```gradle
task type:Tar myTask dependsOn:anotherTask {
//clousre
}

```

Cool!
