diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodTextOccurrenceProcessor.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodTextOccurrenceProcessor.java index 6f287c6c8643..5e6a35a54a72 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodTextOccurrenceProcessor.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodTextOccurrenceProcessor.java @@ -42,7 +42,7 @@ public final class MethodTextOccurrenceProcessor extends RequestResultProcessor } @Override - public boolean processTextOccurrence(PsiElement element, int offsetInElement, final Processor consumer) { + public boolean processTextOccurrence(@NotNull PsiElement element, int offsetInElement, @NotNull final Processor consumer) { for (PsiReference ref : ourReferenceService.getReferences(element, new PsiReferenceService.Hints(myMethods[0], offsetInElement))) { if (ReferenceRange.containsOffsetInElement(ref, offsetInElement) && !processReference(consumer, ref)) { return false; diff --git a/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java index cda5223ece04..6069d26024f4 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java +++ b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java @@ -28,12 +28,11 @@ public class PsiSearchRequest { public final RequestResultProcessor processor; public PsiSearchRequest(@NotNull SearchScope searchScope, - @NotNull String word, - short searchContext, - boolean caseSensitive, - @NotNull RequestResultProcessor processor) { - - if (word.length() == 0) { + @NotNull String word, + short searchContext, + boolean caseSensitive, + @NotNull RequestResultProcessor processor) { + if (word.isEmpty()) { throw new IllegalArgumentException("Cannot search for elements with empty text"); } this.searchScope = searchScope; @@ -57,20 +56,18 @@ public class PsiSearchRequest { if (caseSensitive != that.caseSensitive) return false; if (searchContext != that.searchContext) return false; - if (processor != null ? !processor.equals(that.processor) : that.processor != null) return false; - if (searchScope != null ? !searchScope.equals(that.searchScope) : that.searchScope != null) return false; - if (word != null ? !word.equals(that.word) : that.word != null) return false; - - return true; + if (!processor.equals(that.processor)) return false; + if (!searchScope.equals(that.searchScope)) return false; + return word.equals(that.word); } @Override public int hashCode() { - int result = searchScope != null ? searchScope.hashCode() : 0; - result = 31 * result + (word != null ? word.hashCode() : 0); + int result = searchScope.hashCode(); + result = 31 * result + word.hashCode(); result = 31 * result + (int)searchContext; result = 31 * result + (caseSensitive ? 1 : 0); - result = 31 * result + (processor != null ? processor.hashCode() : 0); + result = 31 * result + processor.hashCode(); return result; } } diff --git a/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java index edc1b64d6e68..8f9bb141d538 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java @@ -39,9 +39,7 @@ public abstract class RequestResultProcessor { RequestResultProcessor that = (RequestResultProcessor)o; - if (!myEquality.equals(that.myEquality)) return false; - - return true; + return myEquality.equals(that.myEquality); } @Override @@ -49,6 +47,5 @@ public abstract class RequestResultProcessor { return myEquality.hashCode(); } - public abstract boolean processTextOccurrence(PsiElement element, int offsetInElement, final Processor consumer); - + public abstract boolean processTextOccurrence(@NotNull PsiElement element, int offsetInElement, @NotNull Processor consumer); } diff --git a/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java index 2f860e1e3527..57f72311e0f9 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java @@ -36,7 +36,7 @@ public final class SingleTargetRequestResultProcessor extends RequestResultProce myTarget = target; } - public boolean processTextOccurrence(PsiElement element, int offsetInElement, final Processor consumer) { + public boolean processTextOccurrence(@NotNull PsiElement element, int offsetInElement, @NotNull final Processor consumer) { final List references = ourReferenceService.getReferences(element, new PsiReferenceService.Hints(myTarget, offsetInElement)); for (PsiReference ref : references) { diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java index 34e67696ed41..948f54bf7fac 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java @@ -60,21 +60,21 @@ public class LowLevelSearchUtil { return Boolean.TRUE; } - private static boolean processTreeUp(final TextOccurenceProcessor processor, - final PsiElement scope, - final StringSearcher searcher, + private static boolean processTreeUp(@NotNull TextOccurenceProcessor processor, + @NotNull PsiElement scope, + @NotNull StringSearcher searcher, final int offset, final boolean processInjectedPsi, ProgressIndicator progress) { final int scopeStartOffset = scope.getTextRange().getStartOffset(); final int patternLength = searcher.getPatternLength(); - PsiElement leafElement = null; - TreeElement leafNode = null; ASTNode scopeNode = scope.getNode(); boolean useTree = scopeNode != null; assert scope.isValid(); int start; + TreeElement leafNode = null; + PsiElement leafElement = null; if (useTree) { leafNode = (LeafElement)scopeNode.findLeafElementAt(offset); if (leafNode == null) return true; diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 90f411c3b023..cb94bbe4bd32 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -116,7 +116,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { @NotNull final String text, short searchContext, final boolean caseSensitively) { - if (text.length() == 0) { + if (text.isEmpty()) { throw new IllegalArgumentException("Cannot search for elements with empty text"); } final ProgressIndicator progress = ProgressIndicatorProvider.getGlobalProgressIndicator(); @@ -272,20 +272,21 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { @NotNull private List getFilesWithText(@NotNull GlobalSearchScope scope, - final short searchContext, - final boolean caseSensitively, - @NotNull String text, - ProgressIndicator progress) { + final short searchContext, + final boolean caseSensitively, + @NotNull String text, + final ProgressIndicator progress) { myManager.startBatchFilesProcessingMode(); try { final List result = new ArrayList(); - boolean success = processFilesWithText( - scope, - searchContext, - caseSensitively, - text, - new CommonProcessors.CollectProcessor(result) - ); + Processor processor = new CommonProcessors.CollectProcessor(result){ + @Override + public boolean process(VirtualFile file) { + if (progress != null) progress.checkCanceled(); + return super.process(file); + } + }; + boolean success = processFilesWithText(scope, searchContext, caseSensitively, text, processor); LOG.assertTrue(success); return result; } @@ -299,7 +300,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { final boolean caseSensitively, @NotNull String text, @NotNull final Processor processor) { - final ArrayList entries = getWordEntries(text, caseSensitively); + List entries = getWordEntries(text, caseSensitively); if (entries.isEmpty()) return true; final CommonProcessors.CollectProcessor collectProcessor = new CommonProcessors.CollectProcessor(); @@ -308,7 +309,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { public boolean value(Integer integer) { return (integer.intValue() & searchContext) != 0; } - }, collectProcessor, getWordEntries(text, caseSensitively)); + }, collectProcessor, entries); final FileIndexFacade index = FileIndexFacade.getInstance(myManager.getProject()); return ContainerUtil.process(collectProcessor.getResults(), new ReadActionProcessor() { @@ -341,7 +342,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { @NotNull String qName, @NotNull final PsiNonJavaFileReferenceProcessor processor, @NotNull final GlobalSearchScope initialScope) { - if (qName.length() == 0) { + if (qName.isEmpty()) { throw new IllegalArgumentException("Cannot search for elements with empty text"); } final ProgressIndicator progress = ProgressIndicatorProvider.getGlobalProgressIndicator(); @@ -450,15 +451,15 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { } private static class RequestWithProcessor { - final PsiSearchRequest request; - Processor refProcessor; + @NotNull final PsiSearchRequest request; + @NotNull Processor refProcessor; - private RequestWithProcessor(PsiSearchRequest first, Processor second) { + private RequestWithProcessor(@NotNull PsiSearchRequest first, @NotNull Processor second) { request = first; refProcessor = second; } - boolean uniteWith(final RequestWithProcessor another) { + boolean uniteWith(@NotNull final RequestWithProcessor another) { if (request.equals(another.request)) { final Processor myProcessor = refProcessor; if (myProcessor != another.refProcessor) { @@ -489,9 +490,9 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { ProgressIndicator progress = ProgressIndicatorProvider.getGlobalProgressIndicator(); do { - final MultiMap, RequestWithProcessor> globals = new MultiMap, RequestWithProcessor>(); - final List> customs = ContainerUtil.newArrayList(); - final LinkedHashSet locals = ContainerUtil.newLinkedHashSet(); + MultiMap, RequestWithProcessor> globals = new MultiMap, RequestWithProcessor>(); + List> customs = ContainerUtil.newArrayList(); + Set locals = ContainerUtil.newLinkedHashSet(); distributePrimitives(collectors, locals, globals, customs); if (!processGlobalRequestsOptimized(globals, progress)) { @@ -529,7 +530,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return changed; } - private boolean processGlobalRequestsOptimized(MultiMap, RequestWithProcessor> singles, + private boolean processGlobalRequestsOptimized(@NotNull MultiMap, RequestWithProcessor> singles, final ProgressIndicator progress) { if (singles.isEmpty()) { return true; @@ -565,7 +566,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { if (progress != null) { final StringBuilder result = new StringBuilder(); for (String string : allWords) { - if (string != null && string.length() != 0) { + if (string != null && !string.isEmpty()) { if (result.length() > 50) { result.append("..."); break; @@ -599,8 +600,9 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { } } - private static TextOccurenceProcessor adaptProcessor(final PsiSearchRequest singleRequest, - final Processor consumer) { + @NotNull + private static TextOccurenceProcessor adaptProcessor(@NotNull PsiSearchRequest singleRequest, + @NotNull final Processor consumer) { final SearchScope searchScope = singleRequest.searchScope; final boolean ignoreInjectedPsi = searchScope instanceof LocalSearchScope && ((LocalSearchScope)searchScope).isIgnoreInjectedPsi(); final RequestResultProcessor wrapped = singleRequest.processor; @@ -714,17 +716,19 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return local; } - private static void distributePrimitives(final Map> collectors, - LinkedHashSet locals, - MultiMap, RequestWithProcessor> singles, - List> customs) { - for (final SearchRequestCollector collector : collectors.keySet()) { - final Processor processor = collectors.get(collector); + private static void distributePrimitives(@NotNull Map> collectors, + @NotNull Set locals, + @NotNull MultiMap, RequestWithProcessor> singles, + @NotNull List> customs) { + for (final Map.Entry> entry : collectors.entrySet()) { + final Processor processor = entry.getValue(); + SearchRequestCollector collector = entry.getKey(); for (final PsiSearchRequest primitive : collector.takeSearchRequests()) { final SearchScope scope = primitive.searchScope; if (scope instanceof LocalSearchScope) { registerRequest(locals, primitive, processor); - } else { + } + else { final List words = StringUtil.getWordsInStringLongestFirst(primitive.word); final Set key = new HashSet(words.size() * 2); for (String word : words) { @@ -755,7 +759,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { collection.add(newValue); } - private boolean processSingleRequest(PsiSearchRequest single, Processor consumer) { + private boolean processSingleRequest(@NotNull PsiSearchRequest single, @NotNull Processor consumer) { return processElementsWithWord(adaptProcessor(single, consumer), single.searchScope, single.word, single.searchContext, single.caseSensitive); } @@ -763,8 +767,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { public SearchCostResult isCheapEnoughToSearch(@NotNull String name, @NotNull final GlobalSearchScope scope, @Nullable final PsiFile fileToIgnoreOccurencesIn, - @Nullable ProgressIndicator progress) { - + @Nullable final ProgressIndicator progress) { final AtomicInteger count = new AtomicInteger(); final FileIndexFacade index = FileIndexFacade.getInstance(myManager.getProject()); final Processor processor = new Processor() { @@ -773,14 +776,15 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { @Override public boolean process(VirtualFile file) { + if (progress != null) progress.checkCanceled(); if (Comparing.equal(file, fileToIgnoreOccurencesInVirtualFile)) return true; if (!index.shouldBeFound(scope, file)) return true; final int value = count.incrementAndGet(); return value < 10; } }; - final ArrayList keys = getWordEntries(name, true); - final boolean cheap = keys.isEmpty() || processFilesContainingAllKeys(scope, null, processor, keys); + List keys = getWordEntries(name, true); + boolean cheap = keys.isEmpty() || processFilesContainingAllKeys(scope, null, processor, keys); if (!cheap) { return SearchCostResult.TOO_MANY_OCCURRENCES; @@ -789,9 +793,10 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return count.get() == 0 ? SearchCostResult.ZERO_OCCURRENCES : SearchCostResult.FEW_OCCURRENCES; } - private static boolean processFilesContainingAllKeys(final GlobalSearchScope scope, + private static boolean processFilesContainingAllKeys(@NotNull final GlobalSearchScope scope, @Nullable final Condition checker, - final Processor processor, final Collection keys) { + @NotNull final Processor processor, + @NotNull final Collection keys) { return ApplicationManager.getApplication().runReadAction(new NullableComputable() { @Override public Boolean compute() { @@ -800,7 +805,8 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { }); } - private static ArrayList getWordEntries(String name, boolean caseSensitively) { + @NotNull + private static List getWordEntries(@NotNull String name, boolean caseSensitively) { List words = StringUtil.getWordsInStringLongestFirst(name); final ArrayList keys = new ArrayList(); for (String word : words) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GrAliasedImportedElementSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GrAliasedImportedElementSearcher.java index 3b89fe4310ca..112e6b60c53c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GrAliasedImportedElementSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GrAliasedImportedElementSearcher.java @@ -80,7 +80,7 @@ public class GrAliasedImportedElementSearcher extends QueryExecutorBase consumer) { + public boolean processTextOccurrence(@NotNull final PsiElement element, int offsetInElement, @NotNull Processor consumer) { String alias = getAlias(element); if (alias == null) return true; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/MethodLateBoundReferencesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/MethodLateBoundReferencesSearcher.java index 8f4b24b2f836..ec49358380a7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/MethodLateBoundReferencesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/MethodLateBoundReferencesSearcher.java @@ -76,7 +76,7 @@ public class MethodLateBoundReferencesSearcher extends QueryExecutorBase consumer) { + public boolean processTextOccurrence(@NotNull PsiElement element, int offsetInElement, @NotNull Processor consumer) { if (!(element instanceof GrReferenceExpression)) { return true; }