diff --git a/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereContributor.java b/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereContributor.java index c5f480e9554a..1546e99b0f4f 100644 --- a/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereContributor.java +++ b/platform/lang-api/src/com/intellij/ide/actions/searcheverywhere/SearchEverywhereContributor.java @@ -6,6 +6,7 @@ package com.intellij.ide.actions.searcheverywhere; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.progress.ProgressIndicator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; @@ -16,7 +17,6 @@ import java.util.function.Function; /** * @author Konstantin Bulenkov */ -//todo generic? #UX-1 public interface SearchEverywhereContributor { ExtensionPointName> EP_NAME = ExtensionPointName.create("com.intellij.searchEverywhereContributor"); @@ -27,6 +27,7 @@ public interface SearchEverywhereContributor { @NotNull String getGroupName(); + @Nullable String includeNonProjectItemsText(); int getSortWeight(); @@ -37,15 +38,22 @@ public interface SearchEverywhereContributor { return false; } - default int getElementPriority(Object element, String searchPattern) { + default int getElementPriority(@NotNull Object element, @NotNull String searchPattern) { return 0; } - void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, Function consumer); + void fetchElements(@NotNull String pattern, + boolean everywhere, + @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, + @NotNull Function consumer); - default ContributorSearchResult search(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, int elementsLimit) { + @NotNull + default ContributorSearchResult search(@NotNull String pattern, + boolean everywhere, + @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, + int elementsLimit) { ContributorSearchResult.Builder builder = ContributorSearchResult.builder(); fetchElements(pattern, everywhere, filter, progressIndicator, element -> { if (elementsLimit < 0 || builder.itemsCount() < elementsLimit) { @@ -61,20 +69,26 @@ public interface SearchEverywhereContributor { return builder.build(); } - default List search(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator) { + @NotNull + default List search(@NotNull String pattern, + boolean everywhere, + @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator) { List res = new ArrayList<>(); fetchElements(pattern, everywhere, filter, progressIndicator, o -> res.add(o)); return res; } - boolean processSelectedItem(Object selected, int modifiers, String searchText); + boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String searchText); - ListCellRenderer getElementsRenderer(JList list); + @NotNull + ListCellRenderer getElementsRenderer(@NotNull JList list); - Object getDataForItem(Object element, String dataId); + @Nullable + Object getDataForItem(@NotNull Object element, @NotNull String dataId); - default String filterControlSymbols(String pattern) { + @NotNull + default String filterControlSymbols(@NotNull String pattern) { return pattern; } @@ -86,6 +100,7 @@ public interface SearchEverywhereContributor { return true; } + @NotNull static List> getProviders() { return Arrays.asList(EP_NAME.getExtensions()); } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/AbstractGotoSEContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/AbstractGotoSEContributor.java index 77ee174588e8..37d168ee8b15 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/AbstractGotoSEContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/AbstractGotoSEContributor.java @@ -65,8 +65,8 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo private static final Logger LOG = Logger.getInstance(AbstractGotoSEContributor.class); @Override - public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, Function consumer) { + public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, @NotNull Function consumer) { if (!isDumbModeSupported() && DumbService.getInstance(myProject).isDumb()) { return; } @@ -74,7 +74,9 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo String suffix = pattern.endsWith(fullMatchSearchSuffix) ? fullMatchSearchSuffix : ""; String searchString = filterControlSymbols(pattern) + suffix; FilteringGotoByModel model = createModel(myProject); - model.setFilterItems(filter.getSelectedElements()); + if (filter != null) { + model.setFilterItems(filter.getSelectedElements()); + } ChooseByNamePopup popup = ChooseByNamePopup.createPopup(myProject, model, (PsiElement)null); try { ApplicationManager.getApplication().runReadAction(() -> { @@ -95,8 +97,9 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo //todo param is unnecessary #UX-1 protected abstract FilteringGotoByModel createModel(Project project); + @NotNull @Override - public String filterControlSymbols(String pattern) { + public String filterControlSymbols(@NotNull String pattern) { if (StringUtil.containsAnyChar(pattern, ":,;@[( #") || pattern.contains(" line ") || pattern.contains("?l=")) { // quick test if reg exp should be used return applyPatternFilter(pattern, patternToDetectLinesAndColumns); } @@ -119,7 +122,7 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo } @Override - public boolean processSelectedItem(Object selected, int modifiers, String searchText) { + public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String searchText) { if (selected instanceof PsiElement) { if (!((PsiElement)selected).isValid()) { LOG.warn("Cannot navigate to invalid PsiElement"); @@ -143,7 +146,7 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo } @Override - public Object getDataForItem(Object element, String dataId) { + public Object getDataForItem(@NotNull Object element, @NotNull String dataId) { if (CommonDataKeys.PSI_ELEMENT.is(dataId) && element instanceof PsiElement) { return element; } @@ -156,8 +159,9 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo return true; } + @NotNull @Override - public ListCellRenderer getElementsRenderer(JList list) { + public ListCellRenderer getElementsRenderer(@NotNull JList list) { return new SearchEverywherePsiRenderer(list) { @Override public String getElementText(PsiElement element) { @@ -172,7 +176,7 @@ public abstract class AbstractGotoSEContributor implements SearchEverywhereCo } @Override - public int getElementPriority(Object element, String searchPattern) { + public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) { return 50; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ActionSearchEverywhereContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ActionSearchEverywhereContributor.java index 1bd2e0bf0517..e59a0bdcea6c 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ActionSearchEverywhereContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ActionSearchEverywhereContributor.java @@ -57,8 +57,8 @@ public class ActionSearchEverywhereContributor implements SearchEverywhereContri } @Override - public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, Function consumer) { + public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, @NotNull Function consumer) { if (StringUtil.isEmptyOrSpaces(pattern)) { return; } @@ -80,8 +80,9 @@ public class ActionSearchEverywhereContributor implements SearchEverywhereContri } + @NotNull @Override - public ListCellRenderer getElementsRenderer(JList list) { + public ListCellRenderer getElementsRenderer(@NotNull JList list) { return new GotoActionModel.GotoActionListCellRenderer(myModel::getGroupName, true); } @@ -97,7 +98,7 @@ public class ActionSearchEverywhereContributor implements SearchEverywhereContri } @Override - public Object getDataForItem(Object element, String dataId) { + public Object getDataForItem(@NotNull Object element, @NotNull String dataId) { if (SetShortcutAction.SELECTED_ACTION.is(dataId)) { Object value = ((GotoActionModel.MatchedValue)element).value; if (value instanceof GotoActionModel.ActionWrapper) { @@ -113,7 +114,7 @@ public class ActionSearchEverywhereContributor implements SearchEverywhereContri } @Override - public boolean processSelectedItem(Object selected, int modifiers, String text) { + public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String text) { selected = ((GotoActionModel.MatchedValue) selected).value; if (selected instanceof BooleanOptionDescription) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ClassSearchEverywhereContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ClassSearchEverywhereContributor.java index 32dfd824a0e4..4759aff850b1 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ClassSearchEverywhereContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/ClassSearchEverywhereContributor.java @@ -60,8 +60,9 @@ public class ClassSearchEverywhereContributor extends AbstractGotoSEContributor< return new GotoClassModel2(project); } + @NotNull @Override - public String filterControlSymbols(String pattern) { + public String filterControlSymbols(@NotNull String pattern) { if (pattern.indexOf('#') != -1) { pattern = applyPatternFilter(pattern, patternToDetectMembers); } @@ -74,7 +75,7 @@ public class ClassSearchEverywhereContributor extends AbstractGotoSEContributor< } @Override - public int getElementPriority(Object element, String searchPattern) { + public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) { return super.getElementPriority(element, searchPattern) + 5; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/FileSearchEverywhereContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/FileSearchEverywhereContributor.java index 6488f7ff4478..4d196f2b67b3 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/FileSearchEverywhereContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/FileSearchEverywhereContributor.java @@ -59,7 +59,7 @@ public class FileSearchEverywhereContributor extends AbstractGotoSEContributor filter, - ProgressIndicator progressIndicator, Function consumer) { + public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, @NotNull Function consumer) { String searchString = filterControlSymbols(pattern); MinusculeMatcher matcher = NameUtil.buildMatcher("*" + searchString).build(); List opened = Arrays.asList(FileEditorManager.getInstance(myProject).getSelectedFiles()); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SymbolSearchEverywhereContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SymbolSearchEverywhereContributor.java index 5c4b4ad675b1..95ccd656c525 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SymbolSearchEverywhereContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/SymbolSearchEverywhereContributor.java @@ -43,7 +43,7 @@ public class SymbolSearchEverywhereContributor extends AbstractGotoSEContributor } @Override - public int getElementPriority(Object element, String searchPattern) { + public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) { return super.getElementPriority(element, searchPattern) + 3; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/TopHitSEContributor.java b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/TopHitSEContributor.java index 94ebb61a5890..7ee90e8d4e99 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/TopHitSEContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/searcheverywhere/TopHitSEContributor.java @@ -28,6 +28,7 @@ import com.intellij.util.IconUtil; import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; @@ -80,18 +81,18 @@ public class TopHitSEContributor implements SearchEverywhereContributor { } @Override - public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, Function consumer) { + public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, @NotNull Function consumer) { fill(pattern, consumer); } @Override - public Object getDataForItem(Object element, String dataId) { + public Object getDataForItem(@NotNull Object element, @NotNull String dataId) { return null; } @Override - public boolean processSelectedItem(Object selected, int modifiers, String text) { + public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String text) { if (selected instanceof BooleanOptionDescription) { final BooleanOptionDescription option = (BooleanOptionDescription) selected; option.setOptionState(!option.isOptionEnabled()); @@ -111,8 +112,9 @@ public class TopHitSEContributor implements SearchEverywhereContributor { return false; } + @NotNull @Override - public ListCellRenderer getElementsRenderer(JList list) { + public ListCellRenderer getElementsRenderer(@NotNull JList list) { return new TopHitRenderer(myProject); } diff --git a/platform/lang-impl/testSources/com/intellij/ide/actions/searcheverywhere/MultithreadSearchTest.java b/platform/lang-impl/testSources/com/intellij/ide/actions/searcheverywhere/MultithreadSearchTest.java index 0f9c1d347e6e..8f8000fb183d 100644 --- a/platform/lang-impl/testSources/com/intellij/ide/actions/searcheverywhere/MultithreadSearchTest.java +++ b/platform/lang-impl/testSources/com/intellij/ide/actions/searcheverywhere/MultithreadSearchTest.java @@ -7,6 +7,7 @@ import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCa import com.intellij.util.Alarm; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.junit.Assert; import javax.swing.*; @@ -30,7 +31,7 @@ public class MultithreadSearchTest extends LightPlatformCodeInsightFixtureTestCa MultithreadSearcher searcher = new MultithreadSearcher(collector, command -> alarm.addRequest(command, 0)); scenarios.forEach(scenario -> { - searcher.search(scenario.contributorsAndLimits, null, false, ignrd -> null); + searcher.search(scenario.contributorsAndLimits, "", false, ignrd -> null); collector.awaitFinish(); scenario.results.forEach((contributorId, results) -> { List values = collector.getContributorValues(contributorId); @@ -47,7 +48,7 @@ public class MultithreadSearchTest extends LightPlatformCodeInsightFixtureTestCa SESearcher searcher = new SingleThreadSearcher(collector, command -> alarm.addRequest(command, 0)); scenarios.forEach(scenario -> { - searcher.search(scenario.contributorsAndLimits, null, false, ignrd -> null); + searcher.search(scenario.contributorsAndLimits, "", false, ignrd -> null); collector.awaitFinish(); scenario.results.forEach((contributorId, results) -> { List values = collector.getContributorValues(contributorId); @@ -344,16 +345,16 @@ public class MultithreadSearchTest extends LightPlatformCodeInsightFixtureTestCa } @Override - public int getElementPriority(Object element, String searchPattern) { + public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) { return fixedPriority; } @Override - public void fetchElements(String pattern, + public void fetchElements(@NotNull String pattern, boolean everywhere, - SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, - Function consumer) { + @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, + @NotNull Function consumer) { boolean flag = true; Iterator iterator = Arrays.asList(items).iterator(); while (flag && iterator.hasNext()) { @@ -363,17 +364,18 @@ public class MultithreadSearchTest extends LightPlatformCodeInsightFixtureTestCa } @Override - public boolean processSelectedItem(Object selected, int modifiers, String searchText) { + public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String searchText) { return false; } + @NotNull @Override - public ListCellRenderer getElementsRenderer(JList list) { + public ListCellRenderer getElementsRenderer(@NotNull JList list) { return null; } @Override - public Object getDataForItem(Object element, String dataId) { + public Object getDataForItem(@NotNull Object element, @NotNull String dataId) { return null; } }; diff --git a/plugins/yaml/src/org/jetbrains/yaml/navigation/YAMLKeysSearchEverywhereContributor.java b/plugins/yaml/src/org/jetbrains/yaml/navigation/YAMLKeysSearchEverywhereContributor.java index 9a678820388a..939c629008ac 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/navigation/YAMLKeysSearchEverywhereContributor.java +++ b/plugins/yaml/src/org/jetbrains/yaml/navigation/YAMLKeysSearchEverywhereContributor.java @@ -72,8 +72,8 @@ public class YAMLKeysSearchEverywhereContributor implements SearchEverywhereCont } @Override - public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter filter, - ProgressIndicator progressIndicator, Function consumer) { + public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter filter, + @NotNull ProgressIndicator progressIndicator, @NotNull Function consumer) { if (myProject == null || DumbService.getInstance(myProject).isDumb() || pattern.isEmpty()) { return; } @@ -82,20 +82,21 @@ public class YAMLKeysSearchEverywhereContributor implements SearchEverywhereCont } @Override - public boolean processSelectedItem(Object selected, int modifiers, String searchText) { + public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String searchText) { if (selected instanceof Navigatable) { ((Navigatable)selected).navigate(true); } return true; } + @NotNull @Override - public ListCellRenderer getElementsRenderer(JList list) { + public ListCellRenderer getElementsRenderer(@NotNull JList list) { return new NavigationItemListCellRenderer(); } @Override - public Object getDataForItem(Object element, String dataId) { + public Object getDataForItem(@NotNull Object element, @NotNull String dataId) { return null; }