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 89280f9c763..9891eaab644 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 @@ -99,15 +99,23 @@ abstract class KotlinJsIrLink @Inject constructor( override fun callCompilerAsync(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { if (incrementalJsIr) { - val visitedDependencies = mutableSetOf() - val visitedFiles = mutableSetOf() val visitedCompilations = mutableSetOf>() val allCacheDirectories = mutableSetOf() + val cacheBuilder = CacheBuilder( + buildDir, + kotlinOptions, + libraryFilter, + compilerRunner, + { createCompilerArgs() }, + { objects.fileCollection() }, + computedCompilerClasspath, + logger, + reportingSettings + ) val cacheArgs = visitAssociated( compilation, - visitedDependencies, - visitedFiles, + cacheBuilder, visitedCompilations, allCacheDirectories ) @@ -121,44 +129,31 @@ abstract class KotlinJsIrLink @Inject constructor( private fun visitAssociated( associated: KotlinCompilation<*>, - visitedDependencies: MutableSet, - visitedFiles: MutableSet, + cacheBuilder: CacheBuilder, visitedCompilations: MutableSet>, visitedCacheDirectories: MutableSet ): List { if (associated in visitedCompilations) return emptyList() visitedCompilations.add(associated) - val prevRes = associated.associateWith + val associatedCaches = associated.associateWith .flatMap { compilation -> visitAssociated( compilation, - visitedDependencies, - visitedFiles, + cacheBuilder, visitedCompilations, visitedCacheDirectories ) } - return prevRes + CacheBuilder( - buildDir, - project.configurations.getByName(associated.compileDependencyConfigurationName), - associated.output.classesDirs, - kotlinOptions, - libraryFilter, - compilerRunner, - { createCompilerArgs() }, - computedCompilerClasspath, - logger, - objects.fileCollection(), - reportingSettings, - visitedDependencies, - visitedFiles, - prevRes - ) - .buildCompilerArgs() - .filter { it !in visitedCacheDirectories } - .also { visitedCacheDirectories.addAll(it) } + return cacheBuilder + .buildCompilerArgs( + project.configurations.getByName(associated.compileDependencyConfigurationName), + associated.output.classesDirs, + associatedCaches + ) +// .filter { it !in visitedCacheDirectories } +// .also { visitedCacheDirectories.addAll(it) } } override fun setupCompilerArgs(args: K2JSCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) { @@ -182,25 +177,31 @@ abstract class KotlinJsIrLink @Inject constructor( internal class CacheBuilder( private val buildDir: File, - private val compileClasspath: Configuration, - private val additionalForResolve: FileCollection?, private val kotlinOptions: KotlinJsOptions, private val libraryFilter: (File) -> Boolean, private val compilerRunner: GradleCompilerRunner, private val compilerArgsFactory: () -> K2JSCompilerArguments, + private val objectFilesFactory: () -> FileCollection, private val computedCompilerClasspath: List, private val logger: Logger, - private val outputFiles: FileCollection, - private val reportingSettings: ReportingSettings, - private val visitedDependencies: MutableSet, - private val visitedFiles: MutableSet, - private val associatedCaches: List + private val reportingSettings: ReportingSettings ) { val rootCacheDirectory by lazy { buildDir.resolve("klib/cache") } - fun buildCompilerArgs(): List { + private val visitedDependencies = mutableSetOf() + private val visitedFiles = mutableSetOf() + private val visitedCacheDirectories = mutableSetOf() + + private val objectFiles + get() = objectFilesFactory() + + fun buildCompilerArgs( + compileClasspath: Configuration, + additionalForResolve: FileCollection?, + associatedCaches: List + ): List { val allCacheDirectories = mutableListOf() val visitedDependenciesForCache = mutableSetOf() @@ -208,9 +209,7 @@ internal class CacheBuilder( compileClasspath.resolvedConfiguration.firstLevelModuleDependencies .forEach { dependency -> ensureDependencyCached( - dependency, - visitedDependencies, - visitedFiles + dependency ) if (dependency !in visitedDependenciesForCache) { (listOf(dependency) + getAllDependencies(dependency)) @@ -230,7 +229,6 @@ internal class CacheBuilder( cacheDirectory.mkdirs() runCompiler( file, - visitedFiles, compileClasspath.files, cacheDirectory, (allCacheDirectories + associatedCaches).distinct() @@ -238,19 +236,19 @@ internal class CacheBuilder( allCacheDirectories.add(cacheDirectory) } - return allCacheDirectories + return associatedCaches + allCacheDirectories + .filter { it !in visitedCacheDirectories } + .also { visitedCacheDirectories.addAll(it) } } private fun ensureDependencyCached( - dependency: ResolvedDependency, - visitedDependency: MutableSet, - visitedFiles: MutableSet + dependency: ResolvedDependency ) { - if (dependency in visitedDependency) return - visitedDependency.add(dependency) + if (dependency in visitedDependencies) return + visitedDependencies.add(dependency) dependency.children - .forEach { ensureDependencyCached(it, visitedDependency, visitedFiles) } + .forEach { ensureDependencyCached(it) } val artifactsToAddToCache = dependency.moduleArtifacts .filter { libraryFilter(it.file) } @@ -268,7 +266,6 @@ internal class CacheBuilder( for (library in artifactsToAddToCache) { runCompiler( library.file, - visitedFiles, getAllDependencies(dependency) .flatMap { it.moduleArtifacts } .map { it.file }, @@ -280,7 +277,6 @@ internal class CacheBuilder( fun runCompiler( file: File, - visitedFiles: MutableSet, dependencies: Collection, cacheDirectory: File, dependenciesCacheDirectories: Collection @@ -315,7 +311,7 @@ internal class CacheBuilder( computedCompilerClasspath, messageCollector, outputItemCollector, - outputFiles = outputFiles, + outputFiles = objectFiles, reportingSettings = reportingSettings )