From e06f002f45ecfc93dc2ff62f3e3109583934e0a3 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 22 Nov 2017 18:38:04 +0300 Subject: [PATCH] Rebuild when language/api version is changed (JPS) #KT-20757 fixed Original commit: 913a997f243cc0ad7ec8aa96badb72750b87ff81 --- .../kotlin/jps/build/KotlinJpsBuildTest.kt | 43 ++++++++++++++++++- .../kotlin/jps/build/KotlinBuilder.kt | 32 +++++++++----- .../kotlinProject.ipr | 14 ++++++ .../LanguageOrApiVersionChanged/src/Bar.kt | 6 +++ .../LanguageOrApiVersionChanged/src/Foo.kt | 7 +++ 5 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/kotlinProject.ipr create mode 100644 jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Bar.kt create mode 100644 jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Foo.kt diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index a6a20a64457..238f0029c11 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -26,6 +26,7 @@ import com.intellij.testFramework.LightVirtualFile import com.intellij.testFramework.UsefulTestCase import com.intellij.util.io.URLUtil import com.intellij.util.io.ZipUtil +import junit.framework.TestCase import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.api.CanceledStatus import org.jetbrains.jps.builders.BuildResult @@ -51,15 +52,19 @@ import org.jetbrains.jps.model.library.JpsOrderRootType import org.jetbrains.jps.model.module.JpsModule import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.cli.common.Usage +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.JvmCodegenUtil +import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.KotlinCompilerVersion.TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY +import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.incremental.CacheVersion import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.withIC +import org.jetbrains.kotlin.jps.JpsKotlinCompilerSettings import org.jetbrains.kotlin.jps.build.KotlinJpsBuildTest.LibraryDependency.* import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName @@ -76,6 +81,8 @@ import java.net.URLClassLoader import java.util.* import java.util.regex.Pattern import java.util.zip.ZipOutputStream +import kotlin.reflect.KMutableProperty1 +import kotlin.reflect.KProperty1 class KotlinJpsBuildTestIncremental : KotlinJpsBuildTest() { var isICEnabledBackup: Boolean = false @@ -136,6 +143,40 @@ class KotlinJpsBuildTestIncremental : KotlinJpsBuildTest() { packagePartClass("kotlinProject", "src/Bar.kt", "foo.MainKt"), module("kotlinProject"))) } + + @WorkingDir("LanguageOrApiVersionChanged") + fun testLanguageVersionChanged() { + languageOrApiVersionChanged(CommonCompilerArguments::languageVersion) + } + + @WorkingDir("LanguageOrApiVersionChanged") + fun testApiVersionChanged() { + languageOrApiVersionChanged(CommonCompilerArguments::apiVersion) + } + + private fun languageOrApiVersionChanged(versionProperty: KMutableProperty1) { + initProject(JVM_MOCK_RUNTIME) + + assertEquals(1, myProject.modules.size) + val module = myProject.modules.first() + val args = JpsKotlinCompilerSettings.getCommonCompilerArguments(module) + + fun setVersion(newVersion: String) { + versionProperty.set(args, newVersion) + JpsKotlinCompilerSettings.setCommonCompilerArguments(myProject, args) + } + + assertNull(args.apiVersion) + buildAllModules().assertSuccessful() + + setVersion(LanguageVersion.LATEST_STABLE.versionString) + buildAllModules().assertSuccessful() + assertCompiled(KotlinBuilder.KOTLIN_BUILDER_NAME) + + setVersion(LanguageVersion.KOTLIN_1_0.versionString) + buildAllModules().assertSuccessful() + assertCompiled(KotlinBuilder.KOTLIN_BUILDER_NAME, "src/Bar.kt", "src/Foo.kt") + } } open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { @@ -293,7 +334,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { override fun doGetProjectDir(): File = workDir - private fun initProject(libraryDependency: LibraryDependency = NONE) { + protected fun initProject(libraryDependency: LibraryDependency = NONE) { addJdk(JDK_NAME) loadProject(workDir.absolutePath + File.separator + PROJECT_NAME + ".ipr") 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 01671dd9e51..7d01489d09a 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 @@ -47,11 +47,8 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil 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.LanguageVersion -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 @@ -160,13 +157,26 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { } 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)") + val lastBuildApiVersion = ApiVersion.parse(lastBuildMetaInfo.apiVersionString) + val currentLangVersion = args.languageVersion?.let { LanguageVersion.fromVersionString(it) } ?: LanguageVersion.LATEST_STABLE + val currentApiVersion = args.apiVersion?.let { ApiVersion.parse(it) } ?: ApiVersion.createByLanguageVersion(currentLangVersion) + + val reasonToRebuild = when { + currentLangVersion != lastBuildLangVersion -> { + "Language version was changed ($lastBuildLangVersion -> $currentLangVersion)" + } + currentApiVersion != lastBuildApiVersion -> { + "Api version was changed ($lastBuildApiVersion -> $currentApiVersion)" + } + lastBuildLangVersion != LanguageVersion.KOTLIN_1_0 && lastBuildMetaInfo.isEAP && !currentBuildMetaInfo.isEAP -> { + // If EAP->Non-EAP build with IC, then rebuild all kotlin + "Last build was compiled with EAP-plugin" + } + else -> null + } + + if (reasonToRebuild != null) { + LOG.info("$reasonToRebuild. Performing non-incremental rebuild (kotlin only)") actions.add(CacheVersion.Action.REBUILD_ALL_KOTLIN) } } diff --git a/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/kotlinProject.ipr b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/kotlinProject.ipr new file mode 100644 index 00000000000..90747786771 --- /dev/null +++ b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/kotlinProject.ipr @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Bar.kt b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Bar.kt new file mode 100644 index 00000000000..f577138fb1c --- /dev/null +++ b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Bar.kt @@ -0,0 +1,6 @@ +package test + +class Bar() { + fun bar() { + } +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Foo.kt b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Foo.kt new file mode 100644 index 00000000000..494c3dea241 --- /dev/null +++ b/jps/jps-plugin/testData/general/LanguageOrApiVersionChanged/src/Foo.kt @@ -0,0 +1,7 @@ +package test + +class Foo() { + fun foo() { + Bar().bar() + } +} \ No newline at end of file