package cucumber.runtime.autocomplete; import cucumber.runtime.StepDefinition; import cucumber.runtime.model.CucumberFeature; import cucumber.runtime.model.CucumberTagStatement; import gherkin.formatter.Argument; import gherkin.formatter.model.Step; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Generates metadata to be used for Code Completion: https://github.com/cucumber/gherkin/wiki/Code-Completion */ public class StepdefGenerator { private static final Comparator<StepDefinition> STEP_DEFINITION_COMPARATOR = new Comparator<StepDefinition>() { @Override public int compare(StepDefinition a, StepDefinition b) { return a.getPattern().compareTo(b.getPattern()); } }; private static final Comparator<CucumberTagStatement> CUCUMBER_TAG_STATEMENT_COMPARATOR = new Comparator<CucumberTagStatement>() { @Override public int compare(CucumberTagStatement a, CucumberTagStatement b) { return a.getVisualName().compareTo(b.getVisualName()); } }; public List<MetaStepdef> generate(Collection<StepDefinition> stepDefinitions, List<CucumberFeature> features) { List<MetaStepdef> result = new ArrayList<MetaStepdef>(); List<StepDefinition> sortedStepdefs = new ArrayList<StepDefinition>(); sortedStepdefs.addAll(stepDefinitions); Collections.sort(sortedStepdefs, STEP_DEFINITION_COMPARATOR); for (StepDefinition stepDefinition : sortedStepdefs) { MetaStepdef metaStepdef = new MetaStepdef(); metaStepdef.source = stepDefinition.getPattern(); metaStepdef.flags = ""; // TODO = get the flags too for (CucumberFeature feature : features) { List<CucumberTagStatement> cucumberTagStatements = feature.getFeatureElements(); for (CucumberTagStatement tagStatement : cucumberTagStatements) { List<Step> steps = tagStatement.getSteps(); for (Step step : steps) { List<Argument> arguments = stepDefinition.matchedArguments(step); if (arguments != null) { MetaStepdef.MetaStep ms = new MetaStepdef.MetaStep(); ms.name = step.getName(); for (Argument argument : arguments) { MetaStepdef.MetaArgument ma = new MetaStepdef.MetaArgument(); ma.offset = argument.getOffset(); ma.val = argument.getVal(); ms.args.add(ma); } metaStepdef.steps.add(ms); } } } Collections.sort(cucumberTagStatements, CUCUMBER_TAG_STATEMENT_COMPARATOR); } result.add(metaStepdef); } return result; } }