blob: 8f2db591888d947a83fef3584255af032b22d9d1 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.search;
import com.intellij.concurrency.AsyncFuture;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.util.Processor;
import org.intellij.lang.annotations.MagicConstant;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Provides low-level search and find usages services for a project, like finding references
* to an element, finding overriding / inheriting elements, finding to do items and so on.
*
* Use {@link com.intellij.psi.search.PsiSearchHelper.SERVICE#getInstance}() to get a search helper instance.
*/
public interface PsiSearchHelper {
class SERVICE {
private SERVICE() {
}
public static PsiSearchHelper getInstance(Project project) {
return ServiceManager.getService(project, PsiSearchHelper.class);
}
}
/**
* Searches the specified scope for comments containing the specified identifier.
*
* @param identifier the identifier to search.
* @param searchScope the scope in which occurrences are searched.
* @return the array of found comments.
*/
@NotNull
PsiElement[] findCommentsContainingIdentifier(@NotNull String identifier, @NotNull SearchScope searchScope);
/**
* Processes the specified scope and hands comments containing the specified identifier over to the processor.
*
* @param identifier the identifier to search.
* @param searchScope the scope in which occurrences are searched.
* @return false if processor returned false, true otherwise
*/
boolean processCommentsContainingIdentifier(@NotNull String identifier, @NotNull SearchScope searchScope, @NotNull Processor<PsiElement> processor);
/**
* Returns the list of files which contain the specified word in "plain text"
* context (for example, plain text files or attribute values in XML files).
*
* @param word the word to search.
* @return the list of files containing the word.
*/
@NotNull
PsiFile[] findFilesWithPlainTextWords(@NotNull String word);
/**
* Passes all occurrences of the specified full-qualified class name in plain text context
* to the specified processor.
*
* @param qName the class name to search.
* @param processor the processor which accepts the references.
* @param searchScope the scope in which occurrences are searched.
*/
boolean processUsagesInNonJavaFiles(@NotNull String qName,
@NotNull PsiNonJavaFileReferenceProcessor processor,
@NotNull GlobalSearchScope searchScope);
/**
* Passes all occurrences of the specified fully qualified class name in plain text context in the
* use scope of the specified element to the specified processor.
*
* @param originalElement the element whose use scope is used to restrict the search scope,
* or null if the search scope is not restricted.
* @param qName the class name to search.
* @param processor the processor which accepts the references.
* @param searchScope the scope in which occurrences are searched.
*/
boolean processUsagesInNonJavaFiles(@Nullable PsiElement originalElement,
@NotNull String qName,
@NotNull PsiNonJavaFileReferenceProcessor processor,
@NotNull GlobalSearchScope searchScope);
/**
* Returns the scope in which references to the specified element are searched. This scope includes the result of
* {@link com.intellij.psi.PsiElement#getUseScope()} and also the results returned from the registered
* com.intellij.psi.search.UseScopeEnlarger instances.
*
* @param element the element to return the use scope form.
* @return the search scope instance.
*/
@NotNull
SearchScope getUseScope(@NotNull PsiElement element);
/**
* Passes all files containing the specified word in {@link UsageSearchContext#IN_CODE code}
* context to the specified processor.
*
* @param word the word to search.
* @param scope the scope in which occurrences are searched.
* @param processor the processor which accepts the references.
* @param caseSensitively if words differing in the case only should not be considered equal
*/
boolean processAllFilesWithWord(@NotNull String word,
@NotNull GlobalSearchScope scope,
@NotNull Processor<PsiFile> processor,
final boolean caseSensitively);
/**
* Passes all files containing the specified word in {@link UsageSearchContext#IN_PLAIN_TEXT plain text}
* context to the specified processor.
*
* @param word the word to search.
* @param scope the scope in which occurrences are searched.
* @param processor the processor which accepts the references.
* @param caseSensitively if words differing in the case only should not be considered equal
*/
boolean processAllFilesWithWordInText(@NotNull String word,
@NotNull GlobalSearchScope scope,
@NotNull Processor<PsiFile> processor,
final boolean caseSensitively);
/**
* Passes all files containing the specified word in {@link UsageSearchContext#IN_COMMENTS comments}
* context to the specified processor.
*
* @param word the word to search.
* @param scope the scope in which occurrences are searched.
* @param processor the processor which accepts the references.
*/
boolean processAllFilesWithWordInComments(@NotNull String word, @NotNull GlobalSearchScope scope, @NotNull Processor<PsiFile> processor);
/**
* Passes all files containing the specified word in {@link UsageSearchContext#IN_STRINGS string literal}
* context to the specified processor.
*
* @param word the word to search.
* @param scope the scope in which occurrences are searched.
* @param processor the processor which accepts the references.
*/
boolean processAllFilesWithWordInLiterals(@NotNull String word, @NotNull GlobalSearchScope scope, @NotNull Processor<PsiFile> processor);
boolean processRequests(@NotNull SearchRequestCollector request, @NotNull Processor<PsiReference> processor);
@NotNull
AsyncFuture<Boolean> processRequestsAsync(@NotNull SearchRequestCollector request, @NotNull Processor<PsiReference> processor);
boolean processElementsWithWord(@NotNull TextOccurenceProcessor processor,
@NotNull SearchScope searchScope,
@NotNull String text,
@MagicConstant(flagsFromClass = UsageSearchContext.class) short searchContext,
boolean caseSensitive);
boolean processElementsWithWord(@NotNull TextOccurenceProcessor processor,
@NotNull SearchScope searchScope,
@NotNull String text,
@MagicConstant(flagsFromClass = UsageSearchContext.class) short searchContext,
boolean caseSensitive,
boolean processInjectedPsi);
@NotNull
AsyncFuture<Boolean> processElementsWithWordAsync(
@NotNull TextOccurenceProcessor processor,
@NotNull SearchScope searchScope,
@NotNull String text,
short searchContext,
boolean caseSensitive);
@NotNull
SearchCostResult isCheapEnoughToSearch(@NotNull String name,
@NotNull GlobalSearchScope scope,
@Nullable PsiFile fileToIgnoreOccurrencesIn,
@Nullable ProgressIndicator progress);
enum SearchCostResult {
ZERO_OCCURRENCES, FEW_OCCURRENCES, TOO_MANY_OCCURRENCES
}
}