From c28d8c6575b14245db220f02e5a660b5ed1c4f9c Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 10 Feb 2020 14:59:11 +0300 Subject: [PATCH] Don't iterate over all tasks in KotlinProjectNpmResolver (KT-36472) Iterating over all tasks triggered the tasks to configure even if that was not necessary. Filter the task collection by type instead. Issue #KT-36472 Fixed --- .../npm/resolver/KotlinProjectNpmResolver.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index a93576246ca..b5bf6822097 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.api.tasks.TaskCollection import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtensionOrNull @@ -16,6 +18,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution +import kotlin.reflect.KClass /** * See [KotlinNpmResolutionManager] for details about resolution process. @@ -112,9 +115,9 @@ internal class KotlinProjectNpmResolver( private set init { - projectNpmResolver.project.tasks.forEach { task -> - if (task.enabled && task is RequiresNpmDependencies) { - addTaskRequirements(task) + projectNpmResolver.project.tasks.implementing(RequiresNpmDependencies::class).forEach { task -> + if (task.enabled) { + addTaskRequirements(task as RequiresNpmDependencies) task.dependsOn(projectNpmResolver[task.compilation].packageJsonTaskHolder) task.dependsOn(projectNpmResolver.resolver.nodeJs.npmInstallTask) } @@ -135,4 +138,13 @@ internal class KotlinProjectNpmResolver( .add(task) } } -} \ No newline at end of file +} + +/** + * Filters a [TaskCollection] by type that is not a subtype of [Task] (for use with interfaces) + * + * TODO properly express within the type system? The result should be a TaskCollection + */ +private fun TaskCollection.implementing(kclass: KClass): TaskCollection = + @Suppress("UNCHECKED_CAST") + withType(kclass.java as Class) \ No newline at end of file