[Gradle, JS] Refactor cacheBuilder to reuse one instance

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