Don't show migration dialog if no actual migrations are available (KT-26889)

#KT-26889 Fixed
This commit is contained in:
Nikolay Krasko
2018-09-17 12:22:15 +03:00
parent 11b948f004
commit 6ef6fe4a47
4 changed files with 41 additions and 14 deletions
@@ -70,6 +70,8 @@ class GradleMigrateTest : GradleImportingTestCase() {
MigrationInfo.create("1.1.0", ApiVersion.KOTLIN_1_2, LanguageVersion.KOTLIN_1_2, newStdlibVersion = "1.2.0"),
migrateComponentState?.migrationInfo
)
Assert.assertEquals(false, migrateComponentState?.hasApplicableTools)
}
private fun doMigrationTest(beforeText: String, afterText: String): MigrationTestState? {
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID
import org.jetbrains.kotlin.idea.framework.MAVEN_SYSTEM_ID
import org.jetbrains.kotlin.idea.migration.CodeMigrationAction
import org.jetbrains.kotlin.idea.migration.CodeMigrationToggleAction
import org.jetbrains.kotlin.idea.migration.applicableMigrationTools
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode
@@ -48,7 +49,7 @@ class KotlinMigrationProjectComponent(val project: Project) {
})
}
class MigrationTestState(val migrationInfo: MigrationInfo?)
class MigrationTestState(val migrationInfo: MigrationInfo?, val hasApplicableTools: Boolean)
@TestOnly
fun setImportFinishListener(newListener: ((MigrationTestState?) -> Unit)?) {
@@ -61,8 +62,8 @@ class KotlinMigrationProjectComponent(val project: Project) {
}
}
private fun notifyFinish(migrationInfo: MigrationInfo?) {
importFinishListener?.invoke(MigrationTestState(migrationInfo))
private fun notifyFinish(migrationInfo: MigrationInfo?, hasApplicableTools: Boolean) {
importFinishListener?.invoke(MigrationTestState(migrationInfo, hasApplicableTools))
}
fun onImportAboutToStart() {
@@ -76,12 +77,13 @@ class KotlinMigrationProjectComponent(val project: Project) {
fun onImportFinished() {
if (!CodeMigrationToggleAction.isEnabled(project) || old == null) {
notifyFinish(null)
notifyFinish(null, false)
return
}
ApplicationManager.getApplication().executeOnPooledThread {
var migrationInfo: MigrationInfo? = null
var hasApplicableTools = false
try {
val new = project.runReadActionInSmartMode {
@@ -94,6 +96,13 @@ class KotlinMigrationProjectComponent(val project: Project) {
migrationInfo = prepareMigrationInfo(localOld, new) ?: return@executeOnPooledThread
if (applicableMigrationTools(migrationInfo).isEmpty()) {
hasApplicableTools = false
return@executeOnPooledThread
} else {
hasApplicableTools = true
}
if (ApplicationManager.getApplication().isUnitTestMode) {
return@executeOnPooledThread
}
@@ -114,7 +123,7 @@ class KotlinMigrationProjectComponent(val project: Project) {
}
}
} finally {
notifyFinish(migrationInfo)
notifyFinish(migrationInfo, hasApplicableTools)
}
}
}
@@ -47,7 +47,7 @@ public class CodeInspectionAction extends BaseAnalysisAction {
GlobalInspectionContextImpl inspectionContext = getGlobalInspectionContext(project);
InspectionManagerEx managerEx = (InspectionManagerEx) InspectionManager.getInstance(project);
myExternalProfile = createMigrationProfile(managerEx, null);
myExternalProfile = createMigrationProfile(managerEx, null, null);
inspectionContext.setExternalProfile(myExternalProfile);
inspectionContext.setCurrentScope(scope);
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.idea.migration
import com.intellij.codeInspection.InspectionEP
import com.intellij.codeInspection.InspectionProfileEntry
import com.intellij.codeInspection.ex.InspectionManagerEx
import com.intellij.codeInspection.ex.InspectionProfileImpl
import com.intellij.codeInspection.ex.InspectionToolWrapper
@@ -14,18 +16,18 @@ import com.intellij.openapi.util.WriteExternalException
import com.intellij.profile.codeInspection.InspectionProfileManager
import com.intellij.psi.PsiElement
import org.jdom.Element
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix
import java.util.LinkedHashSet
import java.util.*
fun createMigrationProfile(managerEx: InspectionManagerEx, psiElement: PsiElement?): InspectionProfileImpl {
fun createMigrationProfile(
managerEx: InspectionManagerEx,
psiElement: PsiElement?,
migrationInfo: MigrationInfo? = null
): InspectionProfileImpl {
val rootProfile = InspectionProfileManager.getInstance().currentProfile
val migrationFixWrappers = rootProfile.allTools.asSequence()
.map { it.tool }
.filter { toolWrapper: InspectionToolWrapper<*, *> ->
toolWrapper.tool is MigrationFix
}
.toList()
val migrationFixWrappers = applicableMigrationToolsImpl(migrationInfo)
val allWrappers = LinkedHashSet<InspectionToolWrapper<*, *>>()
for (toolWrapper in migrationFixWrappers) {
@@ -50,4 +52,18 @@ fun createMigrationProfile(managerEx: InspectionManagerEx, psiElement: PsiElemen
}
return model
}
fun applicableMigrationTools(migrationInfo: MigrationInfo) = applicableMigrationToolsImpl(migrationInfo)
private fun applicableMigrationToolsImpl(migrationInfo: MigrationInfo?): List<InspectionToolWrapper<InspectionProfileEntry, InspectionEP>> {
val rootProfile = InspectionProfileManager.getInstance().currentProfile
return rootProfile.allTools.asSequence()
.map { it.tool }
.filter { toolWrapper: InspectionToolWrapper<*, *> ->
val tool = toolWrapper.tool
tool is MigrationFix && (migrationInfo == null || tool.isApplicable(migrationInfo))
}
.toList()
}