diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index 8e57f3ce249a..977c88666f40 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -23,7 +23,6 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionManager; -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler; import com.intellij.codeInspection.InspectionProfileEntry; import com.intellij.codeInspection.InspectionToolProvider; import com.intellij.codeInspection.LocalInspectionTool; @@ -37,7 +36,6 @@ import com.intellij.lang.StdLanguages; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.lang.java.JavaLanguage; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.command.WriteCommandAction; @@ -65,7 +63,6 @@ import com.intellij.testFramework.InspectionsKt; import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.ui.UIUtil; import com.intellij.xml.XmlSchemaProvider; import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NonNls; @@ -355,9 +352,7 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { IntentionAction intentionAction = findIntentionAction(infos, intentionActionName, editor, file); assertNotNull(intentionActionName, intentionAction); - ApplicationManager.getApplication().invokeLater( - () -> assertTrue(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, intentionAction, intentionActionName))); - UIUtil.dispatchAllInvocationEvents(); + CodeInsightTestFixtureImpl.invokeIntention(intentionAction, file, editor, intentionActionName); } protected static IntentionAction findIntentionAction(@NotNull Collection infos, @NotNull String intentionActionName, @NotNull Editor editor, diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java index 5cd855e49787..7bb666fbcaee 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java @@ -18,17 +18,12 @@ package com.intellij.codeInsight.daemon.quickFix; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vcs.readOnlyHandler.ReadonlyStatusHandlerImpl; import com.intellij.openapi.vfs.CharsetToolkit; -import com.intellij.openapi.vfs.ReadonlyStatusHandler; import com.intellij.psi.PsiFile; import com.intellij.rt.execution.junit.FileComparisonFailure; import com.intellij.testFramework.LightPlatformCodeInsightTestCase; @@ -36,14 +31,12 @@ import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ObjectUtils; -import com.intellij.util.io.ReadOnlyAttributeUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; -import java.io.UncheckedIOException; import java.util.List; public abstract class LightQuickFixTestCase extends LightDaemonAnalyzerTestCase { @@ -129,28 +122,7 @@ public abstract class LightQuickFixTestCase extends LightDaemonAnalyzerTestCase } protected static void invoke(@NotNull IntentionAction action) throws IncorrectOperationException { - PsiFile file = getFile(); - WriteAction.run(() -> { - try { - // Test that action will automatically clear the read-only attribute if modification is necessary. - // If your test fails due to this, make sure that your quick-fix/intention has the following line: - // if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; - ReadOnlyAttributeUtil.setReadOnlyAttribute(file.getVirtualFile(), true); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - }); - ReadonlyStatusHandlerImpl handler = (ReadonlyStatusHandlerImpl)ReadonlyStatusHandler.getInstance(file.getProject()); - handler.setClearReadOnlyInTests(true); - try { - ApplicationManager.getApplication().invokeLater(() -> - ShowIntentionActionsHandler.chooseActionAndInvoke(file, getEditor(), action, action.getText())); - UIUtil.dispatchAllInvocationEvents(); - } - finally { - handler.setClearReadOnlyInTests(false); - } + CodeInsightTestFixtureImpl.invokeIntention(action, getFile(), getEditor(), action.getText()); } protected IntentionAction findActionAndCheck(@NotNull ActionHint hint, String testFullPath) { diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index cdeb1b6ba4b2..2a643c41f7eb 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -58,10 +58,7 @@ import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; -import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.application.Result; -import com.intellij.openapi.application.TransactionGuard; -import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.application.*; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.*; @@ -89,6 +86,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vcs.readOnlyHandler.ReadonlyStatusHandlerImpl; import com.intellij.openapi.vfs.*; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; @@ -115,6 +113,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.FileBasedIndex; +import com.intellij.util.io.ReadOnlyAttributeUtil; import com.intellij.util.ui.UIUtil; import junit.framework.ComparisonFailure; import org.jetbrains.annotations.NotNull; @@ -123,7 +122,9 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.IOException; +import java.io.UncheckedIOException; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -552,8 +553,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @Override public void launchAction(@NotNull final IntentionAction action) { - TransactionGuard.submitTransaction(getProject(), () -> ShowIntentionActionsHandler.chooseActionAndInvoke(getFile(), getEditor(), action, action.getText())); - UIUtil.dispatchAllInvocationEvents(); + invokeIntention(action, getFile(), getEditor(), action.getText()); } @Override @@ -1737,6 +1737,41 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig } } + public static boolean invokeIntention(@NotNull IntentionAction action, PsiFile file, Editor editor, String actionText) { + // Test that action will automatically clear the read-only attribute if modification is necessary. + // If your test fails due to this, make sure that your quick-fix/intention + // overrides "shouldMakeCurrentFileWritable" or has the following line: + // if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; + + ReadonlyStatusHandlerImpl handler = (ReadonlyStatusHandlerImpl)ReadonlyStatusHandler.getInstance(file.getProject()); + setReadOnly(file, true); + handler.setClearReadOnlyInTests(true); + AtomicBoolean result = new AtomicBoolean(); + try { + ApplicationManager.getApplication().invokeLater( + () -> result.set(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, action, actionText))); + UIUtil.dispatchAllInvocationEvents(); + } + catch (AssertionError e) { + ExceptionUtil.rethrowUnchecked(ExceptionUtil.getRootCause(e)); + throw e; + } + finally { + handler.setClearReadOnlyInTests(false); + setReadOnly(file, false); + } + return result.get(); + } + + private static void setReadOnly(PsiFile file, boolean readOnlyStatus) { + try { + WriteAction.run(() -> ReadOnlyAttributeUtil.setReadOnlyAttribute(InjectedLanguageUtil.getTopLevelFile(file).getVirtualFile(), readOnlyStatus)); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + private static class SelectionAndCaretMarkupLoader { private final String filePath; private final String newFileText; diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/JavaFxFieldToPropertyTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/JavaFxFieldToPropertyTest.java index 01b3d90df00b..b4e2e083959a 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/JavaFxFieldToPropertyTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/JavaFxFieldToPropertyTest.java @@ -3,7 +3,6 @@ package org.jetbrains.plugins.javaFX; import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler; import com.intellij.openapi.application.PluginPathManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.roots.LanguageLevelProjectExtension; @@ -15,6 +14,7 @@ import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.javaFX.codeInsight.JavaFxFieldToPropertyIntention; import org.jetbrains.plugins.javaFX.fxml.AbstractJavaFXTestCase; @@ -86,7 +86,7 @@ public class JavaFxFieldToPropertyTest extends DaemonAnalyzerTestCase { Editor editor = getEditor(); PsiFile file = getFile(); - assertTrue(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, intentionAction,actionName)); + assertTrue(CodeInsightTestFixtureImpl.invokeIntention(intentionAction, file, editor, actionName)); checkResultByFile(getTestName(false) + "_after.java"); } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXCollapseSubtagToAttributeTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXCollapseSubtagToAttributeTest.java index fa0c74ead15d..80c54308a802 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXCollapseSubtagToAttributeTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXCollapseSubtagToAttributeTest.java @@ -18,11 +18,10 @@ package org.jetbrains.plugins.javaFX.fxml; import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler; import com.intellij.openapi.application.PluginPathManager; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiFile; -import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -65,7 +64,7 @@ public class JavaFXCollapseSubtagToAttributeTest extends DaemonAnalyzerTestCase if (available) { assertNotNull("Collapse tag '" + tagName + "' to attribute", intentionAction); - assertTrue(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, intentionAction, + assertTrue(CodeInsightTestFixtureImpl.invokeIntention(intentionAction, file, editor, "Collapse tag '" + tagName + "' to attribute")); checkResultByFile(getTestName(true) + "_after.fxml"); } else { diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXExpandAttributeTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXExpandAttributeTest.java index f9361dd25434..ac53f03a6591 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXExpandAttributeTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXExpandAttributeTest.java @@ -18,11 +18,10 @@ package org.jetbrains.plugins.javaFX.fxml; import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler; import com.intellij.openapi.application.PluginPathManager; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiFile; -import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -66,7 +65,7 @@ public class JavaFXExpandAttributeTest extends DaemonAnalyzerTestCase { if (available) { assertNotNull(actionName, intentionAction); - assertTrue(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, intentionAction, actionName)); + assertTrue(CodeInsightTestFixtureImpl.invokeIntention(intentionAction, file, editor, actionName)); checkResultByFile(getTestName(true) + "_after.fxml"); } else { assertNull(intentionAction);