diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/dslModuleCache.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/dslModuleCache.kt new file mode 100644 index 00000000000..2fab7d6b956 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/dslModuleCache.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario + +import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration +import org.jetbrains.kotlin.buildtools.api.SourcesChanges +import org.jetbrains.kotlin.buildtools.api.jvm.IncrementalJvmCompilationConfiguration +import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DependencyScenarioDslCacheKey +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.Module +import java.nio.file.Files +import java.nio.file.Path +import java.util.* +import kotlin.io.path.copyToRecursively +import kotlin.io.path.isRegularFile +import kotlin.io.path.relativeTo +import kotlin.io.path.walk + +private data class GlobalCompiledProjectsCacheKey( + val moduleKey: DependencyScenarioDslCacheKey, + val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, + val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, +) + +internal object GlobalCompiledProjectsCache { + private val globalTempDirectory = Files.createTempDirectory("compiled-test-projects-cache").apply { + toFile().deleteOnExit() + } + private val compiledProjectsCache = mutableMapOf, Path>>() + + fun getProjectFromCache( + module: Module, + strategyConfig: CompilerExecutionStrategyConfiguration, + compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, + incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, + ): ScenarioModuleImpl? { + val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[GlobalCompiledProjectsCacheKey( + module.scenarioDslCacheKey, + compilationOptionsModifier, + incrementalCompilationOptionsModifier + )] ?: return null + cachedBuildDirPath.copyToRecursively(module.buildDirectory, followLinks = false, overwrite = true) + return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) + } + + fun putProjectIntoCache( + module: Module, + strategyConfig: CompilerExecutionStrategyConfiguration, + compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, + incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, + ): ScenarioModuleImpl { + module.compileIncrementally( + SourcesChanges.Unknown, + strategyConfig, + compilationConfigAction = { compilationOptionsModifier?.invoke(it) }, + incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) } + ) + val initialOutputs = mutableSetOf() + for (file in module.outputDirectory.walk()) { + if (!file.isRegularFile()) continue + initialOutputs.add(file.relativeTo(module.outputDirectory).toString()) + } + val moduleCacheDirectory = globalTempDirectory.resolve(UUID.randomUUID().toString()) + module.buildDirectory.copyToRecursively(moduleCacheDirectory, followLinks = false, overwrite = false) + compiledProjectsCache[GlobalCompiledProjectsCacheKey( + module.scenarioDslCacheKey, + compilationOptionsModifier, + incrementalCompilationOptionsModifier + )] = Pair(initialOutputs, moduleCacheDirectory) + return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt index 14927e80d35..e35d4f035bb 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt @@ -16,9 +16,9 @@ import java.nio.file.Path import java.util.* import kotlin.io.path.* -private class ScenarioModuleImpl( - val module: Module, - val outputs: MutableSet, +internal class ScenarioModuleImpl( + internal val module: Module, + private val outputs: MutableSet, private val strategyConfig: CompilerExecutionStrategyConfiguration, private val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, private val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, @@ -59,7 +59,7 @@ private class ScenarioModuleImpl( ) } - var sourcesChanges = SourcesChanges.Known(emptyList(), emptyList()) + private var sourcesChanges = SourcesChanges.Known(emptyList(), emptyList()) override fun compile( forceOutput: LogLevel?, @@ -100,59 +100,4 @@ private class ScenarioDsl( fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) { action(ScenarioDsl(Project(strategyConfig, workingDirectory), strategyConfig)) -} - -private data class GlobalCompiledProjectsCacheKey( - val moduleKey: DependencyScenarioDslCacheKey, - val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, - val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, -) - -private object GlobalCompiledProjectsCache { - private val globalTempDirectory = Files.createTempDirectory("compiled-test-projects-cache").apply { - toFile().deleteOnExit() - } - private val compiledProjectsCache = mutableMapOf, Path>>() - - fun getProjectFromCache( - module: Module, - strategyConfig: CompilerExecutionStrategyConfiguration, - compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, - incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, - ): ScenarioModuleImpl? { - val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[GlobalCompiledProjectsCacheKey( - module.scenarioDslCacheKey, - compilationOptionsModifier, - incrementalCompilationOptionsModifier - )] ?: return null - cachedBuildDirPath.copyToRecursively(module.buildDirectory, followLinks = false, overwrite = true) - return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) - } - - fun putProjectIntoCache( - module: Module, - strategyConfig: CompilerExecutionStrategyConfiguration, - compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, - incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, - ): ScenarioModuleImpl { - module.compileIncrementally( - SourcesChanges.Unknown, - strategyConfig, - compilationConfigAction = { compilationOptionsModifier?.invoke(it) }, - incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) } - ) - val initialOutputs = mutableSetOf() - for (file in module.outputDirectory.walk()) { - if (!file.isRegularFile()) continue - initialOutputs.add(file.relativeTo(module.outputDirectory).toString()) - } - val moduleCacheDirectory = globalTempDirectory.resolve(UUID.randomUUID().toString()) - module.buildDirectory.copyToRecursively(moduleCacheDirectory, followLinks = false, overwrite = false) - compiledProjectsCache[GlobalCompiledProjectsCacheKey( - module.scenarioDslCacheKey, - compilationOptionsModifier, - incrementalCompilationOptionsModifier - )] = Pair(initialOutputs, moduleCacheDirectory) - return ScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier) - } } \ No newline at end of file