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"), MigrationInfo.create("1.1.0", ApiVersion.KOTLIN_1_2, LanguageVersion.KOTLIN_1_2, newStdlibVersion = "1.2.0"),
migrateComponentState?.migrationInfo migrateComponentState?.migrationInfo
) )
Assert.assertEquals(false, migrateComponentState?.hasApplicableTools)
} }
private fun doMigrationTest(beforeText: String, afterText: String): MigrationTestState? { 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.framework.MAVEN_SYSTEM_ID
import org.jetbrains.kotlin.idea.migration.CodeMigrationAction import org.jetbrains.kotlin.idea.migration.CodeMigrationAction
import org.jetbrains.kotlin.idea.migration.CodeMigrationToggleAction 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.project.languageVersionSettings
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode 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 @TestOnly
fun setImportFinishListener(newListener: ((MigrationTestState?) -> Unit)?) { fun setImportFinishListener(newListener: ((MigrationTestState?) -> Unit)?) {
@@ -61,8 +62,8 @@ class KotlinMigrationProjectComponent(val project: Project) {
} }
} }
private fun notifyFinish(migrationInfo: MigrationInfo?) { private fun notifyFinish(migrationInfo: MigrationInfo?, hasApplicableTools: Boolean) {
importFinishListener?.invoke(MigrationTestState(migrationInfo)) importFinishListener?.invoke(MigrationTestState(migrationInfo, hasApplicableTools))
} }
fun onImportAboutToStart() { fun onImportAboutToStart() {
@@ -76,12 +77,13 @@ class KotlinMigrationProjectComponent(val project: Project) {
fun onImportFinished() { fun onImportFinished() {
if (!CodeMigrationToggleAction.isEnabled(project) || old == null) { if (!CodeMigrationToggleAction.isEnabled(project) || old == null) {
notifyFinish(null) notifyFinish(null, false)
return return
} }
ApplicationManager.getApplication().executeOnPooledThread { ApplicationManager.getApplication().executeOnPooledThread {
var migrationInfo: MigrationInfo? = null var migrationInfo: MigrationInfo? = null
var hasApplicableTools = false
try { try {
val new = project.runReadActionInSmartMode { val new = project.runReadActionInSmartMode {
@@ -94,6 +96,13 @@ class KotlinMigrationProjectComponent(val project: Project) {
migrationInfo = prepareMigrationInfo(localOld, new) ?: return@executeOnPooledThread migrationInfo = prepareMigrationInfo(localOld, new) ?: return@executeOnPooledThread
if (applicableMigrationTools(migrationInfo).isEmpty()) {
hasApplicableTools = false
return@executeOnPooledThread
} else {
hasApplicableTools = true
}
if (ApplicationManager.getApplication().isUnitTestMode) { if (ApplicationManager.getApplication().isUnitTestMode) {
return@executeOnPooledThread return@executeOnPooledThread
} }
@@ -114,7 +123,7 @@ class KotlinMigrationProjectComponent(val project: Project) {
} }
} }
} finally { } finally {
notifyFinish(migrationInfo) notifyFinish(migrationInfo, hasApplicableTools)
} }
} }
} }
@@ -47,7 +47,7 @@ public class CodeInspectionAction extends BaseAnalysisAction {
GlobalInspectionContextImpl inspectionContext = getGlobalInspectionContext(project); GlobalInspectionContextImpl inspectionContext = getGlobalInspectionContext(project);
InspectionManagerEx managerEx = (InspectionManagerEx) InspectionManager.getInstance(project); InspectionManagerEx managerEx = (InspectionManagerEx) InspectionManager.getInstance(project);
myExternalProfile = createMigrationProfile(managerEx, null); myExternalProfile = createMigrationProfile(managerEx, null, null);
inspectionContext.setExternalProfile(myExternalProfile); inspectionContext.setExternalProfile(myExternalProfile);
inspectionContext.setCurrentScope(scope); inspectionContext.setCurrentScope(scope);
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.idea.migration 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.InspectionManagerEx
import com.intellij.codeInspection.ex.InspectionProfileImpl import com.intellij.codeInspection.ex.InspectionProfileImpl
import com.intellij.codeInspection.ex.InspectionToolWrapper 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.profile.codeInspection.InspectionProfileManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jdom.Element import org.jdom.Element
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix 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 rootProfile = InspectionProfileManager.getInstance().currentProfile
val migrationFixWrappers = rootProfile.allTools.asSequence() val migrationFixWrappers = applicableMigrationToolsImpl(migrationInfo)
.map { it.tool }
.filter { toolWrapper: InspectionToolWrapper<*, *> ->
toolWrapper.tool is MigrationFix
}
.toList()
val allWrappers = LinkedHashSet<InspectionToolWrapper<*, *>>() val allWrappers = LinkedHashSet<InspectionToolWrapper<*, *>>()
for (toolWrapper in migrationFixWrappers) { for (toolWrapper in migrationFixWrappers) {
@@ -50,4 +52,18 @@ fun createMigrationProfile(managerEx: InspectionManagerEx, psiElement: PsiElemen
} }
return model 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()
} }