From 08d122072812df4119de45c488c0f34705750649 Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Mon, 20 May 2019 14:49:08 +0300 Subject: [PATCH] Do not show UI dialog from a write action during work of intention #EA-100676 Fixed --- .../idea/quickfix/RemoveUnusedValueFix.kt | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedValueFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedValueFix.kt index 0d73ffbf2df..486f42b9088 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedValueFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedValueFix.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.openapi.ui.Messages @@ -36,11 +37,11 @@ class RemoveUnusedValueFix(expression: KtBinaryExpression) : KotlinQuickFixActio REMOVE_ALL, KEEP_INITIALIZE, CANCEL } - private fun showDialog(variable: KtProperty): RemoveMode { - if (ApplicationManager.getApplication().isUnitTestMode) return RemoveMode.KEEP_INITIALIZE + private fun showDialog(variable: KtProperty, project: Project, element: KtBinaryExpression, rhs: KtExpression) { + if (ApplicationManager.getApplication().isUnitTestMode) return doRemove(RemoveMode.KEEP_INITIALIZE, element, rhs) val message = - """ + """ There are possible side effects found in expressions assigned to the variable '${variable.name}'
You can:
@@ -48,7 +49,9 @@ class RemoveUnusedValueFix(expression: KtBinaryExpression) : KotlinQuickFixActio - Transform assignment right-hand side into the statement on its own.
""" - val exitCode = Messages.showYesNoCancelDialog( + + ApplicationManager.getApplication().invokeLater { + val exitCode = Messages.showYesNoCancelDialog( variable.project, message, QuickFixBundle.message("side.effects.warning.dialog.title"), @@ -56,14 +59,26 @@ class RemoveUnusedValueFix(expression: KtBinaryExpression) : KotlinQuickFixActio QuickFixBundle.message("side.effect.action.transform"), QuickFixBundle.message("side.effect.action.cancel"), Messages.getWarningIcon() - ) - return RemoveMode.values()[exitCode] + ) + WriteCommandAction.runWriteCommandAction(project) { + doRemove(RemoveMode.values()[exitCode], element, rhs) + } + } } override fun getFamilyName() = "Remove redundant assignment" override fun getText() = familyName + private fun doRemove(mode: RemoveMode, element: KtBinaryExpression, rhs: KtExpression) { + when (mode) { + RemoveMode.REMOVE_ALL -> element.delete() + RemoveMode.KEEP_INITIALIZE -> element.replace(rhs) + else -> { + } + } + } + override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return val lhs = element.left as? KtSimpleNameExpression ?: return @@ -71,16 +86,12 @@ class RemoveUnusedValueFix(expression: KtBinaryExpression) : KotlinQuickFixActio val variable = lhs.mainReference.resolve() as? KtProperty ?: return val pseudocode = rhs.getContainingPseudocode(element.analyze(BodyResolveMode.PARTIAL)) val isSideEffectFree = pseudocode?.getElementValue(rhs)?.createdAt?.sideEffectFree ?: false - var removeMode = RemoveMode.REMOVE_ALL if (!isSideEffectFree) { - removeMode = showDialog(variable) + showDialog(variable, project, element, rhs) + } else { + doRemove(RemoveMode.REMOVE_ALL, element, rhs) } - when (removeMode) { - RemoveMode.REMOVE_ALL -> element.delete() - RemoveMode.KEEP_INITIALIZE -> element.replace(rhs) - else -> {} - } } companion object : KotlinSingleIntentionActionFactory() {