package org.jetbrains.plugins.cucumber.java.steps;
import com.intellij.psi.*;
import org.apache.oro.text.regex.Pattern;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.cucumber.java.CucumberJavaUtil;
import org.jetbrains.plugins.cucumber.steps.AbstractStepDefinition;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
public class JavaStepDefinition extends AbstractStepDefinition {
public JavaStepDefinition(PsiElement stepDef) {
super(stepDef);
}
@Override
public List<String> getVariableNames() {
PsiElement element = getElement();
if (element instanceof PsiMethod) {
PsiParameter[] parameters = ((PsiMethod)element).getParameterList().getParameters();
ArrayList<String> result = new ArrayList<>();
for (PsiParameter parameter : parameters) {
result.add(parameter.getName());
}
return result;
}
return Collections.emptyList();
}
@Nullable
@Override
protected String getCucumberRegexFromElement(PsiElement element) {
if (element instanceof PsiMethod) {
final PsiAnnotation stepAnnotation = CucumberJavaUtil.getCucumberStepAnnotation((PsiMethod)element);
if (stepAnnotation == null) {
return null;
}
final PsiElement annotationValue = CucumberJavaUtil.getAnnotationValue(stepAnnotation);
if (annotationValue != null) {
final PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(element.getProject()).getConstantEvaluationHelper();
final Object constantValue = evaluationHelper.computeConstantExpression(annotationValue, false);
if (constantValue != null) {
String patternText = constantValue.toString();
if (patternText.length() > 1) {
return patternText.replace("\\\\", "\\").replace("\\\"", "\"");
}
}
}
} else if (element instanceof PsiMethodCallExpression) {
PsiExpressionList argumentList = ((PsiMethodCallExpression)element).getArgumentList();
if (argumentList.getExpressions().length > 1) {
PsiExpression stepExpression = argumentList.getExpressions()[0];
if (stepExpression instanceof PsiLiteralExpression) {
Object value = ((PsiLiteralExpression)stepExpression).getValue();
if (value instanceof String) {
return (String)value;
}
}
}
}
return null;
}
@Override
public boolean matches(String stepName) {
Pattern perlPattern = getPattern();
if (perlPattern != null) {
final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(perlPattern.getPattern());
Matcher m = pattern.matcher(stepName);
return m.matches();
}
return false;
}
}