diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/codeInsight/intention/impl')
3 files changed, 50 insertions, 13 deletions
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java index 62e3bcba3a22..d168002f97a7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java @@ -30,11 +30,15 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; +import com.intellij.psi.ElementManipulators; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.injected.Place; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -93,14 +97,17 @@ public class QuickEditAction implements IntentionAction, LowPriorityAction { } public QuickEditHandler invokeImpl(@NotNull final Project project, final Editor editor, PsiFile file) throws IncorrectOperationException { - final int offset = editor.getCaretModel().getOffset(); - final Pair<PsiElement, TextRange> pair = getRangePair(file, editor); - assert pair != null; - final PsiFile injectedFile = (PsiFile)pair.first; - final int injectedOffset = ((DocumentWindow)PsiDocumentManager.getInstance(project).getDocument(injectedFile)).hostToInjected(offset); + int offset = editor.getCaretModel().getOffset(); + Pair<PsiElement, TextRange> pair = ObjectUtils.assertNotNull(getRangePair(file, editor)); + + PsiFile injectedFile = (PsiFile)pair.first; QuickEditHandler handler = getHandler(project, injectedFile, editor, file); + if (!ApplicationManager.getApplication().isUnitTestMode()) { - handler.navigate(injectedOffset); + DocumentWindow documentWindow = InjectedLanguageUtil.getDocumentWindow(injectedFile); + if (documentWindow != null) { + handler.navigate(documentWindow.hostToInjected(offset)); + } } return handler; } @@ -124,12 +131,15 @@ public class QuickEditAction implements IntentionAction, LowPriorityAction { return handler; } - public static QuickEditHandler getExistingHandler(PsiFile injectedFile) { + public static QuickEditHandler getExistingHandler(@NotNull PsiFile injectedFile) { Place shreds = InjectedLanguageUtil.getShreds(injectedFile); - if (shreds == null) return null; + DocumentWindow documentWindow = InjectedLanguageUtil.getDocumentWindow(injectedFile); + if (shreds == null || documentWindow == null) return null; + TextRange hostRange = TextRange.create(shreds.get(0).getHostRangeMarker().getStartOffset(), shreds.get(shreds.size() - 1).getHostRangeMarker().getEndOffset()); for (Editor editor : EditorFactory.getInstance().getAllEditors()) { + if (editor.getDocument() != documentWindow.getDelegate()) continue; QuickEditHandler handler = editor.getUserData(QUICK_EDIT_HANDLER); if (handler != null && handler.changesRange(hostRange)) return handler; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java index 2c5d8642e46d..517f23c5a198 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java @@ -360,7 +360,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { private void commitToOriginal() { if (!isValid()) return; - VirtualFile origVirtualFile = PsiUtilCore.getVirtualFile(ObjectUtils.assertNotNull(myNewFile.getContext())); + VirtualFile origVirtualFile = PsiUtilCore.getVirtualFile(myNewFile.getContext()); myCommittingToOriginal = true; try { if (origVirtualFile == null || !ReadonlyStatusHandler.getInstance(myProject).ensureFilesWritable(origVirtualFile).hasReadonlyFiles()) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java index 46842af23c34..ca0a51112f98 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java @@ -20,12 +20,13 @@ import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionActionBean; import com.intellij.codeInsight.intention.IntentionManager; +import com.intellij.codeInspection.GlobalInspectionTool; +import com.intellij.codeInspection.GlobalSimpleInspectionTool; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.actions.CleanupInspectionIntention; import com.intellij.codeInspection.actions.RunInspectionIntention; -import com.intellij.codeInspection.ex.DisableInspectionToolAction; -import com.intellij.codeInspection.ex.EditInspectionToolsSettingsAction; -import com.intellij.codeInspection.ex.EditInspectionToolsSettingsInSuppressedPlaceIntention; +import com.intellij.codeInspection.ex.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPoint; @@ -181,6 +182,32 @@ public class IntentionManagerImpl extends IntentionManager { return options; } + @Nullable + @Override + public IntentionAction createFixAllIntention(InspectionToolWrapper toolWrapper, IntentionAction action) { + if (toolWrapper instanceof LocalInspectionToolWrapper) { + Class aClass = action.getClass(); + if (action instanceof QuickFixWrapper) { + aClass = ((QuickFixWrapper)action).getFix().getClass(); + } + return new CleanupInspectionIntention(toolWrapper, aClass, action.getText()); + } + else if (toolWrapper instanceof GlobalInspectionToolWrapper) { + GlobalInspectionTool wrappedTool = ((GlobalInspectionToolWrapper)toolWrapper).getTool(); + if (wrappedTool instanceof GlobalSimpleInspectionTool && (action instanceof LocalQuickFix || action instanceof QuickFixWrapper)) { + Class aClass = action.getClass(); + if (action instanceof QuickFixWrapper) { + aClass = ((QuickFixWrapper)action).getFix().getClass(); + } + return new CleanupInspectionIntention(toolWrapper, aClass, action.getText()); + } + } + else { + throw new AssertionError("unknown tool: " + toolWrapper); + } + return null; + } + @Override @NotNull public LocalQuickFix convertToFix(@NotNull final IntentionAction action) { |