tldr: I don't see how Gradle's Kotlin DSL for defining tasks is valid Kotlin and I need references to official Kotlin docs that can explain it

The longer version

我正在阅读OpenAPI的Gradle Generator的文档,试图理解API,发现了this bit in the docs个:

// Define a task for validating one specification
task validateGoodSpec(type: org.openapitools.generator.gradle.plugin.tasks.ValidateTask) {
    inputSpec.set("$rootDir/petstore-v3.0.yaml")
}

除了这不像how you register tasks in the official Gradle docs这一点之外,这看起来几乎像一个普通的函数定义(如果有人将task替换为`Fun),但我不记得在任何"普通的"Kotlin代码中遇到过这样的语法.我知道这是Gradle DSL,但我仍然认为它应该是有效的Kotlin.这种假设是错误的吗?

Stuffing the example into IntelliJ, it could not resolve this code to the right overloaded signature of the task function, which was a bit strange ...: failing explanation from intellij

然后我tried asking ChatGPT把Kotlin代码"翻译"成纯Java.我认为这是幻觉,因为它突然增加了一个额外的Class<T>参数,但经过一些清理,我认为结果应该是这样的,

task<ValidateTask>("validateGoodSpec") {
    outputs.upToDateWhen {
        false;
    }
    // etc ....
}

至少,这是我理解如何工作并符合现有函数签名的代码:

public open fun task(name: kotlin.String, configureAction: org.gradle.api.Action<in org.gradle.api.Task>): org.gradle.api.Task`

不过,我不知道Kotlin编译器如何神奇地将task validateGoodSpec(someAction)变成task("validateGoodSpec", someAction)

推荐答案

正如 comments 中已经指出的,您展示的代码不是Kotlin DSL,而是Gradle的Groovy DSL.所以,是的,这个语法不是有效的Kotlin,也没有真正的奥秘:)

话虽如此,有时甚至在Kotlin DSL中也会发生奇怪的事情.Gradle构建脚本的Kotlin代码编译时有一些扭曲.例如,Gradle 8.2中使用=而不是.set(...)的属性赋值语法依赖于编译器插件(参见their blog post).所以小心那些!

Kotlin相关问答推荐

Kotlin是否针对范围和进度优化sum()?

可选的.在kotlin中不使用泛型参数

Spring Boot kotlin协程不能并行运行

在构造函数中创建内部类实例时,只能使用包含类的接收器调用内部类的构造函数

为什么使用 return instance ?: synchronized(this) { instance ?: PreferenceParameterState(context) } 时无法获得单例?

当 func 重载时,kotlin 如何确定调用哪个 func?

通用接口继承

在 Kotlin 协程中切换 IO 和 UI 的正确方法是什么?

如何限制 Kotlin 中的枚举?

Kotlin spring boot @RequestBody 验证未触发

如何在 kotlin 中通过反射设置委托属性值?

Hilt Activity 必须附加到 @AndroidEntryPoint 应用程序

将协同路由调用放在存储库或ViewModel中哪个更好?

Kotlin get字段注释始终为空

Kapt不适用于Android Studio 3.0中的AutoValue

创建Spring和#180的实例;Kotlin中的参数化类型引用

如何在Kotlin中获得KType?

如何为 Java 调用者声明返回类型为void的 Kotlin Lambda?

比较Kotlin的NaN

Kotlin中对象和数据类的区别是什么?