package org.jetbrains.plugins.cucumber.groovy.steps.search;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.pom.PomTarget;
import com.intellij.pom.PomTargetPsiElement;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.cucumber.CucumberUtil;
import org.jetbrains.plugins.cucumber.groovy.GrCucumberUtil;
import org.jetbrains.plugins.cucumber.groovy.steps.GrStepDefinition;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall;
/**
* @author Max Medvedev
*/
public class GrCucumberStepDefinitionSearcher implements QueryExecutor<PsiReference, ReferencesSearch.SearchParameters> {
@Override
public boolean execute(@NotNull final ReferencesSearch.SearchParameters queryParameters,
@NotNull final Processor<PsiReference> consumer) {
return ApplicationManager.getApplication().runReadAction((NullableComputable<Boolean>)() -> {
PsiElement element = getStepDefinition(queryParameters.getElementToSearch());
if (element == null) return true;
String regexp = GrCucumberUtil.getStepDefinitionPatternText((GrMethodCall)element);
if (regexp == null) return true;
return CucumberUtil.findGherkinReferencesToElement(element, regexp, consumer, queryParameters.getEffectiveSearchScope());
});
}
public static PsiElement getStepDefinition(final PsiElement element) {
if (GrCucumberUtil.isStepDefinition(element)) {
return element;
}
if (element instanceof PomTargetPsiElement) {
final PomTarget target = ((PomTargetPsiElement)element).getTarget();
if (target instanceof GrStepDefinition) {
return ((GrStepDefinition)target).getElement();
}
}
return null;
}
}