search everywhere: restore broken ability to search across all providers

This commit is contained in:
Vladimir Krivosheev
2019-02-28 17:42:50 +01:00
parent 785971b6fd
commit 2bbb71a614
2 changed files with 33 additions and 13 deletions
@@ -4,6 +4,7 @@ package com.intellij.ide.util.gotoByName;
import com.intellij.ide.DataManager;
import com.intellij.ide.SearchTopHitProvider;
import com.intellij.ide.actions.ApplyIntentionAction;
import com.intellij.ide.ui.OptionsSearchTopHitProvider;
import com.intellij.ide.ui.OptionsTopHitProvider;
import com.intellij.ide.ui.search.ActionFromOptionDescriptorProvider;
import com.intellij.ide.ui.search.OptionDescription;
@@ -101,11 +102,17 @@ public class GotoActionItemProvider implements ChooseByNameItemProvider {
String commandAccelerator = SearchTopHitProvider.getTopHitAccelerator();
for (SearchTopHitProvider provider : SearchTopHitProvider.EP_NAME.getExtensions()) {
//noinspection deprecation
if (provider instanceof OptionsTopHitProvider.CoveredByToggleActions) continue;
if (provider instanceof OptionsTopHitProvider && !StringUtil.startsWith(pattern, commandAccelerator)) {
String prefix = commandAccelerator + ((OptionsTopHitProvider)provider).getId() + " ";
if (provider instanceof OptionsTopHitProvider.CoveredByToggleActions) {
continue;
}
if (provider instanceof OptionsSearchTopHitProvider && !StringUtil.startsWith(pattern, commandAccelerator)) {
String prefix = commandAccelerator + ((OptionsSearchTopHitProvider)provider).getId() + " ";
provider.consumeTopHits(prefix + pattern, collector, project);
}
else if (project != null && provider instanceof OptionsTopHitProvider.ProjectLevelProvidersAdapter) {
((OptionsTopHitProvider.ProjectLevelProvidersAdapter)provider).consumeAllTopHits(pattern, collector, project);
}
provider.consumeTopHits(pattern, collector, project);
}
Collection<Object> result = collector.getResult();
@@ -94,23 +94,29 @@ public abstract class OptionsTopHitProvider implements OptionsSearchTopHitProvid
List<String> parts = StringUtil.split(pattern, " ");
if (!parts.isEmpty()) {
doConsumeTopHits(provider, pattern, parts, collector, project);
doConsumeTopHits(provider, pattern, parts.get(0), collector, project);
}
}
private static void doConsumeTopHits(@NotNull OptionsSearchTopHitProvider provider,
@NotNull String pattern,
@NotNull List<String> parts,
@NotNull String id,
@NotNull Consumer<Object> collector,
@Nullable Project project) {
String id = parts.get(0);
if (provider.getId().startsWith(id) || pattern.startsWith(" ")) {
pattern = pattern.startsWith(" ") ? pattern.trim() : pattern.substring(id.length()).trim().toLowerCase(Locale.ENGLISH);
final MinusculeMatcher matcher = NameUtil.buildMatcher("*" + pattern, NameUtil.MatchingCaseSensitivity.NONE);
for (OptionDescription option : getCachedOptions(provider, project)) {
if (matcher.matches(option.getOption())) {
collector.accept(option);
}
MinusculeMatcher matcher = NameUtil.buildMatcher("*" + pattern, NameUtil.MatchingCaseSensitivity.NONE);
consumeTopHitsForApplicableProvider(provider, matcher, collector, project);
}
}
private static void consumeTopHitsForApplicableProvider(@NotNull OptionsSearchTopHitProvider provider,
@NotNull MinusculeMatcher matcher,
@NotNull Consumer<Object> collector,
@Nullable Project project) {
for (OptionDescription option : getCachedOptions(provider, project)) {
if (matcher.matches(option.getOption())) {
collector.accept(option);
}
}
}
@@ -179,7 +185,7 @@ public abstract class OptionsTopHitProvider implements OptionsSearchTopHitProvid
// ours ProjectLevelProvider registered in ours projectOptionsTopHitProvider extension point,
// not in common topHitProvider, so, this adapter is required to expose ours project level providers.
static final class ProjectLevelProvidersAdapter implements SearchTopHitProvider {
public static final class ProjectLevelProvidersAdapter implements SearchTopHitProvider {
@Override
public void consumeTopHits(@NotNull String pattern, @NotNull Consumer<Object> collector, @Nullable Project project) {
if (project == null) {
@@ -197,7 +203,14 @@ public abstract class OptionsTopHitProvider implements OptionsSearchTopHitProvid
}
for (OptionsSearchTopHitProvider.ProjectLevelProvider provider : PROJECT_LEVEL_EP.getExtensionList()) {
doConsumeTopHits(provider, pattern, parts, collector, project);
doConsumeTopHits(provider, pattern, parts.get(0), collector, project);
}
}
public void consumeAllTopHits(@NotNull String pattern, @NotNull Consumer<Object> collector, @Nullable Project project) {
MinusculeMatcher matcher = NameUtil.buildMatcher("*" + pattern, NameUtil.MatchingCaseSensitivity.NONE);
for (OptionsSearchTopHitProvider.ProjectLevelProvider provider : PROJECT_LEVEL_EP.getExtensionList()) {
consumeTopHitsForApplicableProvider(provider, matcher, collector, project);
}
}
}