package com.siberika.idea.pascal.lang.references;
import com.intellij.openapi.application.QueryExecutorBase;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.RequestResultProcessor;
import com.intellij.psi.search.UsageSearchContext;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.util.Processor;
import com.siberika.idea.pascal.lang.psi.PasTypes;
import com.siberika.idea.pascal.util.StrUtil;
import org.jetbrains.annotations.NotNull;
/**
* Author: George Bakhtadze
* Date: 06/02/2015
*/
public class PascalReferencesSearcher extends QueryExecutorBase<PascalCommentReference, ReferencesSearch.SearchParameters> {
public PascalReferencesSearcher() {
super(true);
}
@Override
public void processQuery(@NotNull ReferencesSearch.SearchParameters p, @NotNull final Processor<PascalCommentReference> consumer) {
final PsiElement element = p.getElementToSearch();
if (element instanceof PsiComment) {
Pair<String, String> directive = StrUtil.getDirectivePair(element.getText());
if (directive != null) {
p.getOptimizer().searchWord(directive.getSecond(), p.getEffectiveSearchScope(), UsageSearchContext.IN_COMMENTS, false, element,
new RequestResultProcessor() {
@Override
public boolean processTextOccurrence(@NotNull PsiElement el, int offsetInElement, @NotNull Processor<PsiReference> c) {
if (el.getNode().getElementType() == PasTypes.CT_DEFINE) {
PsiReference ref = el.getReference();
ref = ref != null ? ref : new PascalCommentReference(el);
return c.process(ref);
}
return true;
}
});
}
}
}
}