[Gradle, JS] Refactor cacheBuilder to reuse one instance
This commit is contained in:
+46
-50
@@ -99,15 +99,23 @@ abstract class KotlinJsIrLink @Inject constructor(
|
||||
|
||||
override fun callCompilerAsync(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) {
|
||||
if (incrementalJsIr) {
|
||||
val visitedDependencies = mutableSetOf<ResolvedDependency>()
|
||||
val visitedFiles = mutableSetOf<File>()
|
||||
val visitedCompilations = mutableSetOf<KotlinCompilation<*>>()
|
||||
val allCacheDirectories = mutableSetOf<File>()
|
||||
|
||||
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<ResolvedDependency>,
|
||||
visitedFiles: MutableSet<File>,
|
||||
cacheBuilder: CacheBuilder,
|
||||
visitedCompilations: MutableSet<KotlinCompilation<*>>,
|
||||
visitedCacheDirectories: MutableSet<File>
|
||||
): List<File> {
|
||||
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<File>,
|
||||
private val logger: Logger,
|
||||
private val outputFiles: FileCollection,
|
||||
private val reportingSettings: ReportingSettings,
|
||||
private val visitedDependencies: MutableSet<ResolvedDependency>,
|
||||
private val visitedFiles: MutableSet<File>,
|
||||
private val associatedCaches: List<File>
|
||||
private val reportingSettings: ReportingSettings
|
||||
) {
|
||||
val rootCacheDirectory by lazy {
|
||||
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 visitedDependenciesForCache = mutableSetOf<ResolvedDependency>()
|
||||
@@ -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<ResolvedDependency>,
|
||||
visitedFiles: MutableSet<File>
|
||||
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<File>,
|
||||
dependencies: Collection<File>,
|
||||
cacheDirectory: File,
|
||||
dependenciesCacheDirectories: Collection<File>
|
||||
@@ -315,7 +311,7 @@ internal class CacheBuilder(
|
||||
computedCompilerClasspath,
|
||||
messageCollector,
|
||||
outputItemCollector,
|
||||
outputFiles = outputFiles,
|
||||
outputFiles = objectFiles,
|
||||
reportingSettings = reportingSettings
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user