From d108c8ef5120cec7ee34ca07b10ac8a32034f6a4 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 4 Mar 2020 17:54:45 +0300 Subject: [PATCH] [Gradle, JS] Move logic of resolving NpmDependency to Npm Api #KT-36196 fixed --- .../kotlin/gradle/targets/js/npm/NpmApi.kt | 6 +++ .../gradle/targets/js/npm/NpmDependency.kt | 47 ++++--------------- .../kotlin/gradle/targets/js/yarn/Yarn.kt | 6 +++ .../gradle/targets/js/yarn/YarnBasics.kt | 47 +++++++++++++++++++ 4 files changed, 69 insertions(+), 37 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt index bb8bb86d542..6510e48e142 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution +import java.io.File /** * NodeJS package manager API @@ -22,6 +23,11 @@ interface NpmApi { skipExecution: Boolean ) + fun resolveDependency( + resolvedNpmProject: KotlinCompilationNpmResolution, + dependency: NpmDependency + ): Set + companion object { fun resolveOperationDescription(packageManagerTitle: String): String = "Resolving NPM dependencies using $packageManagerTitle" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt index 9d444ef76e3..1c35732f168 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt @@ -15,8 +15,8 @@ import org.gradle.api.internal.artifacts.ResolvableDependency import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInternal import org.gradle.api.tasks.TaskDependency import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier -import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import java.io.File data class NpmDependency( @@ -59,43 +59,16 @@ data class NpmDependency( return visited } - override fun resolve(transitive: Boolean): Set { - val npmPackage = resolveProject() ?: return mutableSetOf() - val npmProject = npmPackage.npmProject - - val all = mutableSetOf() - val visited = mutableSetOf() - - fun visit(item: NpmDependency) { - if (item in visited) return - visited.add(item) - - npmProject.resolve(item.key)?.let { - if (it.isFile) all.add(it) - if (it.path.endsWith(".js")) { - val baseName = it.path.removeSuffix(".js") - val metaJs = File(baseName + ".meta.js") - if (metaJs.isFile) all.add(metaJs) - val kjsmDir = File(baseName) - if (kjsmDir.isDirectory) { - kjsmDir.walkTopDown() - .filter { it.extension == "kjsm" } - .forEach { all.add(it) } - } - } + override fun resolve(transitive: Boolean): Set = + resolveProject() + ?.let { + it + .npmProject + .nodeJs + .packageManager + .resolveDependency(it, this) } - - if (transitive) { - item.dependencies.forEach { - visit(it) - } - } - } - - visit(this) - - return all - } + ?: mutableSetOf() override fun resolve(): MutableSet { val npmPackage = parent?.resolveProject() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index e71c1cd7224..9b42f83458d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution object Yarn : NpmApi { @@ -20,6 +21,11 @@ object Yarn : NpmApi { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject) + override fun resolveDependency( + resolvedNpmProject: KotlinCompilationNpmResolution, + dependency: NpmDependency + ) = getDelegate(resolvedNpmProject.project).resolveDependency(resolvedNpmProject, dependency) + override fun resolveRootProject( rootProject: Project, subProjects: Collection, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt index 4a39610f065..bb2883280bb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt @@ -10,9 +10,13 @@ import org.jetbrains.kotlin.gradle.internal.execWithProgress import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency +import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import java.io.File abstract class YarnBasics : NpmApi { + + private val resolvedDependencies = mutableMapOf>() + override fun setup(project: Project) { YarnPlugin.apply(project).executeSetup() } @@ -36,6 +40,49 @@ abstract class YarnBasics : NpmApi { } + override fun resolveDependency( + resolvedNpmProject: KotlinCompilationNpmResolution, + dependency: NpmDependency + ): Set { + val files = resolvedDependencies[dependency] + + if (files != null) { + return files + } + + val npmProject = resolvedNpmProject.npmProject + + val all = mutableSetOf() + + npmProject.resolve(dependency.key)?.let { + if (it.isFile) all.add(it) + if (it.path.endsWith(".js")) { + val baseName = it.path.removeSuffix(".js") + val metaJs = File(baseName + ".meta.js") + if (metaJs.isFile) all.add(metaJs) + val kjsmDir = File(baseName) + if (kjsmDir.isDirectory) { + kjsmDir.walkTopDown() + .filter { it.extension == "kjsm" } + .forEach { all.add(it) } + } + } + } + + dependency.dependencies.forEach { + resolveDependency( + resolvedNpmProject, + it + ).also { files -> + all.addAll(files) + } + } + + resolvedDependencies[dependency] = all + + return all + } + protected fun yarnLockReadTransitiveDependencies( nodeWorkDir: File, srcDependenciesList: Collection