Kotlin incremental cache version change should not affect java only modules

This commit is contained in:
Alexey Tsvetkov
2015-11-19 13:48:39 +03:00
parent b1b0da5228
commit a447c39f69
120 changed files with 760 additions and 137 deletions
@@ -28,6 +28,8 @@ import org.jetbrains.jps.builders.impl.BuildTargetRegistryImpl
import org.jetbrains.jps.builders.impl.TargetOutputIndexImpl import org.jetbrains.jps.builders.impl.TargetOutputIndexImpl
import org.jetbrains.jps.builders.java.JavaBuilderUtil import org.jetbrains.jps.builders.java.JavaBuilderUtil
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor
import org.jetbrains.jps.builders.java.dependencyView.Mappings
import org.jetbrains.jps.builders.storage.BuildDataPaths
import org.jetbrains.jps.incremental.* import org.jetbrains.jps.incremental.*
import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.* import org.jetbrains.jps.incremental.ModuleLevelBuilder.ExitCode.*
import org.jetbrains.jps.incremental.fs.CompilationRound import org.jetbrains.jps.incremental.fs.CompilationRound
@@ -73,6 +75,7 @@ import java.util.*
public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
companion object { companion object {
private val TARGETS_WITH_CLEARED_CACHES = Key<Set<ModuleBuildTarget>>("Targets with cleared Kotlin caches") private val TARGETS_WITH_CLEARED_CACHES = Key<Set<ModuleBuildTarget>>("Targets with cleared Kotlin caches")
private val HAS_KOTLIN_FILE_NAME = "has-kotlin.txt"
public val KOTLIN_BUILDER_NAME: String = "Kotlin Builder" public val KOTLIN_BUILDER_NAME: String = "Kotlin Builder"
public val LOOKUP_TRACKER: JpsElementChildRoleBase<JpsSimpleElement<out LookupTracker>> = JpsElementChildRoleBase.create("lookup tracker") public val LOOKUP_TRACKER: JpsElementChildRoleBase<JpsSimpleElement<out LookupTracker>> = JpsElementChildRoleBase.create("lookup tracker")
@@ -91,6 +94,21 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
context.putUserData(TARGETS_WITH_CLEARED_CACHES, data) context.putUserData(TARGETS_WITH_CLEARED_CACHES, data)
} }
} }
private fun hasKotlin(target: ModuleBuildTarget, paths: BuildDataPaths): Boolean {
val hasKotlinFile = File(paths.getTargetDataRoot(target), HAS_KOTLIN_FILE_NAME)
return hasKotlinFile.exists()
}
private fun setHasKotlin(target: ModuleBuildTarget, paths: BuildDataPaths) {
val hasKotlinFile = File(paths.getTargetDataRoot(target), HAS_KOTLIN_FILE_NAME)
hasKotlinFile.createNewFile()
}
fun clearHasKotlin(target: ModuleBuildTarget, paths: BuildDataPaths) {
val hasKotlinFile = File(paths.getTargetDataRoot(target), HAS_KOTLIN_FILE_NAME)
hasKotlinFile.delete()
}
} }
private val statisticsLogger = TeamcityStatisticsLogger() private val statisticsLogger = TeamcityStatisticsLogger()
@@ -123,11 +141,6 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
try { try {
val exitCode = doBuild(chunk, context, dirtyFilesHolder, messageCollector, outputConsumer) val exitCode = doBuild(chunk, context, dirtyFilesHolder, messageCollector, outputConsumer)
LOG.debug("Build result: " + exitCode) LOG.debug("Build result: " + exitCode)
if (exitCode != ExitCode.CHUNK_REBUILD_REQUIRED && exitCode != ABORT) {
saveVersions(context, chunk)
}
return exitCode return exitCode
} }
catch (e: StopBuildException) { catch (e: StopBuildException) {
@@ -163,17 +176,22 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
val targets = chunk.targets val targets = chunk.targets
val requestedToRebuild = context.getUserData(TARGETS_WITH_CLEARED_CACHES) ?: setOf() val requestedToRebuild = context.getUserData(TARGETS_WITH_CLEARED_CACHES) ?: setOf()
val isFullRebuild = JavaBuilderUtil.isForcedRecompilationAllJavaModules(context) val isFullRebuild = JavaBuilderUtil.isForcedRecompilationAllJavaModules(context)
val hasDirtyKotlin = (dirtyFilesHolder.hasDirtyFiles() || dirtyFilesHolder.hasRemovedFiles()) &&
hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk)
if (!isFullRebuild && !requestedToRebuild.containsAll(targets)) { if (!isFullRebuild &&
val exitCode = checkVersions(context, dataManager, targets) !requestedToRebuild.containsAll(targets) &&
(hasDirtyKotlin || targets.any { hasKotlin(it, dataManager.dataPaths) }) &&
if (exitCode != null) return exitCode shouldRebuildBecauseVersionChanged(context, dataManager, targets)
) {
FSOperations.markDirtyRecursively(context, CompilationRound.NEXT, chunk) { KotlinSourceFileCollector.isKotlinSourceFile(it) }
return CHUNK_REBUILD_REQUIRED
} }
if (!dirtyFilesHolder.hasDirtyFiles() && if (hasDirtyKotlin) {
!dirtyFilesHolder.hasRemovedFiles() || targets.forEach { setHasKotlin(it, dataManager.dataPaths) }
!hasKotlinDirtyOrRemovedFiles(dirtyFilesHolder, chunk) }
) { else {
return NOTHING_DONE return NOTHING_DONE
} }
@@ -218,6 +236,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
val generatedFiles = getGeneratedFiles(chunk, outputItemCollector) val generatedFiles = getGeneratedFiles(chunk, outputItemCollector)
registerOutputItems(outputConsumer, generatedFiles) registerOutputItems(outputConsumer, generatedFiles)
saveVersions(context, chunk)
if (JpsUtils.isJsKotlinModule(chunk.representativeTarget())) { if (JpsUtils.isJsKotlinModule(chunk.representativeTarget())) {
copyJsLibraryFilesIfNeeded(chunk, project) copyJsLibraryFilesIfNeeded(chunk, project)
@@ -330,15 +349,12 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
} }
private fun checkVersions(context: CompileContext, dataManager: BuildDataManager, targets: MutableSet<ModuleBuildTarget>): ExitCode? { private fun shouldRebuildBecauseVersionChanged(context: CompileContext, dataManager: BuildDataManager, targets: MutableSet<ModuleBuildTarget>): Boolean {
val cacheVersionsProvider = CacheVersionProvider(dataManager.dataPaths) val cacheVersionsProvider = CacheVersionProvider(dataManager.dataPaths)
val allVersions = cacheVersionsProvider.allVersions(targets) val allVersions = cacheVersionsProvider.allVersions(targets)
val actions = allVersions.map { it.checkVersion() }.toSet().sorted() val actions = allVersions.map { it.checkVersion() }.toSet().sorted()
val buildTargetIndex = context.projectDescriptor.buildTargetIndex
fun cleanNormalCaches() { val allTargets = buildTargetIndex.allTargets.filterIsInstance<ModuleBuildTarget>().toSet()
LOG.info("Clearing caches for " + targets.joinToString { it.presentableName })
targets.forEach { dataManager.getKotlinCache(it).clean() }
}
for (status in actions) { for (status in actions) {
when (status) { when (status) {
@@ -354,29 +370,37 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
} }
} }
val buildTargetIndex = context.projectDescriptor.buildTargetIndex for (target in allTargets) {
val allTargets = buildTargetIndex.allTargets.filterIsInstance<ModuleBuildTarget>().toSet()
for (target in targets) {
dataManager.getKotlinCache(target).clean() dataManager.getKotlinCache(target).clean()
// prevents excessive version checking in parallel compilation (user data is not shared in parallel compilation)
clearHasKotlin(target, dataManager.dataPaths)
} }
dataManager.getStorage(KotlinDataContainerTarget, LookupStorageProvider).clean() dataManager.getStorage(KotlinDataContainerTarget, LookupStorageProvider).clean()
registerTargetsWithClearedCaches(context, allTargets) registerTargetsWithClearedCaches(context, allTargets)
return CHUNK_REBUILD_REQUIRED return true
} }
CacheVersion.Action.REBUILD_CHUNK -> { CacheVersion.Action.REBUILD_CHUNK -> {
cleanNormalCaches() LOG.info("Clearing caches for " + targets.joinToString { it.presentableName })
targets.forEach { dataManager.getKotlinCache(it).clean() }
registerTargetsWithClearedCaches(context, targets) registerTargetsWithClearedCaches(context, targets)
return CHUNK_REBUILD_REQUIRED return true
} }
CacheVersion.Action.CLEAN_NORMAL_CACHES -> { CacheVersion.Action.CLEAN_NORMAL_CACHES -> {
cleanNormalCaches() LOG.info("Clearing caches for all targets")
for (target in allTargets) {
dataManager.getKotlinCache(target).clean()
}
} }
CacheVersion.Action.CLEAN_EXPERIMENTAL_CACHES -> { CacheVersion.Action.CLEAN_EXPERIMENTAL_CACHES -> {
LOG.info("Clearing experimental caches for " + targets.joinToString { it.presentableName }) LOG.info("Clearing experimental caches for all targets")
targets.forEach { dataManager.getKotlinCache(it).cleanExperimental() }
for (target in allTargets) {
dataManager.getKotlinCache(target).cleanExperimental()
}
} }
CacheVersion.Action.CLEAN_DATA_CONTAINER -> { CacheVersion.Action.CLEAN_DATA_CONTAINER -> {
LOG.info("Clearing lookup cache") LOG.info("Clearing lookup cache")
@@ -389,7 +413,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
} }
} }
return null return false
} }
private fun saveVersions(context: CompileContext, chunk: ModuleChunk) { private fun saveVersions(context: CompileContext, chunk: ModuleChunk) {
@@ -21,10 +21,20 @@ import org.jetbrains.kotlin.jps.incremental.CacheVersionProvider
abstract class AbstractIncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(allowNoFilesWithSuffixInTestData = true) { abstract class AbstractIncrementalCacheVersionChangedTest : AbstractIncrementalJpsTest(allowNoFilesWithSuffixInTestData = true) {
override fun performAdditionalModifications(modifications: List<AbstractIncrementalJpsTest.Modification>) { override fun performAdditionalModifications(modifications: List<AbstractIncrementalJpsTest.Modification>) {
val cacheVersionProvider = CacheVersionProvider(projectDescriptor.dataManager.dataPaths) val modifiedFiles = modifications.filterIsInstance<ModifyContent>().map { it.path }
val versions = getVersions(cacheVersionProvider, projectDescriptor.allModuleTargets) val paths = projectDescriptor.dataManager.dataPaths
val versionFiles = versions.map { it.formatVersionFile }.filter { it.exists() } val targets = projectDescriptor.allModuleTargets
versionFiles.forEach { it.writeText("777") }
if (modifiedFiles.any { it.endsWith("clear-has-kotlin") }) {
targets.forEach { KotlinBuilder.clearHasKotlin(it, paths) }
}
if (modifiedFiles.none { it.endsWith("do-not-change-cache-versions") }) {
val cacheVersionProvider = CacheVersionProvider(paths)
val versions = getVersions(cacheVersionProvider, targets)
val versionFiles = versions.map { it.formatVersionFile }.filter { it.exists() }
versionFiles.forEach { it.writeText("777") }
}
} }
protected open fun getVersions(cacheVersionProvider: CacheVersionProvider, targets: Iterable<ModuleBuildTarget>) = protected open fun getVersions(cacheVersionProvider: CacheVersionProvider, targets: Iterable<ModuleBuildTarget>) =
@@ -51,8 +51,10 @@ public abstract class AbstractIncrementalLazyCachesTest : AbstractIncrementalJps
for (modification in modifications) { for (modification in modifications) {
if (modification !is AbstractIncrementalJpsTest.ModifyContent) continue if (modification !is AbstractIncrementalJpsTest.ModifyContent) continue
when (File(modification.path).name) { val name = File(modification.path).name
"incremental-compilation" -> {
when {
name.endsWith("incremental-compilation") -> {
if (modification.dataFile.readAsBool()) { if (modification.dataFile.readAsBool()) {
IncrementalCompilation.enableIncrementalCompilation() IncrementalCompilation.enableIncrementalCompilation()
} }
@@ -60,7 +62,7 @@ public abstract class AbstractIncrementalLazyCachesTest : AbstractIncrementalJps
IncrementalCompilation.disableIncrementalCompilation() IncrementalCompilation.disableIncrementalCompilation()
} }
} }
"experimental-compilation" -> { name.endsWith("experimental-compilation") -> {
if (modification.dataFile.readAsBool()) { if (modification.dataFile.readAsBool()) {
IncrementalCompilation.enableExperimental() IncrementalCompilation.enableExperimental()
} }
@@ -35,12 +35,24 @@ public class DataContainerVersionChangedTestGenerated extends AbstractDataContai
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true); KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true);
} }
@TestMetadata("clearedHasKotlin")
public void testClearedHasKotlin() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/");
doTest(fileName);
}
@TestMetadata("exportedModule") @TestMetadata("exportedModule")
public void testExportedModule() throws Exception { public void testExportedModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("javaOnlyModulesAreNotAffected")
public void testJavaOnlyModulesAreNotAffected() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/javaOnlyModulesAreNotAffected/");
doTest(fileName);
}
@TestMetadata("module1Modified") @TestMetadata("module1Modified")
public void testModule1Modified() throws Exception { public void testModule1Modified() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/");
@@ -71,10 +83,22 @@ public class DataContainerVersionChangedTestGenerated extends AbstractDataContai
doTest(fileName); doTest(fileName);
} }
@TestMetadata("touchedOnlyJavaFile")
public void testTouchedOnlyJavaFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/touchedOnlyJavaFile/");
doTest(fileName);
}
@TestMetadata("untouchedFiles") @TestMetadata("untouchedFiles")
public void testUntouchedFiles() throws Exception { public void testUntouchedFiles() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("withError")
public void testWithError() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/withError/");
doTest(fileName);
}
} }
@@ -41,6 +41,18 @@ public class ExperimentalChangeIncrementalOptionTestGenerated extends AbstractEx
doTest(fileName); doTest(fileName);
} }
@TestMetadata("experimentalOnJavaChanged")
public void testExperimentalOnJavaChanged() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/changeIncrementalOption/experimentalOnJavaChanged/");
doTest(fileName);
}
@TestMetadata("experimentalOnJavaOnly")
public void testExperimentalOnJavaOnly() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/changeIncrementalOption/experimentalOnJavaOnly/");
doTest(fileName);
}
@TestMetadata("experimentalOnOff") @TestMetadata("experimentalOnOff")
public void testExperimentalOnOff() throws Exception { public void testExperimentalOnOff() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/changeIncrementalOption/experimentalOnOff/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/changeIncrementalOption/experimentalOnOff/");
@@ -35,12 +35,24 @@ public class ExperimentalIncrementalCacheVersionChangedTestGenerated extends Abs
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true); KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true);
} }
@TestMetadata("clearedHasKotlin")
public void testClearedHasKotlin() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/");
doTest(fileName);
}
@TestMetadata("exportedModule") @TestMetadata("exportedModule")
public void testExportedModule() throws Exception { public void testExportedModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("javaOnlyModulesAreNotAffected")
public void testJavaOnlyModulesAreNotAffected() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/javaOnlyModulesAreNotAffected/");
doTest(fileName);
}
@TestMetadata("module1Modified") @TestMetadata("module1Modified")
public void testModule1Modified() throws Exception { public void testModule1Modified() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/");
@@ -71,10 +83,22 @@ public class ExperimentalIncrementalCacheVersionChangedTestGenerated extends Abs
doTest(fileName); doTest(fileName);
} }
@TestMetadata("touchedOnlyJavaFile")
public void testTouchedOnlyJavaFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/touchedOnlyJavaFile/");
doTest(fileName);
}
@TestMetadata("untouchedFiles") @TestMetadata("untouchedFiles")
public void testUntouchedFiles() throws Exception { public void testUntouchedFiles() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("withError")
public void testWithError() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/withError/");
doTest(fileName);
}
} }
@@ -35,12 +35,24 @@ public class IncrementalCacheVersionChangedTestGenerated extends AbstractIncreme
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true); KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/cacheVersionChanged"), Pattern.compile("^([^\\.]+)$"), true);
} }
@TestMetadata("clearedHasKotlin")
public void testClearedHasKotlin() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/clearedHasKotlin/");
doTest(fileName);
}
@TestMetadata("exportedModule") @TestMetadata("exportedModule")
public void testExportedModule() throws Exception { public void testExportedModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/exportedModule/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("javaOnlyModulesAreNotAffected")
public void testJavaOnlyModulesAreNotAffected() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/javaOnlyModulesAreNotAffected/");
doTest(fileName);
}
@TestMetadata("module1Modified") @TestMetadata("module1Modified")
public void testModule1Modified() throws Exception { public void testModule1Modified() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/module1Modified/");
@@ -71,10 +83,22 @@ public class IncrementalCacheVersionChangedTestGenerated extends AbstractIncreme
doTest(fileName); doTest(fileName);
} }
@TestMetadata("touchedOnlyJavaFile")
public void testTouchedOnlyJavaFile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/touchedOnlyJavaFile/");
doTest(fileName);
}
@TestMetadata("untouchedFiles") @TestMetadata("untouchedFiles")
public void testUntouchedFiles() throws Exception { public void testUntouchedFiles() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/"); String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/untouchedFiles/");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("withError")
public void testWithError() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/cacheVersionChanged/withError/");
doTest(fileName);
}
} }
@@ -57,7 +57,8 @@ import java.io.*
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
import kotlin.test.* import kotlin.test.assertFalse
import kotlin.test.assertTrue
public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
companion object { companion object {
@@ -234,7 +235,7 @@ public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
val buildResult = makeAll() val buildResult = makeAll()
buildResult.assertSuccessful() buildResult.assertSuccessful()
val warnings = buildResult.getMessages(BuildMessage.Kind.WARNING) val warnings = buildResult.getMessages(BuildMessage.Kind.WARNING)
assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 2, warnings.size) assertEquals("Warning about invalid package prefix in module 2 is expected: $warnings", 1, warnings.size)
assertEquals("Invalid package prefix name is ignored: invalid-prefix.test", warnings.first().messageText) assertEquals("Invalid package prefix name is ignored: invalid-prefix.test", warnings.first().messageText)
} }
@@ -0,0 +1,36 @@
Cleaning output files:
out/production/module1/C.class
End of files
Compiling files:
module1/src/module1_C.java
End of files
Cleaning output files:
out/production/module1/A.class
End of files
Cleaning output files:
out/production/module1/B.class
out/production/module1/C.class
out/production/module1/D.class
End of files
Compiling files:
module1/src/module1_A.kt
module1/src/module1_B.kt
End of files
Compiling files:
module1/src/module1_C.java
module1/src/module1_D.java
End of files
Cleaning output files:
out/production/module2/E.class
End of files
Compiling files:
module2/src/module2_E.kt
End of files
Cleaning output files:
out/production/module3/F.class
End of files
Compiling files:
module3/src/module3_F.kt
End of files
@@ -0,0 +1,36 @@
Cleaning output files:
out/production/module1/C.class
End of files
Compiling files:
module1/src/module1_C.java
End of files
Cleaning output files:
out/production/module1/A.class
End of files
Cleaning output files:
out/production/module1/B.class
out/production/module1/C.class
out/production/module1/D.class
End of files
Compiling files:
module1/src/module1_A.kt
module1/src/module1_B.kt
End of files
Compiling files:
module1/src/module1_C.java
module1/src/module1_D.java
End of files
Cleaning output files:
out/production/module2/E.class
End of files
Compiling files:
module2/src/module2_E.kt
End of files
Cleaning output files:
out/production/module3/F.class
End of files
Compiling files:
module3/src/module3_F.kt
End of files
@@ -0,0 +1,3 @@
module1->
module2->module1
module3->module2
@@ -0,0 +1 @@
class A
@@ -0,0 +1 @@
class B
@@ -0,0 +1 @@
class C {}
@@ -0,0 +1 @@
class C {}
@@ -0,0 +1 @@
class D {}
@@ -0,0 +1 @@
class E
@@ -0,0 +1 @@
class F
@@ -0,0 +1,14 @@
Cleaning output files:
out/production/module1/A.class
End of files
Compiling files:
module1/src/module1_A.java
End of files
Cleaning output files:
out/production/module1/B.class
End of files
Compiling files:
module1/src/module1_B.java
End of files
@@ -0,0 +1,14 @@
Cleaning output files:
out/production/module1/A.class
End of files
Compiling files:
module1/src/module1_A.java
End of files
Cleaning output files:
out/production/module1/B.class
End of files
Compiling files:
module1/src/module1_B.java
End of files
@@ -0,0 +1,3 @@
module1->
module2->module1
module3->module2
@@ -1,10 +1,4 @@
Cleaning output files: Cleaning output files:
out/production/module5/module5/E.class
End of files
Compiling files:
module5/src/module5_E.java
End of files
Cleaning output files:
out/production/module4/module4/D.class out/production/module4/module4/D.class
End of files End of files
Compiling files: Compiling files:
@@ -1,10 +1,4 @@
Cleaning output files: Cleaning output files:
out/production/module5/module5/E.class
End of files
Compiling files:
module5/src/module5_E.java
End of files
Cleaning output files:
out/production/module4/module4/D.class out/production/module4/module4/D.class
End of files End of files
Compiling files: Compiling files:
@@ -7,6 +7,8 @@ module1/src/module1_A.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module2/b/B.class out/production/module2/b/B.class
End of files
Cleaning output files:
out/production/module2/b/C.class out/production/module2/b/C.class
End of files End of files
Compiling files: Compiling files:
@@ -0,0 +1 @@
class A {}
@@ -0,0 +1 @@
class A {}
@@ -0,0 +1,5 @@
package test
fun f() {
other.other()
}
@@ -0,0 +1,5 @@
package test
fun g() {
other.other()
}
@@ -0,0 +1,17 @@
Cleaning output files:
out/production/module/A.class
End of files
Cleaning output files:
out/production/module/META-INF/module.kotlin_module
out/production/module/other/OtherKt.class
out/production/module/test/AKt.class
out/production/module/test/BKt.class
End of files
Compiling files:
src/a.kt
src/b.kt
src/other.kt
End of files
Compiling files:
src/A.java
End of files
@@ -0,0 +1,17 @@
Cleaning output files:
out/production/module/A.class
End of files
Cleaning output files:
out/production/module/META-INF/module.kotlin_module
out/production/module/other/OtherKt.class
out/production/module/test/AKt.class
out/production/module/test/BKt.class
End of files
Compiling files:
src/a.kt
src/b.kt
src/other.kt
End of files
Compiling files:
src/A.java
End of files
@@ -0,0 +1,4 @@
package other
fun other() {
}
@@ -0,0 +1,40 @@
Cleaning output files:
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/module4_d.kt
End of files
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/module1/A.class
out/production/module1/module1/Module1_aKt.class
End of files
Cleaning output files:
out/production/module1/module1/Module1_fKt.class
End of files
Compiling files:
module1/src/module1_a.kt
module1/src/module1_f.kt
End of files
COMPILATION FAILED
Name expected
Compiling files:
module1/src/module1_a.kt
module1/src/module1_f.kt
End of files
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/module2/Module2_bKt.class
End of files
Compiling files:
module2/src/module2_b.kt
End of files
Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module
out/production/module3/module3/Module3_cKt.class
End of files
Compiling files:
module3/src/module3_c.kt
End of files
@@ -0,0 +1,38 @@
Cleaning output files:
out/production/module4/module4/D.class
End of files
Compiling files:
module4/src/module4_d.kt
End of files
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/module1/A.class
out/production/module1/module1/Module1_aKt.class
out/production/module1/module1/Module1_fKt.class
End of files
Compiling files:
module1/src/module1_a.kt
module1/src/module1_f.kt
End of files
COMPILATION FAILED
Name expected
Compiling files:
module1/src/module1_a.kt
module1/src/module1_f.kt
End of files
Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/module2/Module2_bKt.class
End of files
Compiling files:
module2/src/module2_b.kt
End of files
Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module
out/production/module3/module3/Module3_cKt.class
End of files
Compiling files:
module3/src/module3_c.kt
End of files
@@ -0,0 +1,5 @@
module1->
module2->module1
module3->module2
module4->
module5->
@@ -0,0 +1,6 @@
package module1
class A
fun a() {
}
@@ -0,0 +1,3 @@
package module1
class
@@ -0,0 +1,6 @@
package module1
class A
fun a() {
}
@@ -0,0 +1,3 @@
package module1
fun f() {}
@@ -0,0 +1,8 @@
package module2
import module1.*
fun b() {
A()
a()
}
@@ -0,0 +1,7 @@
package module3
import module2.*
fun c() {
b()
}
@@ -0,0 +1,3 @@
package module4
class D
@@ -0,0 +1,3 @@
package module5;
class E {}
@@ -1,26 +1,42 @@
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module1/foo/Z.class
out/production/module/foo/A.class
out/production/module/foo/AKt.class
End of files
Cleaning output files:
out/production/module/foo/B.class
out/production/module/foo/BKt.class
out/production/module/foo/C.class
out/production/module/foo/CKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module1/src/module1_z.kt
src/b.kt End of files
src/c.kt Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/foo/A.class
out/production/module2/foo/B.class
out/production/module2/foo/C.class
out/production/module2/foo/Module2_aKt.class
out/production/module2/foo/Module2_bKt.class
out/production/module2/foo/Module2_cKt.class
End of files
Compiling files:
module2/src/module2_a.kt
module2/src/module2_b.kt
module2/src/module2_c.kt
End of files
Cleaning output files:
out/production/module3/foo/D.class
End of files
Compiling files:
module3/src/module3_d.kt
End of files
Cleaning output files:
out/production/module4/foo/E.class
End of files
Compiling files:
module4/src/module4_e.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/A.class out/production/module2/foo/A.class
out/production/module/foo/AKt.class out/production/module2/foo/Module2_aKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module2/src/module2_a.kt
End of files End of files
@@ -0,0 +1,4 @@
module1->
module2->module1
module3->module2
module4->module3
@@ -4,10 +4,28 @@ kotlin-data-container
file-to-id.tab file-to-id.tab
id-to-file.tab id-to-file.tab
lookups.tab lookups.tab
Module 'module' production Module 'module1' production
experimental-format-version.txt
format-version.txt
proto.tab
source-to-classes.tab
Module 'module1' tests
Module 'module2' production
experimental-format-version.txt experimental-format-version.txt
format-version.txt format-version.txt
package-parts.tab package-parts.tab
proto.tab proto.tab
source-to-classes.tab source-to-classes.tab
Module 'module' tests Module 'module2' tests
Module 'module3' production
experimental-format-version.txt
format-version.txt
proto.tab
source-to-classes.tab
Module 'module3' tests
Module 'module4' production
experimental-format-version.txt
format-version.txt
proto.tab
source-to-classes.tab
Module 'module4' tests
@@ -0,0 +1,3 @@
package foo
class Z
@@ -0,0 +1,3 @@
package foo
class D
@@ -0,0 +1,3 @@
package foo
class E
@@ -0,0 +1,25 @@
Cleaning output files:
out/production/module1/META-INF/module1.kotlin_module
out/production/module1/Module1_aKt.class
End of files
Compiling files:
module1/src/module1_a.kt
End of files
Cleaning output files:
out/production/module2/B.class
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/Module2_cKt.class
End of files
Compiling files:
module2/src/module2_c.kt
End of files
Compiling files:
module2/src/module2_B.java
End of files
Cleaning output files:
out/production/module3/META-INF/module3.kotlin_module
out/production/module3/Module3_dKt.class
End of files
Compiling files:
module3/src/module3_d.kt
End of files
@@ -0,0 +1,3 @@
module1->
module2->module1
module3->module2
@@ -0,0 +1,27 @@
kotlin-data-container
data-container-format-version.txt
counters.tab
file-to-id.tab
id-to-file.tab
lookups.tab
Module 'module1' production
experimental-format-version.txt
format-version.txt
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module1' tests
Module 'module2' production
experimental-format-version.txt
format-version.txt
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module2' tests
Module 'module3' production
experimental-format-version.txt
format-version.txt
package-parts.tab
proto.tab
source-to-classes.tab
Module 'module3' tests
@@ -0,0 +1 @@
class A {}
@@ -0,0 +1 @@
class B {}
@@ -0,0 +1,6 @@
Cleaning output files:
out/production/module/A.class
End of files
Compiling files:
src/A.java
End of files
@@ -0,0 +1,3 @@
kotlin-data-container
Module 'module' production
Module 'module' tests
@@ -1,47 +1,63 @@
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module1/foo/Z.class
out/production/module/foo/A.class
out/production/module/foo/AKt.class
End of files
Cleaning output files:
out/production/module/foo/B.class
out/production/module/foo/BKt.class
out/production/module/foo/C.class
out/production/module/foo/CKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module1/src/module1_z.kt
src/b.kt End of files
src/c.kt Cleaning output files:
out/production/module2/META-INF/module2.kotlin_module
out/production/module2/foo/A.class
out/production/module2/foo/B.class
out/production/module2/foo/C.class
out/production/module2/foo/Module2_aKt.class
out/production/module2/foo/Module2_bKt.class
out/production/module2/foo/Module2_cKt.class
End of files
Compiling files:
module2/src/module2_a.kt
module2/src/module2_b.kt
module2/src/module2_c.kt
End of files
Cleaning output files:
out/production/module3/foo/D.class
End of files
Compiling files:
module3/src/module3_d.kt
End of files
Cleaning output files:
out/production/module4/foo/E.class
End of files
Compiling files:
module4/src/module4_e.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/A.class out/production/module2/foo/A.class
out/production/module/foo/AKt.class out/production/module2/foo/Module2_aKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module2/src/module2_a.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/A.class out/production/module2/foo/A.class
out/production/module/foo/AKt.class out/production/module2/foo/Module2_aKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module2/src/module2_a.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/B.class out/production/module2/foo/B.class
out/production/module/foo/BKt.class out/production/module2/foo/C.class
out/production/module/foo/C.class out/production/module2/foo/Module2_bKt.class
out/production/module/foo/CKt.class out/production/module2/foo/Module2_cKt.class
End of files End of files
Compiling files: Compiling files:
src/b.kt module2/src/module2_b.kt
src/c.kt module2/src/module2_c.kt
End of files End of files
@@ -0,0 +1,4 @@
module1->
module2->module1
module3->module2
module4->module3
@@ -1,7 +1,22 @@
kotlin-data-container kotlin-data-container
Module 'module' production Module 'module1' production
format-version.txt
proto.tab
source-to-classes.tab
Module 'module1' tests
Module 'module2' production
format-version.txt format-version.txt
package-parts.tab package-parts.tab
proto.tab proto.tab
source-to-classes.tab source-to-classes.tab
Module 'module' tests Module 'module2' tests
Module 'module3' production
format-version.txt
proto.tab
source-to-classes.tab
Module 'module3' tests
Module 'module4' production
format-version.txt
proto.tab
source-to-classes.tab
Module 'module4' tests
@@ -0,0 +1,3 @@
package foo
class Z
@@ -0,0 +1,3 @@
package foo
class D
@@ -0,0 +1,3 @@
package foo
class E
@@ -1,20 +1,20 @@
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/AKt.class out/production/module2/foo/Module2_aKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module2/src/module2_a.kt
src/b.kt module2/src/module2_b.kt
src/c.kt module2/src/module2_c.kt
End of files End of files
Cleaning output files: Cleaning output files:
out/production/module/META-INF/module.kotlin_module out/production/module2/META-INF/module2.kotlin_module
out/production/module/foo/AKt.class out/production/module2/foo/Module2_aKt.class
End of files End of files
Compiling files: Compiling files:
src/a.kt module2/src/module2_a.kt
src/b.kt module2/src/module2_b.kt
src/c.kt module2/src/module2_c.kt
End of files End of files
@@ -0,0 +1,4 @@
module1->
module2->module1
module3->module2
module4->module3
@@ -1,3 +1,9 @@
kotlin-data-container kotlin-data-container
Module 'module' production Module 'module1' production
Module 'module' tests Module 'module1' tests
Module 'module2' production
Module 'module2' tests
Module 'module3' production
Module 'module3' tests
Module 'module4' production
Module 'module4' tests
@@ -0,0 +1,3 @@
package foo
class Z

Some files were not shown because too many files have changed in this diff Show More