package org.jetbrains.plugins.cucumber.java; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClassOwner; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.cucumber.psi.GherkinFile; import org.jetbrains.plugins.cucumber.psi.GherkinRecursiveElementVisitor; import org.jetbrains.plugins.cucumber.psi.GherkinStep; import org.jetbrains.plugins.cucumber.steps.AbstractCucumberExtension; import org.jetbrains.plugins.cucumber.steps.AbstractStepDefinition; import java.util.*; public abstract class AbstractCucumberJavaExtension extends AbstractCucumberExtension { @Override public boolean isStepLikeFile(@NotNull final PsiElement child, @NotNull final PsiElement parent) { if (child instanceof PsiClassOwner) { return true; } return false; } @Override public boolean isWritableStepLikeFile(@NotNull PsiElement child, @NotNull PsiElement parent) { if (child instanceof PsiClassOwner) { final PsiFile file = child.getContainingFile(); if (file != null) { final VirtualFile vFile = file.getVirtualFile(); if (vFile != null) { final VirtualFile rootForFile = ProjectRootManager.getInstance(child.getProject()).getFileIndex().getSourceRootForFile(vFile); return rootForFile != null; } } } return false; } @NotNull @Override public Collection<String> getGlues(@NotNull GherkinFile file, Set<String> gluesFromOtherFiles) { if (gluesFromOtherFiles == null) { gluesFromOtherFiles = ContainerUtil.newHashSet(); } final Set<String> glues = gluesFromOtherFiles; file.accept(new GherkinRecursiveElementVisitor() { @Override public void visitStep(GherkinStep step) { final String glue = CucumberJavaUtil.getPackageOfStep(step); if (glue != null) { CucumberJavaUtil.addGlue(glue, glues); } } }); return glues; } @Override public Collection<? extends PsiFile> getStepDefinitionContainers(@NotNull GherkinFile featureFile) { final Module module = ModuleUtilCore.findModuleForPsiElement(featureFile); if (module == null) { return Collections.emptySet(); } List<AbstractStepDefinition> stepDefs = loadStepsFor(featureFile, module); Set<PsiFile> result = new HashSet<>(); for (AbstractStepDefinition stepDef : stepDefs) { PsiElement stepDefElement = stepDef.getElement(); if (stepDefElement != null) { final PsiFile psiFile = stepDefElement.getContainingFile(); if (isWritableStepLikeFile(psiFile, psiFile.getParent())) { result.add(psiFile); } } } return result; } }