diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt
new file mode 100644
index 00000000000..eeeca7c9cd2
--- /dev/null
+++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.codeInsight.gradle
+
+import com.intellij.openapi.application.runReadAction
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.psi.PsiDocumentManager
+import com.intellij.psi.PsiManager
+import org.jetbrains.kotlin.config.ApiVersion
+import org.jetbrains.kotlin.config.LanguageVersion
+import org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectComponent
+import org.jetbrains.kotlin.idea.configuration.MigrationInfo
+import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait
+import org.junit.Assert
+import org.junit.Test
+
+class GradleMigrateTest : GradleImportingTestCase() {
+ @Test
+ fun testMigrateStdlib() {
+ createProjectSubFile("settings.gradle", "include ':app'")
+ val gradleFile = createProjectSubFile(
+ "app/build.gradle",
+ """
+ buildscript {
+ repositories {
+ jcenter()
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.0"
+ }
+ }
+
+ apply plugin: 'kotlin'
+
+ dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:1.1.0"
+ }
+ """.trimIndent()
+ )
+
+ importProject()
+
+ val document = runReadAction {
+ val gradlePsiFile = PsiManager.getInstance(myProject).findFile(gradleFile) ?: error("Can't find psi file for gradle file")
+ PsiDocumentManager.getInstance(myProject).getDocument(gradlePsiFile) ?: error("Can't find document for gradle file")
+ }
+
+ runInEdtAndWait {
+ runWriteAction {
+ document.setText(
+ """
+ buildscript {
+ repositories {
+ jcenter()
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.0"
+ }
+ }
+
+ apply plugin: 'kotlin'
+
+ dependencies {
+ compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.0"
+ }
+ """.trimIndent()
+ )
+ }
+ }
+
+ importProject()
+
+ val actualMigrationInfo = KotlinMigrationProjectComponent.getInstance(myProject).requestLastMigrationInfo()
+
+ Assert.assertEquals(
+ MigrationInfo.create("1.1.0", ApiVersion.KOTLIN_1_2, LanguageVersion.KOTLIN_1_2, newStdlibVersion = "1.2.0"),
+ actualMigrationInfo)
+ }
+}
\ No newline at end of file
diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt
new file mode 100644
index 00000000000..4d2953e9d88
--- /dev/null
+++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.maven
+
+import com.intellij.openapi.application.runReadAction
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.psi.PsiDocumentManager
+import com.intellij.psi.PsiManager
+import org.jetbrains.kotlin.config.ApiVersion
+import org.jetbrains.kotlin.config.LanguageVersion
+import org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectComponent
+import org.jetbrains.kotlin.idea.configuration.MigrationInfo
+import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait
+import org.junit.Assert
+import java.io.File
+
+class MavenMigrateTest : MavenImportingTestCase() {
+ private val kotlinVersion = "1.1.3"
+
+ override fun setUp() {
+ super.setUp()
+ repositoryPath = File(myDir, "repo").path
+ createStdProjectFolders()
+ }
+
+ fun testMigrateApiAndLanguageVersions() {
+ val pomFile = createProjectPom(
+ """
+ test
+ project
+ 1.0.0
+
+
+ 1.2.50
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${'$'}{kotlin.version}
+
+
+
+
+
+
+ kotlin-maven-plugin
+ org.jetbrains.kotlin
+ ${'$'}{kotlin.version}
+
+
+
+ """.trimIndent()
+ )
+
+ importProject()
+
+ val document = runReadAction {
+ val pomPsiFile = PsiManager.getInstance(myProject).findFile(pomFile) ?: error("Can't find psi file for pom file")
+ PsiDocumentManager.getInstance(myProject).getDocument(pomPsiFile) ?: error("Can't find document for pom file")
+ }
+
+ runInEdtAndWait {
+ runWriteAction {
+ document.setText(
+ MavenTestCase.createPomXml(
+ """
+ test
+ project
+ 1.0.0
+
+
+ 1.2.50
+ 1.3
+ 1.3
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${'$'}{kotlin.version}
+
+
+
+
+
+
+ kotlin-maven-plugin
+ org.jetbrains.kotlin
+ ${'$'}{kotlin.version}/version>
+
+
+
+ """.trimIndent()
+ )
+ )
+ }
+ }
+
+ importProject()
+
+ val actualMigrationInfo = KotlinMigrationProjectComponent.getInstance(myProject).requestLastMigrationInfo()
+
+ Assert.assertEquals(
+ MigrationInfo.create("1.2.50", ApiVersion.KOTLIN_1_2, LanguageVersion.KOTLIN_1_2,
+ newApiVersion = ApiVersion.KOTLIN_1_3, newLanguageVersion = LanguageVersion.KOTLIN_1_3),
+ actualMigrationInfo)
+ }
+}
\ No newline at end of file
diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt
index afa80471986..e6b3650f46c 100644
--- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt
@@ -20,6 +20,7 @@ import com.intellij.openapi.vcs.changes.ChangeListManager
import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx
import com.intellij.util.CommonProcessors
import com.intellij.util.text.VersionComparatorUtil
+import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -37,6 +38,8 @@ class KotlinMigrationProjectComponent(val project: Project) {
private var old: MigrationState? = null
private var new: MigrationState? = null
+ private var lastMigrationInfo: MigrationInfo? = null
+
init {
val connection = project.messageBus.connect()
connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener {
@@ -44,6 +47,14 @@ class KotlinMigrationProjectComponent(val project: Project) {
})
}
+ @Synchronized
+ @TestOnly
+ fun requestLastMigrationInfo(): MigrationInfo? {
+ val temp = lastMigrationInfo
+ lastMigrationInfo = null
+ return temp
+ }
+
@Synchronized
fun onImportAboutToStart() {
if (!CodeMigrationToggleAction.isEnabled(project) || !hasChangesInProjectFiles(project)) {
@@ -51,6 +62,8 @@ class KotlinMigrationProjectComponent(val project: Project) {
return
}
+ lastMigrationInfo = null
+
old = MigrationState.build(project)
}
@@ -70,6 +83,7 @@ class KotlinMigrationProjectComponent(val project: Project) {
new = null
if (ApplicationManager.getApplication().isUnitTestMode) {
+ lastMigrationInfo = migrationInfo
return
}
@@ -165,7 +179,24 @@ data class MigrationInfo(
val newApiVersion: ApiVersion,
val oldLanguageVersion: LanguageVersion,
val newLanguageVersion: LanguageVersion
-)
+) {
+ companion object {
+ fun create(
+ oldStdlibVersion: String,
+ oldApiVersion: ApiVersion,
+ oldLanguageVersion: LanguageVersion,
+ newStdlibVersion: String = oldStdlibVersion,
+ newApiVersion: ApiVersion = oldApiVersion,
+ newLanguageVersion: LanguageVersion = oldLanguageVersion
+ ): MigrationInfo {
+ return MigrationInfo(
+ oldStdlibVersion, newStdlibVersion,
+ oldApiVersion, newApiVersion,
+ oldLanguageVersion, newLanguageVersion
+ )
+ }
+ }
+}
fun MigrationInfo.isLanguageVersionUpdate(old: LanguageVersion, new: LanguageVersion): Boolean {
return oldLanguageVersion <= old && newLanguageVersion >= new