diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 1e9a13a32fd..8e3967849c5 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.jps.model.JpsProject import org.jetbrains.kotlin.compilerRunner.SimpleOutputItem import org.jetbrains.kotlin.utils.LibraryUtils +import org.jetbrains.kotlin.load.kotlin.incremental.cache.IncrementalCache public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { class object { @@ -88,8 +89,8 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR val dataManager = context.getProjectDescriptor().dataManager - if (chunk.getTargets().any { CacheFormatVersion(File(dataManager.getDataPaths().getTargetDataRoot(it), IncrementalCacheImpl.DIRECTORY_NAME)).isIncompatible() }) { - chunk.getTargets().forEach { dataManager.getStorage(it, IncrementalCacheStorageProvider).clean() } + if (chunk.getTargets().any { dataManager.getDataPaths().getKotlinCacheVersion(it).isIncompatible() }) { + chunk.getTargets().forEach { dataManager.getKotlinCache(it).clean() } return CHUNK_REBUILD_REQUIRED } @@ -100,7 +101,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR messageCollector.report(INFO, "Kotlin JPS plugin version " + KotlinVersion.VERSION, NO_LOCATION) - val incrementalCaches = chunk.getTargets().keysToMap { dataManager.getStorage(it, IncrementalCacheStorageProvider) } + val incrementalCaches = chunk.getTargets().keysToMap { dataManager.getKotlinCache(it) } val environment = createCompileEnvironment(incrementalCaches) if (!environment.success()) { environment.reportErrorsTo(messageCollector) @@ -164,7 +165,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR return OK } - private fun createCompileEnvironment(incrementalCaches: Map): CompilerEnvironment { + private fun createCompileEnvironment(incrementalCaches: Map): CompilerEnvironment { val compilerServices = Services.Builder() .register(javaClass(), IncrementalCacheProviderImpl(incrementalCaches)) .build() diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt index ea16f56a11f..1e1cc3401a3 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt @@ -42,63 +42,59 @@ import java.io.IOException import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.header.isCompatiblePackageFacadeKind import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind +import org.jetbrains.jps.incremental.storage.BuildDataManager +import org.jetbrains.jps.builders.BuildTarget +import org.jetbrains.jps.builders.storage.BuildDataPaths val INLINE_ANNOTATION_DESC = "Lkotlin/inline;" -public class CacheFormatVersion(val baseDir: File) { +private val CACHE_DIRECTORY_NAME = "kotlin" + + +class CacheFormatVersion(targetDataRoot: File) { class object { // Change this when incremental cache format changes private val INCREMENTAL_CACHE_OWN_VERSION = 1 - val CACHE_FORMAT_VERSION: Int = INCREMENTAL_CACHE_OWN_VERSION * 1000000 + JvmAbi.VERSION - val FORMAT_VERSION_TXT: String = "format-version.txt" + private val CACHE_FORMAT_VERSION: Int = INCREMENTAL_CACHE_OWN_VERSION * 1000000 + JvmAbi.VERSION + val FORMAT_VERSION_FILE_PATH: String = "$CACHE_DIRECTORY_NAME/format-version.txt" } - private fun getFile(): File { - return File(baseDir, "format-version.txt") - } + private val file = File(targetDataRoot, FORMAT_VERSION_FILE_PATH) public fun isIncompatible(): Boolean { - val version = load() - return version != -1 && version != CACHE_FORMAT_VERSION - } + if (!file.exists()) return false - private fun load(): Int { - val versionFile = getFile() - if (!versionFile.exists()) return -1 - - return versionFile.readText().toInt() + return file.readText().toInt() != CACHE_FORMAT_VERSION } fun saveIfNeeded() { - val versionFile = getFile() - if (!versionFile.exists()) { - versionFile.writeText(CACHE_FORMAT_VERSION.toString()) + if (!file.exists()) { + file.writeText(CACHE_FORMAT_VERSION.toString()) } } fun clean() { - getFile().delete() + file.delete() } } -public class IncrementalCacheImpl(val baseDir: File): StorageOwner, IncrementalCache { +public class IncrementalCacheImpl(targetDataRoot: File): StorageOwner, IncrementalCache { class object { - val DIRECTORY_NAME = "kotlin" - val PROTO_MAP = "proto.tab" val CONSTANTS_MAP = "constants.tab" val INLINE_FUNCTIONS = "inline-functions.tab" val PACKAGE_PARTS = "package-parts.tab" } + private val baseDir = File(targetDataRoot, CACHE_DIRECTORY_NAME) private val protoMap = ProtoMap() private val constantsMap = ConstantsMap() private val inlineFunctionsMap = InlineFunctionsMap() private val packagePartMap = PackagePartMap() - private val maps = listOf(protoMap, constantsMap, inlineFunctionsMap, packagePartMap) + private val maps = listOf(protoMap, constantsMap, inlineFunctionsMap, packagePartMap) - private val cacheFormatVersion = CacheFormatVersion(baseDir) + private val cacheFormatVersion = CacheFormatVersion(targetDataRoot) public fun saveFileToCache(sourceFiles: Collection, classFile: File): RecompilationDecision { if (classFile.extension.toLowerCase() != "class") return DO_NOTHING @@ -510,12 +506,16 @@ public class IncrementalCacheImpl(val baseDir: File): StorageOwner, IncrementalC } } -public object IncrementalCacheStorageProvider : StorageProvider() { - override fun createStorage(targetDataDir: File?): IncrementalCacheImpl { - return IncrementalCacheImpl(File(targetDataDir, IncrementalCacheImpl.DIRECTORY_NAME)) +private val storageProvider = object: StorageProvider() { + override fun createStorage(targetDataDir: File): IncrementalCacheImpl { + return IncrementalCacheImpl(targetDataDir) } } +public fun BuildDataPaths.getKotlinCacheVersion(target: BuildTarget<*>): CacheFormatVersion = CacheFormatVersion(getTargetDataRoot(target)) + +public fun BuildDataManager.getKotlinCache(target: BuildTarget<*>): IncrementalCacheImpl = getStorage(target, storageProvider) + private fun ByteArray.md5(): Long { val d = MessageDigest.getInstance("MD5").digest(this)!! return ((d[0].toLong() and 0xFFL) @@ -530,8 +530,8 @@ private fun ByteArray.md5(): Long { } private object ByteArrayExternalizer: DataExternalizer { - override fun save(out: DataOutput, value: ByteArray?) { - out.writeInt(value!!.size) + override fun save(out: DataOutput, value: ByteArray) { + out.writeInt(value.size()) out.write(value) } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheProviderImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheProviderImpl.kt index 34eb8261fac..299432c43ce 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheProviderImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheProviderImpl.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.load.kotlin.incremental.cache.IncrementalCacheProvid import org.jetbrains.jps.incremental.ModuleBuildTarget import org.jetbrains.kotlin.load.kotlin.incremental.cache.IncrementalCache -public class IncrementalCacheProviderImpl(caches: Map): IncrementalCacheProvider { +public class IncrementalCacheProviderImpl(caches: Map): IncrementalCacheProvider { private val idToCache = caches.mapKeys { it.key.getId()!! } override fun getIncrementalCache(moduleId: String): IncrementalCache { diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalCacheVersionChangedTest.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalCacheVersionChangedTest.kt index 1744b5d2c99..fa8aeacc9de 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalCacheVersionChangedTest.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalCacheVersionChangedTest.kt @@ -37,7 +37,7 @@ public class IncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest() { override fun performAdditionalModifications() { val storageForTargetType = BuildDataPathsImpl(myDataStorageRoot).getTargetTypeDataRoot(JavaModuleBuildTargetType.PRODUCTION) - val relativePath = "module/${File.separator}${IncrementalCacheImpl.DIRECTORY_NAME}/${CacheFormatVersion.FORMAT_VERSION_TXT}" + val relativePath = "module/${CacheFormatVersion.FORMAT_VERSION_FILE_PATH}" val cacheVersionFile = File(storageForTargetType, relativePath) assertTrue(cacheVersionFile.exists())