diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/frameworkSupport/buildscript/AbstractGradleBuildScriptBuilder.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/frameworkSupport/buildscript/AbstractGradleBuildScriptBuilder.kt index 72d36000a856..3fe4d3d56a71 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/frameworkSupport/buildscript/AbstractGradleBuildScriptBuilder.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/frameworkSupport/buildscript/AbstractGradleBuildScriptBuilder.kt @@ -2,6 +2,7 @@ package org.jetbrains.plugins.gradle.frameworkSupport.buildscript import com.intellij.gradle.toolingExtension.util.GradleVersionSpecificsUtil +import com.intellij.gradle.toolingExtension.util.GradleVersionSpecificsUtil.isKotlinNamedAccessorsForCollectionsSupported import com.intellij.gradle.toolingExtension.util.GradleVersionUtil import com.intellij.openapi.util.text.StringUtil import org.gradle.util.GradleVersion @@ -68,7 +69,14 @@ abstract class AbstractGradleBuildScriptBuilder call("tasks.named", argument(name), argument(code(type)), argument(block)) } GradleDsl.KOTLIN -> when (name in PREDEFINED_TASKS) { - true -> call("tasks.$name", argument(block)) + true -> { + if (isKotlinNamedAccessorsForCollectionsSupported(gradleVersion)) { + call("tasks.$name", argument(block)) + } + else { + call("tasks.named<$type>", argument(name), argument(block)) + } + } else -> call("tasks.named<$type>", argument(name), argument(block)) } } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/frameworkSupport/GradleBuildScriptBuilderTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/frameworkSupport/GradleBuildScriptBuilderTest.kt index 61aec4fed13e..e2b3ad450b4f 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/frameworkSupport/GradleBuildScriptBuilderTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/frameworkSupport/GradleBuildScriptBuilderTest.kt @@ -395,7 +395,7 @@ class GradleBuildScriptBuilderTest : GradleBuildScriptBuilderTestCase() { testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junit5") } - tasks.test { + tasks.named("test") { useJUnitPlatform() } """.trimIndent()), @@ -538,15 +538,26 @@ class GradleBuildScriptBuilderTest : GradleBuildScriptBuilderTestCase() { @Test fun `test predefined task configuration`() { - assertBuildScript(""" + assertBuildScript( + GradleVersion.version("4.6") to (""" |test { | myConfiguration() |} - """.trimMargin(), """ + """.trimMargin() to """ + |tasks.named("test") { + | myConfiguration() + |} + """.trimMargin()), + GradleVersion.version("5.0") to (""" + |test { + | myConfiguration() + |} + """.trimMargin() to """ |tasks.test { | myConfiguration() |} - """.trimMargin()) { + """.trimMargin()) + ) { configureTask("test", "Test") { call("myConfiguration") } diff --git a/plugins/gradle/tooling-extension-api/src/com/intellij/gradle/toolingExtension/util/GradleVersionSpecificsUtil.kt b/plugins/gradle/tooling-extension-api/src/com/intellij/gradle/toolingExtension/util/GradleVersionSpecificsUtil.kt index 523f3e3ebc44..5ae11a52a77a 100644 --- a/plugins/gradle/tooling-extension-api/src/com/intellij/gradle/toolingExtension/util/GradleVersionSpecificsUtil.kt +++ b/plugins/gradle/tooling-extension-api/src/com/intellij/gradle/toolingExtension/util/GradleVersionSpecificsUtil.kt @@ -37,6 +37,14 @@ object GradleVersionSpecificsUtil { fun isPluginExtensionSupported(gradleVersion: GradleVersion): Boolean = GradleVersionUtil.isGradleAtLeast(gradleVersion, "4.10") + /** + * This feature of kotlin-dsl was introduced in 1.0-RC12 which is bundled starting from Gradle 5.0. + * https://github.com/gradle/kotlin-dsl-samples/issues/879 + */ + @JvmStatic + fun isKotlinNamedAccessorsForCollectionsSupported(gradleVersion: GradleVersion): Boolean = + GradleVersionUtil.isGradleAtLeast(gradleVersion, "5.0") + @JvmStatic fun isKotlinPropertyAssignmentSupported(gradleVersion: GradleVersion): Boolean = GradleVersionUtil.isGradleAtLeast(gradleVersion, "8.6")