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
This commit is contained in:
Sergey Igushkin
2020-02-10 14:59:11 +03:00
parent 9e05c702ab
commit c28d8c6575
@@ -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)
}
}
}
}
/**
* 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<T & R>
*/
private fun <T : Task, R : Any> TaskCollection<T>.implementing(kclass: KClass<R>): TaskCollection<T> =
@Suppress("UNCHECKED_CAST")
withType(kclass.java as Class<T>)