diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ICUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ICUtils.kt index cd8384b82d6..881726fc7ba 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ICUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ICUtils.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.protobuf.CodedOutputStream import java.io.File import java.io.FileInputStream import java.io.FileOutputStream +import java.io.OutputStream internal inline fun File.ifExists(f: File.() -> T): T? = if (exists()) f() else null @@ -28,14 +29,15 @@ internal inline fun File.useCodedInputIfExists(f: CodedInputStream.() -> T) } } +internal inline fun OutputStream.useCodedOutput(f: CodedOutputStream.() -> Unit) = use { + val out = CodedOutputStream.newInstance(it) + out.f() + out.flush() +} + internal inline fun File.useCodedOutput(f: CodedOutputStream.() -> Unit) { - parentFile?.mkdirs() recreate() - FileOutputStream(this).use { - val out = CodedOutputStream.newInstance(it) - out.f() - out.flush() - } + FileOutputStream(this).useCodedOutput(f) } internal fun icError(what: String, libFile: KotlinLibraryFile? = null, srcFile: KotlinSourceFile? = null): Nothing { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt index 42e454876c7..51020b99623 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.IdSignatureDeserializer import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.CodedOutputStream +import java.io.ByteArrayOutputStream import java.io.File internal class IncrementalCache(private val library: KotlinLibraryHeader, val cacheDir: File) { @@ -17,7 +18,6 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca private const val BINARY_AST_SUFFIX = "ast.bin" private const val METADATA_SUFFIX = "metadata.bin" - private const val METADATA_TMP_SUFFIX = "metadata.tmp.bin" } private val cacheHeaderFile = File(cacheDir, CACHE_HEADER) @@ -240,11 +240,13 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca } } - val tmpCacheFile = srcFile.getCacheFile(METADATA_TMP_SUFFIX) - tmpCacheFile.useCodedOutput { - writeDirectDependencies(sourceFileMetadata.directDependencies) - writeInverseDependencies(sourceFileMetadata.inverseDependencies) - } - return SourceFileCacheArtifact.CommitMetadata(srcFile, binaryAstFile, headerCacheFile, tmpCacheFile) + val encodedMetadata = ByteArrayOutputStream(4096).apply { + useCodedOutput { + writeDirectDependencies(sourceFileMetadata.directDependencies) + writeInverseDependencies(sourceFileMetadata.inverseDependencies) + } + }.toByteArray() + + return SourceFileCacheArtifact.CommitMetadata(srcFile, binaryAstFile, headerCacheFile, encodedMetadata) } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCacheArtifact.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCacheArtifact.kt index c2cfdf65735..5174d6b91b8 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCacheArtifact.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCacheArtifact.kt @@ -29,15 +29,11 @@ internal sealed class SourceFileCacheArtifact(val srcFile: KotlinSourceFile, val srcFile: KotlinSourceFile, binaryAstFile: File, private val metadataFile: File, - private val tmpMetadataFile: File + private val encodedMetadata: ByteArray ) : SourceFileCacheArtifact(srcFile, binaryAstFile) { override fun commitMetadata() { - metadataFile.delete() - if (!tmpMetadataFile.renameTo(metadataFile)) { - tmpMetadataFile.copyTo(metadataFile, true) - tmpMetadataFile.delete() - } - + metadataFile.recreate() + metadataFile.writeBytes(encodedMetadata) } }