In Gradle we have many APIs which take a `groovy.l...
# language-proposals
b
In Gradle we have many APIs which take a
groovy.lang.Closure
(which in Kotlin parlance would be similar to
T.() -> Unit
in how we use it), for compatibility with Java we also expose overloads taking an
Action<T>
SAM. Now we would like Kotlin build scripts to behave as if
Action<T>
was
T.() -> Unit
to avoid the need for explicitly qualifying the single argument with
it
. In other words, we would like users to be writing code like
copySpec { from(“src”) }
instead of
copySpec { it.from(“src”) }
. This could be made to work by either: 1. somehow annotating
Action<T>
in a way that would make the Kotlin compiler see it as equivalent to
T.() -> Unit
2. declaring suitable extensions that take a
T.() -> Unit
and simply delegate to the
Action<T>
members, this would require a mechanism to tell Kotlin that those extensions should take precedence over existing members I’m not aware of any mechanism to make Option 1 work. Option 2 on the other hand would be possible via
kotlin.internal.HidesMembers
(https://github.com/JetBrains/kotlin/blob/0d26087040b94acfff0434d1a12a2975ee8accd8/libraries/stdlib/src/kotlin/internal/Annotations.kt#L46) except that it is, well, internal. So currently it seems we’ll have to resort to [crafting a custom
gradle-script-kotlin-api.jar
with all offending
Action<T>
overloads removed](https://github.com/gradle/gradle-script-kotlin/issues/52) to be fed to the Kotlin compiler so that the
T.() -> Unit
extensions would actually take precedence. Thoughts?