From 0a86beeb64b2728aedd75597262a08dfb5bb1411 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 6 Oct 2020 14:21:42 +0300 Subject: [PATCH] [Gradle, JS] Add descriptors to dependencies in configurations phase - Add file collection dependencies to gradle node module building ^KT-42339 fixed --- .../dukat/DukatCompilationResolverPlugin.kt | 31 ++++++++++++- .../gradle/targets/js/dukat/DukatExecutor.kt | 23 +--------- .../js/npm/AbstractNodeModulesCache.kt | 8 ++-- .../js/npm/CompositeNodeModuleBuilder.kt | 1 - .../js/npm/CompositeNodeModulesCache.kt | 6 +-- .../targets/js/npm/GradleNodeModuleBuilder.kt | 8 ++-- .../targets/js/npm/GradleNodeModulesCache.kt | 5 ++- .../npm/plugins/CompilationResolverPlugin.kt | 4 +- .../resolver/KotlinCompilationNpmResolver.kt | 43 ++++++++++++++++--- 9 files changed, 85 insertions(+), 44 deletions(-) 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 c37e91c25e0..f90491486ab 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 @@ -5,10 +5,13 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat +import org.gradle.api.artifacts.FileCollectionDependency import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.npm.isCompatibleArchive import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.CompilationResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver @@ -28,6 +31,8 @@ internal class DukatCompilationResolverPlugin( init { val dukatMode = compilation.dukatMode + gradleModelPostProcess(dukatMode, npmProject) + val integratedTask = project.registerTask( integratedTaskName, listOf(compilation) @@ -66,7 +71,8 @@ internal class DukatCompilationResolverPlugin( internalDependencies: Set, internalCompositeDependencies: Set, externalGradleDependencies: Set, - externalNpmDependencies: Set + externalNpmDependencies: Set, + fileCollectionDependencies: Set ) { if (nodeJs.experimental.discoverTypes) { // todo: discoverTypes @@ -93,4 +99,27 @@ internal class DukatCompilationResolverPlugin( companion object { const val VERSION = "2" } +} + +internal fun gradleModelPostProcess( + dukatMode: DukatMode, + npmProject: NpmProject +) { + val compilation = npmProject.compilation + val project = npmProject.project + when (dukatMode) { + DukatMode.SOURCE -> compilation.defaultSourceSet.kotlin.srcDir(npmProject.externalsDir) + DukatMode.BINARY -> { + npmProject.externalsDir + .listFiles() + ?.filter { it.isCompatibleArchive } + ?.forEach { + project.dependencies.add( + compilation.compileDependencyConfigurationName, + project.files(it) + ) + } + + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatExecutor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatExecutor.kt index cec03043954..41c0da157e5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatExecutor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatExecutor.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject -import org.jetbrains.kotlin.gradle.targets.js.npm.isCompatibleArchive class DukatExecutor( val nodeJs: NodeJsRootExtension, @@ -61,26 +60,6 @@ class DukatExecutor( versionFile.writeText(version) - gradleModelPostProcess() - } - - private fun gradleModelPostProcess() { - val compilation = npmProject.compilation - val project = npmProject.project - when (dukatMode) { - DukatMode.SOURCE -> compilation.defaultSourceSet.kotlin.srcDir(npmProject.externalsDir) - DukatMode.BINARY -> { - npmProject.externalsDir - .listFiles() - ?.filter { it.isCompatibleArchive } - ?.forEach { - project.dependencies.add( - compilation.compileDependencyConfigurationName, - project.files(it) - ) - } - - } - } + gradleModelPostProcess(dukatMode, npmProject) } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt index 9f5c685a3d8..d599aa7b047 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt @@ -26,16 +26,18 @@ internal abstract class AbstractNodeModulesCache(val nodeJs: NodeJsRootExtension @Synchronized fun get( - dependency: ResolvedDependency, + name: String, + version: String, file: File ): GradleNodeModule? = cache.getOrCompute(file) { - buildImportedPackage(dependency, file) + buildImportedPackage(name, version, file) }?.let { GradleNodeModule(it) } abstract fun buildImportedPackage( - dependency: ResolvedDependency, + name: String, + version: String, file: File ): File? diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt index bb4242b77d6..ab2067a4261 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt @@ -14,7 +14,6 @@ import java.io.File */ internal class CompositeNodeModuleBuilder( val project: Project, - val dependency: ResolvedDependency, val srcDir: File, val cache: CompositeNodeModulesCache ) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt index d19d223e5b7..f95681dd59a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm -import org.gradle.api.artifacts.ResolvedDependency import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import java.io.File @@ -14,10 +13,11 @@ import java.io.File */ internal class CompositeNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) { override fun buildImportedPackage( - dependency: ResolvedDependency, + name: String, + version: String, file: File ): File? { - val module = CompositeNodeModuleBuilder(project, dependency, file, this) + val module = CompositeNodeModuleBuilder(project, file, this) return module.rebuild() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt index 0d9c3d2a320..2fa2385c8d5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import org.gradle.api.Project -import org.gradle.api.artifacts.ResolvedDependency import org.jetbrains.kotlin.gradle.targets.js.JS import org.jetbrains.kotlin.gradle.targets.js.JS_MAP import org.jetbrains.kotlin.gradle.targets.js.META_JS @@ -18,7 +17,8 @@ import java.io.File */ internal class GradleNodeModuleBuilder( val project: Project, - val dependency: ResolvedDependency, + val moduleName: String, + val moduleVersion: String, val srcFiles: Collection, val cache: GradleNodeModulesCache ) { @@ -45,8 +45,8 @@ internal class GradleNodeModuleBuilder( val packageJson = fromSrcPackageJson(srcPackageJsonFile)?.apply { // Gson set nulls reflectively no matter on default values and non-null types @Suppress("USELESS_ELVIS") - version = version ?: dependency.moduleVersion - } ?: PackageJson(dependency.moduleName, dependency.moduleVersion) + version = version ?: moduleVersion + } ?: PackageJson(moduleName, moduleVersion) val metaFiles = files.filter { it.name.endsWith(".$META_JS") } if (metaFiles.size == 1) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt index 6a792af4dae..410e19df075 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt @@ -14,10 +14,11 @@ import java.io.File */ internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) { override fun buildImportedPackage( - dependency: ResolvedDependency, + name: String, + version: String, file: File ): File? { - val module = GradleNodeModuleBuilder(project, dependency, listOf(file), this) + val module = GradleNodeModuleBuilder(project, name, version, listOf(file), this) module.visitArtifacts() return module.rebuild() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt index c9678fe127a..00f2aafa9aa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.plugins +import org.gradle.api.artifacts.FileCollectionDependency import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver @@ -13,6 +14,7 @@ internal interface CompilationResolverPlugin { internalDependencies: Set, internalCompositeDependencies: Set, externalGradleDependencies: Set, - externalNpmDependencies: Set + externalNpmDependencies: Set, + fileCollectionDependencies: Set ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index b5813f68767..234a21ab616 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.FileCollectionDependency import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.artifacts.component.ProjectComponentIdentifier @@ -149,6 +150,16 @@ internal class KotlinCompilationNpmResolver( // We don't have `kotlin-js-test-runner` in NPM yet all.dependencies.add(nodeJs.versions.kotlinJsTestRunner.createDependency(project)) + npmProject.externalsDir + .listFiles() + ?.filter { it.isCompatibleArchive } + ?.forEach { + project.dependencies.add( + all.name, + project.files(it) + ) + } + return all } @@ -167,6 +178,7 @@ internal class KotlinCompilationNpmResolver( private val internalCompositeDependencies = mutableSetOf() private val externalGradleDependencies = mutableSetOf() private val externalNpmDependencies = mutableSetOf() + private val fileCollectionDependencies = mutableSetOf() fun visit(configuration: Configuration) { configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { @@ -176,6 +188,7 @@ internal class KotlinCompilationNpmResolver( configuration.allDependencies.forEach { dependency -> when (dependency) { is NpmDependency -> externalNpmDependencies.add(dependency) + is FileCollectionDependency -> fileCollectionDependencies.add(dependency) } } @@ -201,7 +214,8 @@ internal class KotlinCompilationNpmResolver( internalDependencies, internalCompositeDependencies, externalGradleDependencies, - externalNpmDependencies + externalNpmDependencies, + fileCollectionDependencies ) } } @@ -277,7 +291,8 @@ internal class KotlinCompilationNpmResolver( internalDependencies, internalCompositeDependencies, externalGradleDependencies, - externalNpmDependencies + externalNpmDependencies, + fileCollectionDependencies ) } @@ -292,7 +307,10 @@ internal class KotlinCompilationNpmResolver( val externalGradleDependencies: Collection, @get:Input - val externalDependencies: Collection + val externalDependencies: Collection, + + @get:Input + val fileCollectionDependencies: Collection ) : Serializable @Suppress("MemberVisibilityCanBePrivate") @@ -300,14 +318,16 @@ internal class KotlinCompilationNpmResolver( val internalDependencies: Collection, val internalCompositeDependencies: Collection, val externalGradleDependencies: Collection, - val externalNpmDependencies: Collection + val externalNpmDependencies: Collection, + val fileCollectionDependencies: Collection ) { val inputs: PackageJsonProducerInputs get() = PackageJsonProducerInputs( internalDependencies.map { it.npmProject.name }, internalCompositeDependencies.flatMap { it.getPackages() }, externalGradleDependencies.map { it.artifact.file }, - externalNpmDependencies.map { it.uniqueRepresentation() } + externalNpmDependencies.map { it.uniqueRepresentation() }, + fileCollectionDependencies.map { it.files }.flatMap { it.files } ) fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution { @@ -316,14 +336,23 @@ internal class KotlinCompilationNpmResolver( ?: error("Unresolved dependent npm package: ${this@KotlinCompilationNpmResolver} -> $it") } val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull { - resolver.gradleNodeModules.get(it.dependency, it.artifact.file) + resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file) + } + fileCollectionDependencies.mapNotNull { + val file = it.files.singleFile + + resolver.gradleNodeModules.get( + it.name, + it.version ?: "0.0.1", + file + ) } val compositeDependencies = internalCompositeDependencies.flatMap { dependency -> dependency.getPackages() .map { file -> resolver.compositeNodeModules.get( - dependency.dependency, + dependency.dependency.moduleName, + dependency.dependency.moduleVersion, file ) }