Rebuild when language/api version is changed (JPS)
#KT-20757 fixed
This commit is contained in:
@@ -26,6 +26,7 @@ import com.intellij.testFramework.LightVirtualFile
|
|||||||
import com.intellij.testFramework.UsefulTestCase
|
import com.intellij.testFramework.UsefulTestCase
|
||||||
import com.intellij.util.io.URLUtil
|
import com.intellij.util.io.URLUtil
|
||||||
import com.intellij.util.io.ZipUtil
|
import com.intellij.util.io.ZipUtil
|
||||||
|
import junit.framework.TestCase
|
||||||
import org.jetbrains.jps.ModuleChunk
|
import org.jetbrains.jps.ModuleChunk
|
||||||
import org.jetbrains.jps.api.CanceledStatus
|
import org.jetbrains.jps.api.CanceledStatus
|
||||||
import org.jetbrains.jps.builders.BuildResult
|
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.model.module.JpsModule
|
||||||
import org.jetbrains.jps.util.JpsPathUtil
|
import org.jetbrains.jps.util.JpsPathUtil
|
||||||
import org.jetbrains.kotlin.cli.common.Usage
|
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.common.arguments.K2JVMCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||||
|
import org.jetbrains.kotlin.config.ApiVersion
|
||||||
import org.jetbrains.kotlin.config.IncrementalCompilation
|
import org.jetbrains.kotlin.config.IncrementalCompilation
|
||||||
import org.jetbrains.kotlin.config.KotlinCompilerVersion.TEST_IS_PRE_RELEASE_SYSTEM_PROPERTY
|
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.CacheVersion
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.incremental.withIC
|
import org.jetbrains.kotlin.incremental.withIC
|
||||||
|
import org.jetbrains.kotlin.jps.JpsKotlinCompilerSettings
|
||||||
import org.jetbrains.kotlin.jps.build.KotlinJpsBuildTest.LibraryDependency.*
|
import org.jetbrains.kotlin.jps.build.KotlinJpsBuildTest.LibraryDependency.*
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
|
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -76,6 +81,8 @@ import java.net.URLClassLoader
|
|||||||
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.reflect.KMutableProperty1
|
||||||
|
import kotlin.reflect.KProperty1
|
||||||
|
|
||||||
class KotlinJpsBuildTestIncremental : KotlinJpsBuildTest() {
|
class KotlinJpsBuildTestIncremental : KotlinJpsBuildTest() {
|
||||||
var isICEnabledBackup: Boolean = false
|
var isICEnabledBackup: Boolean = false
|
||||||
@@ -136,6 +143,40 @@ class KotlinJpsBuildTestIncremental : KotlinJpsBuildTest() {
|
|||||||
packagePartClass("kotlinProject", "src/Bar.kt", "foo.MainKt"),
|
packagePartClass("kotlinProject", "src/Bar.kt", "foo.MainKt"),
|
||||||
module("kotlinProject")))
|
module("kotlinProject")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WorkingDir("LanguageOrApiVersionChanged")
|
||||||
|
fun testLanguageVersionChanged() {
|
||||||
|
languageOrApiVersionChanged(CommonCompilerArguments::languageVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
@WorkingDir("LanguageOrApiVersionChanged")
|
||||||
|
fun testApiVersionChanged() {
|
||||||
|
languageOrApiVersionChanged(CommonCompilerArguments::apiVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun languageOrApiVersionChanged(versionProperty: KMutableProperty1<CommonCompilerArguments, String?>) {
|
||||||
|
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() {
|
open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||||
@@ -293,7 +334,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
|||||||
|
|
||||||
override fun doGetProjectDir(): File = workDir
|
override fun doGetProjectDir(): File = workDir
|
||||||
|
|
||||||
private fun initProject(libraryDependency: LibraryDependency = NONE) {
|
protected fun initProject(libraryDependency: LibraryDependency = NONE) {
|
||||||
addJdk(JDK_NAME)
|
addJdk(JDK_NAME)
|
||||||
loadProject(workDir.absolutePath + File.separator + PROJECT_NAME + ".ipr")
|
loadProject(workDir.absolutePath + File.separator + PROJECT_NAME + ".ipr")
|
||||||
|
|
||||||
|
|||||||
@@ -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.MessageCollector
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil
|
||||||
import org.jetbrains.kotlin.compilerRunner.*
|
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.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.daemon.common.isDaemonEnabled
|
||||||
import org.jetbrains.kotlin.incremental.*
|
import org.jetbrains.kotlin.incremental.*
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
@@ -160,13 +157,26 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val lastBuildLangVersion = LanguageVersion.fromVersionString(lastBuildMetaInfo.languageVersionString)
|
val lastBuildLangVersion = LanguageVersion.fromVersionString(lastBuildMetaInfo.languageVersionString)
|
||||||
// reuse logic from compiler?
|
val lastBuildApiVersion = ApiVersion.parse(lastBuildMetaInfo.apiVersionString)
|
||||||
if (lastBuildLangVersion != LanguageVersion.KOTLIN_1_0
|
val currentLangVersion = args.languageVersion?.let { LanguageVersion.fromVersionString(it) } ?: LanguageVersion.LATEST_STABLE
|
||||||
&& lastBuildMetaInfo.isEAP
|
val currentApiVersion = args.apiVersion?.let { ApiVersion.parse(it) } ?: ApiVersion.createByLanguageVersion(currentLangVersion)
|
||||||
&& !currentBuildMetaInfo.isEAP
|
|
||||||
) {
|
val reasonToRebuild = when {
|
||||||
// If EAP->Non-EAP build with IC, then rebuild all kotlin
|
currentLangVersion != lastBuildLangVersion -> {
|
||||||
LOG.info("Last build was compiled with EAP-plugin. Performing non-incremental rebuild (kotlin only)")
|
"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)
|
actions.add(CacheVersion.Action.REBUILD_ALL_KOTLIN)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<option name="DEFAULT_COMPILER" value="Javac" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/kotlinProject.iml" filepath="$PROJECT_DIR$/kotlinProject.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="IDEA_JDK" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
class Bar() {
|
||||||
|
fun bar() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
class Foo() {
|
||||||
|
fun foo() {
|
||||||
|
Bar().bar()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user