package org.jetbrains.plugins.cucumber.groovy.steps.search;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.pom.PomDeclarationSearcher;
import com.intellij.pom.PomTarget;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
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;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
/**
* @author Max Medvedev
*/
public class GrCucumberStepDeclarationSearcher extends PomDeclarationSearcher {
@Override
public void findDeclarationsAt(@NotNull PsiElement element, int offsetInElement, Consumer<PomTarget> consumer) {
PsiLanguageInjectionHost host = InjectedLanguageManager.getInstance(element.getProject()).getInjectionHost(element);
if (host != null) {
element = host;
}
if (element.getParent() instanceof GrLiteral) {
element = element.getParent();
}
if (element instanceof GrLiteral) {
final PsiElement parent = element.getParent(); //~literal
if (parent != null) {
final PsiElement pparent = parent.getParent(); //(~literal)
if (pparent != null) {
final PsiElement ppparent = pparent.getParent(); //When(~literal)
if (ppparent instanceof GrMethodCall && GrCucumberUtil.isStepDefinition(ppparent)) {
final GrMethodCall methodCall = (GrMethodCall)ppparent;
consumer.consume(GrStepDefinition.getStepDefinition(methodCall));
}
}
}
}
}
}