diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt
index 3f9cdb9629c..52f0930007d 100644
--- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt
+++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt
@@ -300,9 +300,12 @@ abstract class AbstractIncrementalJpsTest(
): String {
return buildString {
for (target in project.allModuleTargets.sortedBy { it.presentableName }) {
- append("\n")
- append(project.dataManager.getKotlinCache(dummyCompileContext.kotlinBuildTargets[target]!!).dump())
- append("\n\n\n")
+ val kotlinCache = project.dataManager.getKotlinCache(dummyCompileContext.kotlinBuildTargets[target])
+ if (kotlinCache != null) {
+ append("\n")
+ append(kotlinCache.dump())
+ append("\n\n\n")
+ }
}
}
}
diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt
index d645362972d..4e07fc3d8d0 100644
--- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt
+++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt
@@ -47,10 +47,7 @@ import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.jps.incremental.*
-import org.jetbrains.kotlin.jps.platforms.KotlinCommonModuleBuildTarget
-import org.jetbrains.kotlin.jps.platforms.KotlinJsModuleBuildTarget
-import org.jetbrains.kotlin.jps.platforms.KotlinModuleBuildTarget
-import org.jetbrains.kotlin.jps.platforms.kotlinBuildTargets
+import org.jetbrains.kotlin.jps.platforms.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.preloading.ClassCondition
import org.jetbrains.kotlin.utils.KotlinPaths
@@ -427,7 +424,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val kotlinBuildTargets = context.kotlinBuildTargets
for (target in targets) {
- dataManager.getKotlinCache(kotlinBuildTargets[target]!!).clean()
+ dataManager.getKotlinCache(kotlinBuildTargets[target])?.clean()
hasKotlin.clean(target)
rebuildAfterCacheVersionChanged[target] = true
}
@@ -441,7 +438,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val kotlinBuildTargets = context.kotlinBuildTargets
for (target in context.allTargets()) {
- dataManager.getKotlinCache(kotlinBuildTargets[target]!!).clean()
+ dataManager.getKotlinCache(kotlinBuildTargets[target])?.clean()
}
}
CacheVersion.Action.CLEAN_DATA_CONTAINER -> {
@@ -473,7 +470,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val kotlinBuildTargets = context.kotlinBuildTargets
for (target in context.allTargets()) {
- dataManager.getKotlinCache(kotlinBuildTargets[target]!!).clean()
+ dataManager.getKotlinCache(kotlinBuildTargets[target])?.clean()
rebuildAfterCacheVersionChanged[target] = true
}
@@ -703,23 +700,17 @@ private fun getIncrementalCaches(
chunk: ModuleChunk,
context: CompileContext
): Map {
- val dependentTargets = getDependentTargets(chunk, context)
-
val dataManager = context.projectDescriptor.dataManager
val kotlinBuildTargets = context.kotlinBuildTargets
val chunkCaches = chunk.targets.keysToMapExceptNulls {
- val kotlinModuleBuilderTarget = kotlinBuildTargets[it]
- if (kotlinModuleBuilderTarget !is KotlinCommonModuleBuildTarget) {
- dataManager.getKotlinCache(kotlinBuildTargets[it]!!)
- } else null
+ dataManager.getKotlinCache(kotlinBuildTargets[it])
}
+ val dependentTargets = getDependentTargets(chunkCaches.keys, context)
+
val dependentCaches = dependentTargets.mapNotNull {
- val kotlinModuleBuilderTarget = kotlinBuildTargets[it]
- if (kotlinModuleBuilderTarget !is KotlinCommonModuleBuildTarget) {
- dataManager.getKotlinCache(kotlinModuleBuilderTarget!!)
- } else null
+ dataManager.getKotlinCache(kotlinBuildTargets[it])
}
for (chunkCache in chunkCaches.values) {
@@ -732,17 +723,20 @@ private fun getIncrementalCaches(
}
fun getDependentTargets(
- compilingChunk: ModuleChunk,
+ compilingChunkTargets: Set,
context: CompileContext
): Set {
- val compilingChunkIsTests = compilingChunk.targets.any { it.isTests }
+ if (compilingChunkTargets.isEmpty()) return setOf()
+
+ val compilingChunkModules: Set = compilingChunkTargets.mapTo(mutableSetOf()) { it.module }
+ val compilingChunkIsTests = compilingChunkTargets.any { it.isTests }
val classpathKind = JpsJavaClasspathKind.compile(compilingChunkIsTests)
fun dependsOnCompilingChunk(target: BuildTarget<*>): Boolean {
if (target !is ModuleBuildTarget || compilingChunkIsTests && !target.isTests) return false
val dependencies = getDependenciesRecursively(target.module, classpathKind)
- return ContainerUtil.intersects(dependencies, compilingChunk.modules)
+ return ContainerUtil.intersects(dependencies, compilingChunkModules)
}
val dependentTargets = HashSet()
@@ -750,7 +744,7 @@ fun getDependentTargets(
// skip chunks that are compiled before compilingChunk
while (sortedChunks.hasNext()) {
- if (sortedChunks.next().targets == compilingChunk.targets) break
+ if (sortedChunks.next().targets == compilingChunkTargets) break
}
// process chunks that compiled after compilingChunk
diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCache.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCache.kt
index 9d9ac955e5f..8565d3d4014 100644
--- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCache.kt
+++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCache.kt
@@ -60,6 +60,10 @@ private class KotlinIncrementalStorageProvider(
private val target: KotlinModuleBuildTarget,
private val paths: BuildDataPaths
) : StorageProvider() {
+ init {
+ check(target.hasCaches)
+ }
+
override fun equals(other: Any?) = other is KotlinIncrementalStorageProvider && target == other.target
override fun hashCode() = target.hashCode()
@@ -67,6 +71,7 @@ private class KotlinIncrementalStorageProvider(
override fun createStorage(targetDataDir: File): JpsIncrementalCache = target.createCacheStorage(paths)
}
-fun BuildDataManager.getKotlinCache(target: KotlinModuleBuildTarget): JpsIncrementalCache =
- getStorage(target.jpsModuleBuildTarget, KotlinIncrementalStorageProvider(target, dataPaths))
+fun BuildDataManager.getKotlinCache(target: KotlinModuleBuildTarget?): JpsIncrementalCache? =
+ if (target == null || !target.hasCaches) null
+ else getStorage(target.jpsModuleBuildTarget, KotlinIncrementalStorageProvider(target, dataPaths))
diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinCommonModuleBuildTarget.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinCommonModuleBuildTarget.kt
index 0ec0a5c4f5d..f54ab93f672 100644
--- a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinCommonModuleBuildTarget.kt
+++ b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinCommonModuleBuildTarget.kt
@@ -85,5 +85,9 @@ class KotlinCommonModuleBuildTarget(context: CompileContext, jpsModuleBuildTarge
}
}
- override fun createCacheStorage(paths: BuildDataPaths) = JpsIncrementalJvmCache(jpsModuleBuildTarget, paths) // todo: delete
+ override val hasCaches: Boolean
+ get() = false
+
+ override fun createCacheStorage(paths: BuildDataPaths) =
+ error("incremental K2MetadataCompiler not supported yet, createCacheStorage() should not be called")
}
\ No newline at end of file
diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuildTarget.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuildTarget.kt
index d532cad5fbd..64c237213fa 100644
--- a/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuildTarget.kt
+++ b/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuildTarget.kt
@@ -174,6 +174,8 @@ abstract class KotlinModuleBuildTarget(val context: CompileContext, val jpsModul
open fun doAfterBuild() {
}
+ open val hasCaches: Boolean = true
+
abstract fun createCacheStorage(paths: BuildDataPaths): JpsIncrementalCache
/**