diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
index 6398eb09754..b651351bf1e 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
+++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
@@ -110,6 +110,12 @@ class DeserializedDescriptorResolver {
private val KOTLIN_1_1_EAP_METADATA_VERSION = JvmMetadataVersion(1, 1, 2)
var IS_PRE_RELEASE = KotlinCompilerVersion.IS_PRE_RELEASE
+ get() {
+ val testOverrideValue = System.getProperty(TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY)
+ return testOverrideValue?.toBoolean() ?: field
+ }
@Deprecated("Should only be used in tests") set
+
+ const val TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY = "kotlin.test.is.pre.release"
}
}
diff --git a/jps-plugin/jps-tests/jps-tests.iml b/jps-plugin/jps-tests/jps-tests.iml
index 2f6d94239e8..6100f2af4f5 100644
--- a/jps-plugin/jps-tests/jps-tests.iml
+++ b/jps-plugin/jps-tests/jps-tests.iml
@@ -17,5 +17,6 @@
+
\ No newline at end of file
diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt
index eccbf0d287d..53c509b3b54 100644
--- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt
+++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt
@@ -33,6 +33,7 @@ import org.jetbrains.jps.builders.CompileScopeTestBuilder
import org.jetbrains.jps.builders.JpsBuildTestCase
import org.jetbrains.jps.builders.TestProjectBuilderLogger
import org.jetbrains.jps.builders.impl.BuildDataPathsImpl
+import org.jetbrains.jps.builders.impl.logging.ProjectBuilderLoggerImpl
import org.jetbrains.jps.builders.logging.BuildLoggingManager
import org.jetbrains.jps.cmdline.ProjectDescriptor
import org.jetbrains.jps.incremental.BuilderRegistry
@@ -49,9 +50,14 @@ import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
+import org.jetbrains.kotlin.config.KotlinCompilerVersion
+import org.jetbrains.kotlin.daemon.common.COMPILE_DAEMON_ENABLED_PROPERTY
import org.jetbrains.kotlin.incremental.CacheVersion
import org.jetbrains.kotlin.incremental.components.LookupTracker
+import org.jetbrains.kotlin.incremental.withIC
import org.jetbrains.kotlin.jps.build.KotlinJpsBuildTest.LibraryDependency.*
+import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver
+import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver.Companion.TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.test.KotlinTestUtils
@@ -785,6 +791,34 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
doTest()
}
+ fun testEAPToReleaseIC() {
+ fun setPreRelease(value: Boolean) {
+ System.setProperty(TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY, value.toString())
+ }
+
+ try {
+ withIC {
+ initProject(JVM_MOCK_RUNTIME)
+
+ setPreRelease(true)
+ makeAll().assertSuccessful()
+ assertCompiled(KotlinBuilder.KOTLIN_BUILDER_NAME, "src/Bar.kt", "src/Foo.kt")
+
+ touch("src/Foo.kt").apply()
+ makeAll()
+ assertCompiled(KotlinBuilder.KOTLIN_BUILDER_NAME, "src/Foo.kt")
+
+ setPreRelease(false)
+ touch("src/Foo.kt").apply()
+ makeAll().assertSuccessful()
+ assertCompiled(KotlinBuilder.KOTLIN_BUILDER_NAME, "src/Bar.kt", "src/Foo.kt")
+ }
+ }
+ finally {
+ System.clearProperty(TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY)
+ }
+ }
+
fun testGetDependentTargets() {
fun addModuleWithSourceAndTestRoot(name: String): JpsModule {
return addModule(name, "src/").apply {
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 0dbb1f8837b..f8d8c1c097d 100644
--- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt
+++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt
@@ -37,9 +37,7 @@ import org.jetbrains.jps.model.JpsProject
import org.jetbrains.jps.model.java.JpsJavaClasspathKind
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModule
-import org.jetbrains.kotlin.build.GeneratedFile
-import org.jetbrains.kotlin.build.GeneratedJvmClass
-import org.jetbrains.kotlin.build.isModuleMappingFile
+import org.jetbrains.kotlin.build.*
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
@@ -47,11 +45,8 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
import org.jetbrains.kotlin.compilerRunner.*
-import org.jetbrains.kotlin.config.CompilerRunnerConstants
+import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.CompilerRunnerConstants.INTERNAL_ERROR_PREFIX
-import org.jetbrains.kotlin.config.IncrementalCompilation
-import org.jetbrains.kotlin.config.KotlinCompilerVersion
-import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.daemon.common.isDaemonEnabled
import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -63,9 +58,8 @@ import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.preloading.ClassCondition
import org.jetbrains.kotlin.progress.CompilationCanceledException
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
-import org.jetbrains.kotlin.utils.JsLibraryUtils
-import org.jetbrains.kotlin.utils.PathUtil
-import org.jetbrains.kotlin.utils.keysToMap
+import org.jetbrains.kotlin.build.JvmBuildMetaInfo
+import org.jetbrains.kotlin.utils.*
import org.jetbrains.org.objectweb.asm.ClassReader
import java.io.File
import java.util.*
@@ -115,7 +109,37 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
val cacheVersionsProvider = CacheVersionProvider(dataManager.dataPaths)
val allVersions = cacheVersionsProvider.allVersions(targets)
- val actions = allVersions.map { it.checkVersion() }.toSet()
+ val actions = allVersions.map { it.checkVersion() }.toMutableSet()
+
+ if (!JpsUtils.isJsKotlinModule(chunk.representativeTarget())) {
+ val args = compilerArgumentsForChunk(chunk)
+ val currentBuildMetaInfo = JvmBuildMetaInfo(args)
+
+ for (target in chunk.targets) {
+ val file = jvmBuildMetaInfoFile(target, dataManager)
+ if (!file.exists()) continue
+
+ val lastBuildMetaInfo =
+ try {
+ JvmBuildMetaInfo.deserializeFromString(file.readText()) ?: continue
+ }
+ catch (e: Exception) {
+ LOG.error("Could not deserialize jvm build meta info", e)
+ continue
+ }
+
+ val lastBuildLangVersion = LanguageVersion.fromVersionString(lastBuildMetaInfo.languageVersionString)
+ // reuse logic from compiler?
+ if (lastBuildLangVersion != LanguageVersion.KOTLIN_1_0
+ && lastBuildMetaInfo.isEAP
+ && !currentBuildMetaInfo.isEAP
+ ) {
+ // If EAP->Non-EAP build with IC, then rebuild all kotlin
+ LOG.info("Last build was compiled with EAP-plugin. Performing non-incremental rebuild (kotlin only)")
+ actions.add(CacheVersion.Action.REBUILD_ALL_KOTLIN)
+ }
+ }
+ }
val fsOperations = FSOperationsHelper(context, chunk, LOG)
applyActionsOnCacheVersionChange(actions, cacheVersionsProvider, context, dataManager, targets, fsOperations)
diff --git a/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.iml b/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.iml
new file mode 100644
index 00000000000..d04ecd6e02e
--- /dev/null
+++ b/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.ipr b/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.ipr
new file mode 100644
index 00000000000..90747786771
--- /dev/null
+++ b/jps-plugin/testData/general/EAPToReleaseIC/kotlinProject.ipr
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jps-plugin/testData/general/EAPToReleaseIC/src/Bar.kt b/jps-plugin/testData/general/EAPToReleaseIC/src/Bar.kt
new file mode 100644
index 00000000000..f577138fb1c
--- /dev/null
+++ b/jps-plugin/testData/general/EAPToReleaseIC/src/Bar.kt
@@ -0,0 +1,6 @@
+package test
+
+class Bar() {
+ fun bar() {
+ }
+}
\ No newline at end of file
diff --git a/jps-plugin/testData/general/EAPToReleaseIC/src/Foo.kt b/jps-plugin/testData/general/EAPToReleaseIC/src/Foo.kt
new file mode 100644
index 00000000000..494c3dea241
--- /dev/null
+++ b/jps-plugin/testData/general/EAPToReleaseIC/src/Foo.kt
@@ -0,0 +1,7 @@
+package test
+
+class Foo() {
+ fun foo() {
+ Bar().bar()
+ }
+}
\ No newline at end of file