From 46be588f2783631c75bd55218db965391eaeb779 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 17 Jun 2020 17:37:47 +0300 Subject: [PATCH] [Gradle, JS] Add task for separate usage of Dukat with project npm dependencies #KT-38331 fixed --- .../targets/js/dukat/AbstractDukatTask.kt | 31 ++++++++++++++++--- .../gradle/targets/js/dukat/DtsResolver.kt | 7 +++-- .../dukat/DukatCompilationResolverPlugin.kt | 23 +++++++++----- .../{DukatTask.kt => IntegratedDukatTask.kt} | 25 +++------------ .../targets/js/dukat/SeparateDukatTask.kt | 25 +++++++++++++++ 5 files changed, 78 insertions(+), 33 deletions(-) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/{DukatTask.kt => IntegratedDukatTask.kt} (52%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/AbstractDukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/AbstractDukatTask.kt index 76dfea79480..bc1a50f32aa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/AbstractDukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/AbstractDukatTask.kt @@ -17,7 +17,8 @@ abstract class AbstractDukatTask( @Internal override val compilation: KotlinJsCompilation ) : AbstractTask(), RequiresNpmDependencies { - private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject) + @get:Internal + protected val nodeJs = NodeJsRootPlugin.apply(project.rootProject) @get:Internal override val nodeModulesRequired: Boolean @@ -27,6 +28,16 @@ abstract class AbstractDukatTask( override val requiredNpmDependencies: Set get() = setOf(nodeJs.versions.dukat) + @get:Internal + val dts by lazy { + val resolvedCompilation = nodeJs.npmResolutionManager.requireInstalled()[project][compilation] + val dtsResolver = DtsResolver(resolvedCompilation.npmProject) + dtsResolver.getAllDts( + resolvedCompilation.externalNpmDependencies, + considerGeneratingFlag + ) + } + /** * Package name for the generated file (by default filename.d.ts renamed to filename.d.kt) */ @@ -38,13 +49,21 @@ abstract class AbstractDukatTask( * Collection of d.ts files */ @get:Internal - abstract val dTsFiles: List + val dTsFiles: List + get() = dts.map { it.file } + + @get:Input + val inputs + get() = dts.map { it.inputKey } /** * Destination directory for files with converted declarations */ @get:OutputDirectory - abstract val destDir: File + abstract var destDir: File + + @get:Internal + internal abstract val considerGeneratingFlag: Boolean @get:Internal val operation: String = "Generating Kotlin/JS external declarations" @@ -53,6 +72,8 @@ abstract class AbstractDukatTask( open fun run() { nodeJs.npmResolutionManager.checkRequiredDependencies(this) + destDir.deleteRecursively() + DukatRunner( compilation, dTsFiles, @@ -62,4 +83,6 @@ abstract class AbstractDukatTask( operation ).execute() } -} \ No newline at end of file +} + +internal const val DUKAT_TASK_GROUP = "Dukat" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DtsResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DtsResolver.kt index 06b00221c9c..0cddb053f96 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DtsResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DtsResolver.kt @@ -18,10 +18,13 @@ class DtsResolver(val npmProject: NpmProject) { indexFileSuffixes = listOf(".d.ts") ) - fun getAllDts(externalNpmDependencies: Collection): List { + fun getAllDts( + externalNpmDependencies: Collection, + considerGeneratingFlag: Boolean = true + ): List { return externalNpmDependencies .asSequence() - .filter { it.generateExternals } + .filter { !considerGeneratingFlag || it.generateExternals } .filter { it.scope == NORMAL || it.scope == OPTIONAL } .mapNotNullTo(mutableSetOf()) { typeModules.resolve(it.key)?.let { file -> Dts(file.canonicalFile, it) } } .sortedBy { it.inputKey } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt index cf12ddef0d6..71ea9565251 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName -import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.CompilationResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution @@ -20,21 +19,31 @@ internal class DukatCompilationResolverPlugin( val nodeJs get() = resolver.nodeJs val npmProject get() = resolver.npmProject val compilation get() = npmProject.compilation - val taskName = npmProject.compilation.disambiguateName("generateExternals") + val integratedTaskName = npmProject.compilation.disambiguateName("generateExternalsIntegrated") + val separateTaskName = npmProject.compilation.disambiguateName("generateExternals") init { compilation.defaultSourceSet.kotlin.srcDir(npmProject.externalsDir) - val task = project.registerTask( - taskName, + val integratedTask = project.registerTask( + integratedTaskName, listOf(compilation) ) { - it.group = NodeJsRootPlugin.TASKS_GROUP_NAME - it.description = "Generate Kotlin/JS external declarations for .d.ts files in ${compilation}" + it.group = DUKAT_TASK_GROUP + it.description = "Integrated generation Kotlin/JS external declarations for .d.ts files in ${compilation}" it.dependsOn(nodeJs.npmInstallTask, npmProject.packageJsonTask) } - compilation.compileKotlinTask.dependsOn(task) + compilation.compileKotlinTask.dependsOn(integratedTask) + + project.registerTask( + separateTaskName, + listOf(compilation) + ) { + it.group = DUKAT_TASK_GROUP + it.description = "Generate Kotlin/JS external declarations for .d.ts files of all NPM dependencies in ${compilation}" + it.dependsOn(nodeJs.npmInstallTask, npmProject.packageJsonTask) + } } override fun hookDependencies( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt similarity index 52% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt index 2e955890b40..342380cef9f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt @@ -5,12 +5,10 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputDirectory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation -import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject +import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject @@ -19,26 +17,13 @@ open class DukatTask constructor( compilation: KotlinJsCompilation ) : AbstractDukatTask(compilation) { - private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject) - @get:Internal - val dts by lazy { - val resolvedCompilation = nodeJs.npmResolutionManager.requireInstalled()[project][compilation] - val dtsResolver = DtsResolver(resolvedCompilation.npmProject) - dtsResolver.getAllDts(resolvedCompilation.externalNpmDependencies) - } - - @get:Internal - override val dTsFiles: List - get() = dts.map { it.file } - - @get:Input - val inputs - get() = dts.map { it.inputKey } + override val considerGeneratingFlag: Boolean = true @get:OutputDirectory - override val destDir: File - get() = compilation.npmProject.externalsDir + override var destDir: File by property { + compilation.npmProject.externalsDir + } private val executor by lazy { DukatExecutor(nodeJs, dts, compilation.npmProject, true, compareInputs = false) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt new file mode 100644 index 00000000000..5c2d28961d2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.dukat + +import org.gradle.api.tasks.OutputDirectory +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.utils.property +import java.io.File +import javax.inject.Inject + +open class SeparateDukatTask +@Inject +constructor( + compilation: KotlinJsCompilation +) : AbstractDukatTask(compilation) { + override val considerGeneratingFlag: Boolean = false + + @get:OutputDirectory + override var destDir: File by property { + project.projectDir.resolve("externals") + } +} \ No newline at end of file