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