diff --git a/build-common/src/org/jetbrains/kotlin/incremental/CompilationTransaction.kt b/build-common/src/org/jetbrains/kotlin/incremental/CompilationTransaction.kt index 71d14ebe595..874789812b8 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/CompilationTransaction.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/CompilationTransaction.kt @@ -37,6 +37,24 @@ interface CompilationTransaction : Closeable { fun markAsSuccessful() } +fun CompilationTransaction.write(file: Path, writeAction: () -> Unit) { + registerAddedOrChangedFile(file) + writeAction() +} + +fun CompilationTransaction.writeText(file: Path, text: String) { + writeBytes(file, text.toByteArray()) +} + +fun CompilationTransaction.writeBytes(file: Path, array: ByteArray) { + write(file) { + if (!Files.exists(file.parent)) { + Files.createDirectories(file.parent) + } + Files.write(file, array) + } +} + /** * A dummy implementation of compilation transaction */ diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt index cdffbabafd3..b9de3fb8d0d 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalJsCache.kt @@ -72,9 +72,7 @@ open class IncrementalJsCache( var header: ByteArray get() = headerFile.readBytes() set(value) { - icContext.transaction.registerAddedOrChangedFile(headerFile.toPath()) - cachesDir.mkdirs() - headerFile.writeBytes(value) + icContext.transaction.writeBytes(headerFile.toPath(), value) } override fun markDirty(removedAndCompiledSources: Collection) { diff --git a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt index b73cc928fbf..9ce51d77fbc 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt @@ -148,13 +148,7 @@ open class LookupStorage( try { if (size != oldSize) { if (size > 0) { - icContext.transaction.registerAddedOrChangedFile(countersFile.toPath()) - if (!countersFile.exists()) { - countersFile.parentFile.mkdirs() - countersFile.createNewFile() - } - - countersFile.writeText("$size\n0") + icContext.transaction.writeText(countersFile.toPath(), "$size\n0") } } } finally { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/AbiSnapshot.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/AbiSnapshot.kt index 3e05d0deaa0..dd9e8873c2e 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/AbiSnapshot.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/AbiSnapshot.kt @@ -145,9 +145,10 @@ class AbiSnapshotImpl(override val protos: MutableMap) : AbiS } fun write(icContext: IncrementalCompilationContext, buildInfo: AbiSnapshot, file: File) { - icContext.transaction.registerAddedOrChangedFile(file.toPath()) - ObjectOutputStream(FileOutputStream(file)).use { - it.writeAbiSnapshot(buildInfo) + icContext.transaction.write(file.toPath()) { + ObjectOutputStream(FileOutputStream(file)).use { + it.writeAbiSnapshot(buildInfo) + } } } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt index f711c9d9c9a..25858a5d42d 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/BuildDiffsStorage.kt @@ -64,21 +64,23 @@ data class BuildDiffsStorage(val buildDiffs: List) { return null } - fun writeToFile(file: File, storage: BuildDiffsStorage, reporter: ICReporter?) { + fun writeToFile(icContext: IncrementalCompilationContext, file: File, storage: BuildDiffsStorage) { file.parentFile.mkdirs() try { - ObjectOutputStream(file.outputStream().buffered()).use { output -> - output.writeInt(CURRENT_VERSION) + icContext.transaction.write(file.toPath()) { + ObjectOutputStream(file.outputStream().buffered()).use { output -> + output.writeInt(CURRENT_VERSION) - val diffsToWrite = storage.buildDiffs.sortedBy { it.ts }.takeLast(MAX_DIFFS_ENTRIES) - output.writeInt(diffsToWrite.size) - for (diff in diffsToWrite) { - output.writeBuildDifference(diff) + val diffsToWrite = storage.buildDiffs.sortedBy { it.ts }.takeLast(MAX_DIFFS_ENTRIES) + output.writeInt(diffsToWrite.size) + for (diff in diffsToWrite) { + output.writeBuildDifference(diff) + } } } } catch (e: IOException) { - reporter?.info { "Could not write diff to file $file: $e" } + icContext.reporter.info { "Could not write diff to file $file: $e" } } } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt index b8f0193eb21..c90e1ff8b9d 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt @@ -495,8 +495,7 @@ abstract class IncrementalCompilerRunner< dirtySources.addAll(compiledSources) allDirtySources.addAll(dirtySources) val text = allDirtySources.joinToString(separator = System.getProperty("line.separator")) { it.normalize().absolutePath } - transaction.registerAddedOrChangedFile(dirtySourcesSinceLastTimeFile.toPath()) - dirtySourcesSinceLastTimeFile.writeText(text) + transaction.writeText(dirtySourcesSinceLastTimeFile.toPath(), text) val generatedFiles = outputItemsCollector.outputs.map { it.toGeneratedFile(jvmMetadataVersionFromLanguageVersion) @@ -583,7 +582,7 @@ abstract class IncrementalCompilerRunner< } val dirtyData = DirtyData(buildDirtyLookupSymbols, buildDirtyFqNames) - processChangesAfterBuild(compilationMode, currentBuildInfo, dirtyData, transaction) + processChangesAfterBuild(icContext, compilationMode, currentBuildInfo, dirtyData) return exitCode } @@ -615,10 +614,10 @@ abstract class IncrementalCompilerRunner< open fun runWithNoDirtyKotlinSources(caches: CacheManager): Boolean = false private fun processChangesAfterBuild( + icContext: IncrementalCompilationContext, compilationMode: CompilationMode, currentBuildInfo: BuildInfo, dirtyData: DirtyData, - transaction: CompilationTransaction, ) = reporter.measure(BuildTime.IC_WRITE_HISTORY_FILE) { val prevDiffs = BuildDiffsStorage.readFromFile(buildHistoryFile, reporter)?.buildDiffs ?: emptyList() val newDiff = if (compilationMode is CompilationMode.Incremental) { @@ -628,8 +627,7 @@ abstract class IncrementalCompilerRunner< BuildDifference(currentBuildInfo.startTS, false, emptyDirtyData) } - transaction.registerAddedOrChangedFile(buildHistoryFile.toPath()) - BuildDiffsStorage.writeToFile(buildHistoryFile, BuildDiffsStorage(prevDiffs + newDiff), reporter) + BuildDiffsStorage.writeToFile(icContext, buildHistoryFile, BuildDiffsStorage(prevDiffs + newDiff)) } companion object { diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt index 0b80724f435..7f2be9e9058 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/BuildDiffsStorageTest.kt @@ -28,6 +28,7 @@ import java.util.* class BuildDiffsStorageTest { lateinit var storageFile: File private val random = Random(System.currentTimeMillis()) + private val icContext = IncrementalCompilationContext(null) @Before fun setUp() { @@ -54,7 +55,7 @@ class BuildDiffsStorageTest { @Test fun writeReadSimple() { val diffs = BuildDiffsStorage(listOf(getRandomDiff())) - BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + BuildDiffsStorage.writeToFile(icContext, storageFile, diffs) val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) Assert.assertEquals(diffs.toString(), diffsDeserialized.toString()) @@ -64,7 +65,7 @@ class BuildDiffsStorageTest { fun writeReadMany() { val generated = Array(20) { getRandomDiff() }.toList() val diffs = BuildDiffsStorage(generated) - BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + BuildDiffsStorage.writeToFile(icContext, storageFile, diffs) val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) val expected = generated.sortedBy { it.ts }.takeLast(BuildDiffsStorage.MAX_DIFFS_ENTRIES).toTypedArray() @@ -82,7 +83,7 @@ class BuildDiffsStorageTest { @Test fun versionChanged() { val diffs = BuildDiffsStorage(listOf(getRandomDiff())) - BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) + BuildDiffsStorage.writeToFile(icContext, storageFile, diffs) val versionBackup = BuildDiffsStorage.CURRENT_VERSION try {