diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index 7ae88c762cf..4b7ab471250 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -102,12 +102,21 @@ abstract class KotlinJsIrLink @Inject constructor( val visitedDependencies = mutableSetOf() val visitedFiles = mutableSetOf() val visitedCompilations = mutableSetOf>() + val allCacheDirectories = mutableSetOf() - val cacheArgs = visitAssociated(compilation, visitedDependencies, visitedFiles, visitedCompilations).distinct() + val cacheArgs = visitAssociated( + compilation, + visitedDependencies, + visitedFiles, + visitedCompilations, + allCacheDirectories + ) - args.freeArgs += "-Xcache-directory=${cacheArgs.joinToString(File.pathSeparator) { - it.normalize().absolutePath - }}" + args.freeArgs += "-Xcache-directory=${ + cacheArgs.joinToString(File.pathSeparator) { + it.normalize().absolutePath + } + }" } super.callCompilerAsync(args, sourceRoots, changedFiles) } @@ -116,13 +125,22 @@ abstract class KotlinJsIrLink @Inject constructor( associated: KotlinCompilation<*>, visitedDependencies: MutableSet, visitedFiles: MutableSet, - visitedCompilations: MutableSet> + visitedCompilations: MutableSet>, + visitedCacheDirectories: MutableSet ): List { if (associated in visitedCompilations) return emptyList() visitedCompilations.add(associated) val prevRes = associated.associateWith - .flatMap { visitAssociated(it, visitedDependencies, visitedFiles, visitedCompilations) } + .flatMap { compilation -> + visitAssociated( + compilation, + visitedDependencies, + visitedFiles, + visitedCompilations, + visitedCacheDirectories + ) + } return prevRes + CacheBuilder( buildDir, @@ -137,8 +155,12 @@ abstract class KotlinJsIrLink @Inject constructor( objects.fileCollection(), reportingSettings, visitedDependencies, - visitedFiles - ).buildCompilerArgs() + visitedFiles, + prevRes + ) + .buildCompilerArgs() + .filter { it !in visitedCacheDirectories } + .also { visitedCacheDirectories.addAll(it) } } override fun setupCompilerArgs(args: K2JSCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) { @@ -173,8 +195,8 @@ internal class CacheBuilder( private val outputFiles: FileCollection, private val reportingSettings: ReportingSettings, private val visitedDependencies: MutableSet, - private val visitedFiles: MutableSet - + private val visitedFiles: MutableSet, + private val associatedCaches: List ) { val rootCacheDirectory by lazy { buildDir.resolve("klib/cache") @@ -183,6 +205,7 @@ internal class CacheBuilder( fun buildCompilerArgs(): List { val allCacheDirectories = mutableListOf() + val visitedDependenciesForCache = mutableSetOf() compileClasspath.resolvedConfiguration.firstLevelModuleDependencies .forEach { dependency -> @@ -191,13 +214,17 @@ internal class CacheBuilder( visitedDependencies, visitedFiles ) - (listOf(dependency) + getAllDependencies(dependency)) - .forEach { - val cacheDirectory = getCacheDirectory(rootCacheDirectory, it) - if (cacheDirectory.exists()) { - allCacheDirectories.add(cacheDirectory) + if (dependency !in visitedDependenciesForCache) { + (listOf(dependency) + getAllDependencies(dependency)) + .filter { it !in visitedDependenciesForCache } + .forEach { dependencyForCache -> + visitedDependenciesForCache.add(dependencyForCache) + val cacheDirectory = getCacheDirectory(rootCacheDirectory, dependencyForCache) + if (cacheDirectory.exists()) { + allCacheDirectories.add(cacheDirectory) + } } - } + } } additionalForResolve?.files?.forEach { file -> @@ -208,7 +235,7 @@ internal class CacheBuilder( visitedFiles, compileClasspath.files, cacheDirectory, - allCacheDirectories, + (allCacheDirectories + associatedCaches).distinct(), file.name