IDEA-198407 Add nullness annotations to base SearchEverywhereContributor class

This commit is contained in:
Mikhail Sokolov
2018-09-06 16:55:53 +03:00
parent 750769a996
commit e86a9f810d
10 changed files with 80 additions and 53 deletions
@@ -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<F> {
ExtensionPointName<SearchEverywhereContributorFactory<?>> EP_NAME = ExtensionPointName.create("com.intellij.searchEverywhereContributor");
@@ -27,6 +27,7 @@ public interface SearchEverywhereContributor<F> {
@NotNull
String getGroupName();
@Nullable
String includeNonProjectItemsText();
int getSortWeight();
@@ -37,15 +38,22 @@ public interface SearchEverywhereContributor<F> {
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<F> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer);
void fetchElements(@NotNull String pattern,
boolean everywhere,
@Nullable SearchEverywhereContributorFilter<F> filter,
@NotNull ProgressIndicator progressIndicator,
@NotNull Function<Object, Boolean> consumer);
default ContributorSearchResult<Object> search(String pattern, boolean everywhere, SearchEverywhereContributorFilter<F> filter,
ProgressIndicator progressIndicator, int elementsLimit) {
@NotNull
default ContributorSearchResult<Object> search(@NotNull String pattern,
boolean everywhere,
@Nullable SearchEverywhereContributorFilter<F> filter,
@NotNull ProgressIndicator progressIndicator,
int elementsLimit) {
ContributorSearchResult.Builder<Object> builder = ContributorSearchResult.builder();
fetchElements(pattern, everywhere, filter, progressIndicator, element -> {
if (elementsLimit < 0 || builder.itemsCount() < elementsLimit) {
@@ -61,20 +69,26 @@ public interface SearchEverywhereContributor<F> {
return builder.build();
}
default List<Object> search(String pattern, boolean everywhere, SearchEverywhereContributorFilter<F> filter,
ProgressIndicator progressIndicator) {
@NotNull
default List<Object> search(@NotNull String pattern,
boolean everywhere,
@Nullable SearchEverywhereContributorFilter<F> filter,
@NotNull ProgressIndicator progressIndicator) {
List<Object> 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<F> {
return true;
}
@NotNull
static List<SearchEverywhereContributorFactory<?>> getProviders() {
return Arrays.asList(EP_NAME.getExtensions());
}
@@ -65,8 +65,8 @@ public abstract class AbstractGotoSEContributor<F> implements SearchEverywhereCo
private static final Logger LOG = Logger.getInstance(AbstractGotoSEContributor.class);
@Override
public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter<F> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer) {
public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter<F> filter,
@NotNull ProgressIndicator progressIndicator, @NotNull Function<Object, Boolean> consumer) {
if (!isDumbModeSupported() && DumbService.getInstance(myProject).isDumb()) {
return;
}
@@ -74,7 +74,9 @@ public abstract class AbstractGotoSEContributor<F> implements SearchEverywhereCo
String suffix = pattern.endsWith(fullMatchSearchSuffix) ? fullMatchSearchSuffix : "";
String searchString = filterControlSymbols(pattern) + suffix;
FilteringGotoByModel<F> 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<F> implements SearchEverywhereCo
//todo param is unnecessary #UX-1
protected abstract FilteringGotoByModel<F> 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<F> 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<F> 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<F> 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<F> implements SearchEverywhereCo
}
@Override
public int getElementPriority(Object element, String searchPattern) {
public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) {
return 50;
}
@@ -57,8 +57,8 @@ public class ActionSearchEverywhereContributor implements SearchEverywhereContri
}
@Override
public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter<Void> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer) {
public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter<Void> filter,
@NotNull ProgressIndicator progressIndicator, @NotNull Function<Object, Boolean> 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) {
@@ -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;
}
@@ -59,7 +59,7 @@ public class FileSearchEverywhereContributor extends AbstractGotoSEContributor<F
}
@Override
public boolean processSelectedItem(Object selected, int modifiers, String searchText) {
public boolean processSelectedItem(@NotNull Object selected, int modifiers, @NotNull String searchText) {
if (selected instanceof PsiFile) {
VirtualFile file = ((PsiFile)selected).getVirtualFile();
if (file != null) {
@@ -77,7 +77,7 @@ public class FileSearchEverywhereContributor extends AbstractGotoSEContributor<F
}
@Override
public Object getDataForItem(Object element, String dataId) {
public Object getDataForItem(@NotNull Object element, @NotNull String dataId) {
if (CommonDataKeys.PSI_FILE.is(dataId) && element instanceof PsiFile) {
return element;
}
@@ -14,6 +14,7 @@ import com.intellij.psi.PsiManager;
import com.intellij.psi.codeStyle.MinusculeMatcher;
import com.intellij.psi.codeStyle.NameUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -51,13 +52,13 @@ public class RecentFilesSEContributor extends FileSearchEverywhereContributor {
}
@Override
public int getElementPriority(Object element, String searchPattern) {
public int getElementPriority(@NotNull Object element, @NotNull String searchPattern) {
return super.getElementPriority(element, searchPattern) + 1;
}
@Override
public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter<FileType> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer) {
public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter<FileType> filter,
@NotNull ProgressIndicator progressIndicator, @NotNull Function<Object, Boolean> consumer) {
String searchString = filterControlSymbols(pattern);
MinusculeMatcher matcher = NameUtil.buildMatcher("*" + searchString).build();
List<VirtualFile> opened = Arrays.asList(FileEditorManager.getInstance(myProject).getSelectedFiles());
@@ -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;
}
@@ -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<Void> {
}
@Override
public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter<Void> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer) {
public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter<Void> filter,
@NotNull ProgressIndicator progressIndicator, @NotNull Function<Object, Boolean> 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<Void> {
return false;
}
@NotNull
@Override
public ListCellRenderer getElementsRenderer(JList<?> list) {
public ListCellRenderer getElementsRenderer(@NotNull JList<?> list) {
return new TopHitRenderer(myProject);
}
@@ -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<String> 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<String> 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<Object> filter,
ProgressIndicator progressIndicator,
Function<Object, Boolean> consumer) {
@Nullable SearchEverywhereContributorFilter<Object> filter,
@NotNull ProgressIndicator progressIndicator,
@NotNull Function<Object, Boolean> consumer) {
boolean flag = true;
Iterator<String> 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;
}
};
@@ -72,8 +72,8 @@ public class YAMLKeysSearchEverywhereContributor implements SearchEverywhereCont
}
@Override
public void fetchElements(String pattern, boolean everywhere, SearchEverywhereContributorFilter<Language> filter,
ProgressIndicator progressIndicator, Function<Object, Boolean> consumer) {
public void fetchElements(@NotNull String pattern, boolean everywhere, @Nullable SearchEverywhereContributorFilter<Language> filter,
@NotNull ProgressIndicator progressIndicator, @NotNull Function<Object, Boolean> 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;
}