From 6ef6fe4a47215717143d9207aa5ba64151d3b60b Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 17 Sep 2018 12:22:15 +0300 Subject: [PATCH] Don't show migration dialog if no actual migrations are available (KT-26889) #KT-26889 Fixed --- .../codeInsight/gradle/GradleMigrateTest.kt | 2 ++ .../KotlinMigrationProjectComponent.kt | 19 ++++++++--- .../idea/migration/CodeInspectionAction.java | 2 +- .../idea/migration/kotlinMigrationProfile.kt | 32 ++++++++++++++----- 4 files changed, 41 insertions(+), 14 deletions(-) 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 index 1e912792582..0a6ea2ce133 100644 --- 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 @@ -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? { diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt index ee6778b3ce9..2a2f6f59c4e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt @@ -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) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/migration/CodeInspectionAction.java b/idea/src/org/jetbrains/kotlin/idea/migration/CodeInspectionAction.java index 2d5f3ede691..4121f8230ce 100644 --- a/idea/src/org/jetbrains/kotlin/idea/migration/CodeInspectionAction.java +++ b/idea/src/org/jetbrains/kotlin/idea/migration/CodeInspectionAction.java @@ -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); diff --git a/idea/src/org/jetbrains/kotlin/idea/migration/kotlinMigrationProfile.kt b/idea/src/org/jetbrains/kotlin/idea/migration/kotlinMigrationProfile.kt index 6b1b5445a70..88d820375ec 100644 --- a/idea/src/org/jetbrains/kotlin/idea/migration/kotlinMigrationProfile.kt +++ b/idea/src/org/jetbrains/kotlin/idea/migration/kotlinMigrationProfile.kt @@ -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>() 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> { + 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() } \ No newline at end of file