package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.QueryExecutorBase; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; /** * @author Gregory.Shrago * This searcher does the job for various console and fragment editors and other non-physical files. * We need this because ScopeEnlarger functionality will not work for nonphysical files. */ public class NonPhysicalReferenceSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> { public NonPhysicalReferenceSearcher() { super(true); } public void processQuery(@NotNull ReferencesSearch.SearchParameters queryParameters, @NotNull Processor<PsiReference> consumer) { if (ApplicationManager.getApplication().isUnitTestMode()) return; final SearchScope scope = queryParameters.getScope(); final PsiElement element = queryParameters.getElementToSearch(); final PsiFile containingFile = element.getContainingFile(); final boolean isPhysical = containingFile == null || containingFile.getViewProvider().isPhysical(); if (isPhysical && !(scope instanceof GlobalSearchScope)) return; final LocalSearchScope currentScope; if (scope instanceof LocalSearchScope) { if (queryParameters.isIgnoreAccessScope()) return; currentScope = (LocalSearchScope)scope; } else { currentScope = null; } Project project = element.getProject(); if (!project.isInitialized()) return; // skip default and other projects that look funny PsiManager psiManager = PsiManager.getInstance(project); for (VirtualFile virtualFile : FileEditorManager.getInstance(project).getOpenFiles()) { if (virtualFile.getFileType().isBinary()) continue; PsiFile file = psiManager.findFile(virtualFile); if (file != null && !file.getViewProvider().isPhysical() && !(file instanceof PsiCodeFragment)) { final LocalSearchScope newScope = new LocalSearchScope(file); final LocalSearchScope searchScope = currentScope == null ? newScope : newScope.intersectWith(currentScope); ReferencesSearch.searchOptimized(element, searchScope, true, queryParameters.getOptimizer(), consumer); } } } }