diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/model/AbstractModule.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/model/AbstractModule.kt index 2672bbde031..86402fee365 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/model/AbstractModule.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/model/AbstractModule.kt @@ -96,4 +96,23 @@ abstract class AbstractModule( ): CompilationResult override fun toString() = moduleName + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is AbstractModule) return false + + if (moduleName != other.moduleName) return false + if (dependencies != other.dependencies) return false + if (additionalCompilationArguments != other.additionalCompilationArguments) return false + + return true + } + + override fun hashCode(): Int { + var result = moduleName.hashCode() + result = 31 * result + dependencies.hashCode() + result = 31 * result + additionalCompilationArguments.hashCode() + return result + } + + } \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/scenario/scenarioDsl.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/scenario/scenarioDsl.kt index 432c415013b..aa41eb070a1 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/scenario/scenarioDsl.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/scenario/scenarioDsl.kt @@ -85,16 +85,37 @@ private class ScenarioDsl( ): ScenarioModule { val transformedDependencies = dependencies.map { (it as ScenarioModuleImpl).module } val module = project.module(moduleName, transformedDependencies, additionalCompilationArguments) + return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig) + ?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig) + } +} + +fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) { + action(ScenarioDsl(Project(workingDirectory), strategyConfig)) +} + +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): ScenarioModuleImpl? { + val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[module] ?: return null + cachedBuildDirPath.copyToRecursively(module.buildDirectory, followLinks = false, overwrite = true) + return ScenarioModuleImpl(module, initialOutputs, strategyConfig) + } + + fun putProjectIntoCache(module: Module, strategyConfig: CompilerExecutionStrategyConfiguration): ScenarioModuleImpl { module.compileIncrementally(strategyConfig, SourcesChanges.Unknown) 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[module] = Pair(initialOutputs, moduleCacheDirectory) return ScenarioModuleImpl(module, initialOutputs, strategyConfig) } -} - -fun BaseCompilationTest.scenario(strategyConfig: CompilerExecutionStrategyConfiguration, action: Scenario.() -> Unit) { - action(ScenarioDsl(Project(workingDirectory), strategyConfig)) } \ No newline at end of file