call isAvailable() for DO_NOT_SHOW fixes in tests

This commit is contained in:
Alexey Kudravtsev
2016-11-18 15:17:02 +03:00
parent 953d072cc9
commit 99f5e2bde9
2 changed files with 33 additions and 21 deletions
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.intention.impl;
import com.google.common.annotations.VisibleForTesting;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.ShowIntentionsPass;
import com.intellij.codeInsight.hint.HintManager;
@@ -43,9 +42,11 @@ import gnu.trove.THashSet;
import gnu.trove.TObjectHashingStrategy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author cdr
@@ -53,10 +54,8 @@ import java.util.*;
public class IntentionListStep implements ListPopupStep<IntentionActionWithTextCaching>, SpeedSearchFilter<IntentionActionWithTextCaching> {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.intention.impl.IntentionListStep");
private final Set<IntentionActionWithTextCaching> myCachedIntentions =
ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedErrorFixes =
ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedIntentions = ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedErrorFixes = ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedInspectionFixes = ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedGutters = ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
private final Set<IntentionActionWithTextCaching> myCachedNotifications = ContainerUtil.newConcurrentSet(ACTION_TEXT_AND_CLASS_EQUALS);
@@ -81,10 +80,10 @@ public class IntentionListStep implements ListPopupStep<IntentionActionWithTextC
private Runnable myFinalRunnable;
public IntentionListStep(@Nullable IntentionHintComponent intentionHintComponent,
@NotNull ShowIntentionsPass.IntentionsInfo intentions,
@Nullable Editor editor,
@NotNull PsiFile file,
@NotNull Project project) {
@NotNull ShowIntentionsPass.IntentionsInfo intentions,
@Nullable Editor editor,
@NotNull PsiFile file,
@NotNull Project project) {
this(intentionHintComponent, editor, file, project);
wrapAndUpdateActions(intentions, false); // when create bulb do not update actions again since it would impede the EDT
}
@@ -204,12 +203,10 @@ public class IntentionListStep implements ListPopupStep<IntentionActionWithTextC
}
}
}
else {
if (!option.isAvailable(myProject, containingEditor, containingFile)) {
// if option is not applicable in injected fragment, check in host file context
if (containingEditor == myEditor || !option.isAvailable(myProject, myEditor, myFile)) {
continue;
}
else if (!option.isAvailable(myProject, containingEditor, containingFile)) {
// if option is not applicable in injected fragment, check in host file context
if (containingEditor == myEditor || !option.isAvailable(myProject, myEditor, myFile)) {
continue;
}
}
IntentionActionWithTextCaching textCaching = new IntentionActionWithTextCaching(option);
@@ -302,12 +299,20 @@ public class IntentionListStep implements ListPopupStep<IntentionActionWithTextC
return optionIntention instanceof Iconable ? ((Iconable)optionIntention).getIcon(0) : null;
}
@VisibleForTesting
@TestOnly
public Map<IntentionAction, List<IntentionAction>> getActionsWithSubActions() {
Map<IntentionAction, List<IntentionAction>> result = ContainerUtil.newLinkedHashMap();
for (IntentionActionWithTextCaching action : getValues()) {
List<IntentionActionWithTextCaching> subActions = getSubStep(action, action.getToolName()).getValues();
result.put(action.getAction(), ContainerUtil.map(subActions, IntentionActionWithTextCaching::getAction));
for (IntentionActionWithTextCaching cached : getValues()) {
IntentionAction action = cached.getAction();
if (ShowIntentionActionsHandler.chooseFileForAction(myFile, myEditor, action) == null) continue;
List<IntentionActionWithTextCaching> subActions = getSubStep(cached, cached.getToolName()).getValues();
List<IntentionAction> options = subActions.stream()
.map(IntentionActionWithTextCaching::getAction)
.filter(option -> ShowIntentionActionsHandler.chooseFileForAction(myFile, myEditor, option) != null)
.collect(Collectors.toList());
result.put(action, options);
}
return result;
}
@@ -178,8 +178,7 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler {
FeatureUsageTracker.getInstance().triggerFeatureUsed("codeassists.quickFix");
((FeatureUsageTrackerImpl)FeatureUsageTracker.getInstance()).getFixesStats().registerInvocation();
final Pair<PsiFile, Editor> pair = hostEditor != null ? chooseBetweenHostAndInjected(hostFile, hostEditor,
(psiFile, editor) -> availableFor(psiFile, editor, action)) : Pair.<PsiFile, Editor>create(hostFile, null);
final Pair<PsiFile, Editor> pair = chooseFileForAction(hostFile, hostEditor, action);
if (pair == null) return false;
CommandProcessor.getInstance().executeCommand(project, () -> TransactionGuard.getInstance().submitTransactionAndWait(() -> {
@@ -200,4 +199,12 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler {
}), text, null);
return true;
}
static Pair<PsiFile, Editor> chooseFileForAction(@NotNull PsiFile hostFile,
@Nullable Editor hostEditor,
@NotNull IntentionAction action) {
return hostEditor == null ? Pair.create(hostFile, null) :
chooseBetweenHostAndInjected(hostFile, hostEditor, (psiFile, editor) -> availableFor(psiFile, editor, action));
}
}