package org.jetbrains.plugins.cucumber.java; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.openapi.module.Module; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.cucumber.BDDFrameworkType; import org.jetbrains.plugins.cucumber.StepDefinitionCreator; import org.jetbrains.plugins.cucumber.java.steps.Java8StepDefinitionCreator; import org.jetbrains.plugins.cucumber.java.steps.JavaStepDefinition; import org.jetbrains.plugins.cucumber.steps.AbstractStepDefinition; import java.util.ArrayList; import java.util.List; public class CucumberJava8Extension extends AbstractCucumberJavaExtension { @NotNull @Override public BDDFrameworkType getStepFileType() { return new BDDFrameworkType(JavaFileType.INSTANCE, "Java 8"); } @NotNull @Override public StepDefinitionCreator getStepDefinitionCreator() { return new Java8StepDefinitionCreator(); } @Override public List<AbstractStepDefinition> loadStepsFor(@Nullable PsiFile featureFile, @NotNull Module module) { final List<AbstractStepDefinition> result = new ArrayList<>(); final GlobalSearchScope dependenciesScope = module.getModuleWithDependenciesAndLibrariesScope(true); final GlobalSearchScope javaFiles = GlobalSearchScope.getScopeRestrictedByFileTypes(dependenciesScope, JavaFileType.INSTANCE); String[] keywords = new String[] {"Given", "And", "Then", "But", "When"}; for (String method : keywords) { PsiSearchHelper.SERVICE.getInstance(module.getProject()).processElementsWithWord((element, offsetInElement) -> { final PsiElement parent = element.getParent(); if (parent != null) { final PsiReference[] references = parent.getReferences(); for (PsiReference ref : references) { PsiElement resolved = ref.resolve(); PsiClass psiClass = PsiTreeUtil.getParentOfType(resolved, PsiClass.class); if (psiClass != null) { final String fqn = psiClass.getQualifiedName(); if (fqn != null && fqn.startsWith("cucumber.api.java8")) { final PsiMethodCallExpression methodCallExpression = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); result.add(new JavaStepDefinition(methodCallExpression)); } } } } return true; }, javaFiles, method, UsageSearchContext.IN_CODE, true); } return result; } }