diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java index aeab6644286..4e54bd3242b 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java @@ -176,6 +176,12 @@ public class IncrementalJsCompilerRunnerTestGenerated extends AbstractIncrementa doTest(fileName); } + @TestMetadata("constantValueChanged") + public void testConstantValueChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantValueChanged/"); + doTest(fileName); + } + @TestMetadata("constantsUnchanged") public void testConstantsUnchanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantsUnchanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java index 266856cea56..c9ede94340a 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java @@ -176,6 +176,12 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement doTest(fileName); } + @TestMetadata("constantValueChanged") + public void testConstantValueChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantValueChanged/"); + doTest(fileName); + } + @TestMetadata("constantsUnchanged") public void testConstantsUnchanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantsUnchanged/"); 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 04eafa7c03a..47475dbf6c3 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 @@ -22,6 +22,7 @@ import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtilRt import com.intellij.testFramework.TestLoggerFactory import com.intellij.testFramework.UsefulTestCase +import com.intellij.util.concurrency.FixedFuture import junit.framework.TestCase import org.apache.log4j.ConsoleAppender import org.apache.log4j.Level @@ -45,7 +46,6 @@ import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.incremental.CacheVersion import org.jetbrains.kotlin.incremental.LookupSymbol -import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.testingUtils.* import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageProvider import org.jetbrains.kotlin.jps.incremental.KotlinDataContainerTarget @@ -55,6 +55,7 @@ import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.keysToMap import java.io.* import java.util.* +import java.util.concurrent.Future import kotlin.reflect.jvm.javaField abstract class AbstractIncrementalJpsTest( @@ -130,11 +131,14 @@ abstract class AbstractIncrementalJpsTest( super.tearDown() } + // JPS forces rebuild of all files when JVM constant has been changed and Callbacks.ConstantAffectionResolver + // is not provided, so ConstantAffectionResolver is mocked with empty implementation protected open val mockConstantSearch: Callbacks.ConstantAffectionResolver? - get() = null + get() = MockConstantSearch(workDir) private fun build(scope: CompileScopeTestBuilder = CompileScopeTestBuilder.make().allModules()): MakeResult { val workDirPath = FileUtil.toSystemIndependentName(workDir.absolutePath) + val logger = MyLogger(workDirPath) projectDescriptor = createProjectDescriptor(BuildLoggingManager(logger)) @@ -476,6 +480,23 @@ abstract class AbstractIncrementalJpsTest( } } +private class MockConstantSearch(private val workDir: File) : Callbacks.ConstantAffectionResolver { + override fun request( + ownerClassName: String, + fieldName: String, + accessFlags: Int, + fieldRemoved: Boolean, + accessChanged: Boolean + ): Future { + val affectedFiles = workDir.walk().filter { it.isFile && it.isNameUsage() } + return FixedFuture(Callbacks.ConstantAffection(affectedFiles.toList())) + } + + private fun File.isNameUsage(): Boolean = + name.equals("usage.kt", ignoreCase = true) + || name.equals("usage.java", ignoreCase = true) +} + internal val ProjectDescriptor.allModuleTargets: Collection get() = buildTargetIndex.allTargets.filterIsInstance() diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index d305ec368f4..0c9f5b8810e 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -347,6 +347,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("constantValueChanged") + public void testConstantValueChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantValueChanged/"); + doTest(fileName); + } + @TestMetadata("constantsUnchanged") public void testConstantsUnchanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/constantsUnchanged/"); diff --git a/jps-plugin/testData/incremental/lazyKotlinCaches/constant/build.log b/jps-plugin/testData/incremental/lazyKotlinCaches/constant/build.log index efacb1f6e61..f7eb1e89b43 100644 --- a/jps-plugin/testData/incremental/lazyKotlinCaches/constant/build.log +++ b/jps-plugin/testData/incremental/lazyKotlinCaches/constant/build.log @@ -13,12 +13,10 @@ Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: out/production/module/META-INF/module.kotlin_module - out/production/module/constant/ConstantKt.class out/production/module/usage/UsageKt.class End of files Compiling files: - src/constant.kt src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/constantValueChanged/build.log b/jps-plugin/testData/incremental/multiModule/constantValueChanged/build.log index 8372482bd22..22a4e112d5d 100644 --- a/jps-plugin/testData/incremental/multiModule/constantValueChanged/build.log +++ b/jps-plugin/testData/incremental/multiModule/constantValueChanged/build.log @@ -12,14 +12,7 @@ Marked as dirty by Kotlin: module2/src/usage.kt Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ -Cleaning output files: - out/production/module1/META-INF/module1.kotlin_module - out/production/module1/test/ConstKt.class -End of files -Compiling files: - module1/src/const.kt -End of files -Exit code: OK +Exit code: NOTHING_DONE ------------------------------------------ Building module2 Cleaning output files: @@ -29,4 +22,4 @@ Compiling files: module2/src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/allConstants/build.log b/jps-plugin/testData/incremental/pureKotlin/allConstants/build.log index 2b59cc2ecff..f2ac1d7ced7 100644 --- a/jps-plugin/testData/incremental/pureKotlin/allConstants/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/allConstants/build.log @@ -24,13 +24,10 @@ Marked as dirty by Kotlin: Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: - out/production/module/META-INF/module.kotlin_module - out/production/module/test/ConstKt.class out/production/module/test/Usage.class End of files Compiling files: - src/const.kt src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/classObjectConstantChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/classObjectConstantChanged/build.log index 8b4f21d7ead..00df1933e85 100644 --- a/jps-plugin/testData/incremental/pureKotlin/classObjectConstantChanged/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/classObjectConstantChanged/build.log @@ -12,12 +12,9 @@ Marked as dirty by Kotlin: Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: - out/production/module/test/Klass$Companion.class - out/production/module/test/Klass.class out/production/module/test/Usage.class End of files Compiling files: - src/const.kt src/usage.kt End of files Exit code: OK diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/build.log b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/build.log index 85fd6b8ac98..7bee54522bb 100644 --- a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/build.log @@ -7,5 +7,30 @@ End of files Compiling files: src/const.kt End of files -Exit code: OK +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/UsageKt.class +End of files +Compiling files: + src/usage.kt +End of files +Exit code: ABORT +------------------------------------------ +COMPILATION FAILED +Unresolved reference: FOO + +================ Step #2 ================= + +Cleaning output files: + out/production/module/test/ConstKt.class +End of files +Compiling files: + src/const.kt + src/usage.kt +End of files +Exit code: OK +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt index 1572968f89f..61ac808acc8 100644 --- a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt @@ -1,3 +1,4 @@ package test -val CONST = "foo" +const val FOO = "foo" +const val BAR = "bar" diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new deleted file mode 100644 index c3a4d742273..00000000000 --- a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new +++ /dev/null @@ -1,3 +0,0 @@ -package test - -val CONST = "I'm not a constant anymore:" + System.currentTimeMillis() diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new.1 b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new.1 new file mode 100644 index 00000000000..fb3656ffd52 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/const.kt.new.1 @@ -0,0 +1,3 @@ +package test + +const val BAR = "bar" diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/dummy.kt b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/dummy.kt new file mode 100644 index 00000000000..789dc274f72 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/dummy.kt @@ -0,0 +1,3 @@ +package test + +fun dummy() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt new file mode 100644 index 00000000000..edeefdc40b5 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt @@ -0,0 +1,5 @@ +package test + +fun usage() { + println(FOO) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt.new.2 b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt.new.2 new file mode 100644 index 00000000000..40cde0ce055 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantRemoved/usage.kt.new.2 @@ -0,0 +1,4 @@ +package test + +fun usage() { +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/build.log new file mode 100644 index 00000000000..9a77b7869a5 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/build.log @@ -0,0 +1,22 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class +End of files +Compiling files: + src/const.kt +End of files +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/UsageKt.class +End of files +Compiling files: + src/usage.kt +End of files +Exit code: OK +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt new file mode 100644 index 00000000000..03e73ad56a1 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt @@ -0,0 +1,3 @@ +package test + +const val CONST = "foo" \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt.new b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt.new new file mode 100644 index 00000000000..644301b0c68 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/const.kt.new @@ -0,0 +1,3 @@ +package test + +const val CONST = "bar" \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/dummy.kt b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/dummy.kt new file mode 100644 index 00000000000..789dc274f72 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/dummy.kt @@ -0,0 +1,3 @@ +package test + +fun dummy() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/usage.kt b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/usage.kt new file mode 100644 index 00000000000..89fc6b89f3c --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/constantValueChanged/usage.kt @@ -0,0 +1,5 @@ +package test + +fun usage() { + println(CONST) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/objectConstantChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/objectConstantChanged/build.log index 4c041f2743b..9ef71d29039 100644 --- a/jps-plugin/testData/incremental/pureKotlin/objectConstantChanged/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/objectConstantChanged/build.log @@ -11,12 +11,10 @@ Marked as dirty by Kotlin: Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: - out/production/module/test/Object.class out/production/module/test/Usage.class End of files Compiling files: - src/const.kt src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/build.log index 5df3e1b0c32..103791bfeb0 100644 --- a/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/build.log @@ -12,13 +12,10 @@ Marked as dirty by Kotlin: Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: - out/production/module/META-INF/module.kotlin_module - out/production/module/test/ConstKt.class out/production/module/test/Usage.class End of files Compiling files: - src/const.kt src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/traitClassObjectConstantChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/traitClassObjectConstantChanged/build.log index ebb5d82b894..1ac3cdb2401 100644 --- a/jps-plugin/testData/incremental/pureKotlin/traitClassObjectConstantChanged/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/traitClassObjectConstantChanged/build.log @@ -12,13 +12,10 @@ Marked as dirty by Kotlin: Exit code: ADDITIONAL_PASS_REQUIRED ------------------------------------------ Cleaning output files: - out/production/module/test/Trait$Companion.class - out/production/module/test/Trait.class out/production/module/test/Usage.class End of files Compiling files: - src/const.kt src/usage.kt End of files Exit code: OK ------------------------------------------- +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/build.log b/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/build.log index 93d2d828a73..37db9b3570d 100644 --- a/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/build.log +++ b/jps-plugin/testData/incremental/withJava/javaUsedInKotlin/constantChanged/build.log @@ -9,14 +9,10 @@ Compiling files: src/JavaClass.java End of files Cleaning output files: - out/production/module/JavaClass.class out/production/module/Usage.class End of files Compiling files: src/usage.kt End of files Exit code: OK ------------------------------------------- -Compiling files: - src/JavaClass.java -End of files +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/constantChanged/build.log b/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/constantChanged/build.log index 1d26bdaba08..7e9f5a92d93 100644 --- a/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/constantChanged/build.log +++ b/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/constantChanged/build.log @@ -11,14 +11,9 @@ Exit code: OK ------------------------------------------ Cleaning output files: out/production/module/Usage.class - out/production/module/test/Klass$Companion.class - out/production/module/test/Klass.class End of files -Compiling files: - src/const.kt -End of files -Exit code: OK +Exit code: NOTHING_DONE ------------------------------------------ Compiling files: src/Usage.java -End of files +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/jvmFieldChanged/build.log b/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/jvmFieldChanged/build.log index 1d26bdaba08..7e9f5a92d93 100644 --- a/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/jvmFieldChanged/build.log +++ b/jps-plugin/testData/incremental/withJava/kotlinUsedInJava/jvmFieldChanged/build.log @@ -11,14 +11,9 @@ Exit code: OK ------------------------------------------ Cleaning output files: out/production/module/Usage.class - out/production/module/test/Klass$Companion.class - out/production/module/test/Klass.class End of files -Compiling files: - src/const.kt -End of files -Exit code: OK +Exit code: NOTHING_DONE ------------------------------------------ Compiling files: src/Usage.java -End of files +End of files \ No newline at end of file