package com.thoughtworks.gauge.language.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PsiTreeUtil;
import com.thoughtworks.gauge.StepValue;
import com.thoughtworks.gauge.helper.ModuleHelper;
import com.thoughtworks.gauge.language.psi.*;
import com.thoughtworks.gauge.reference.StepReference;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class SpecStepImpl extends SpecNamedElementImpl implements SpecStep {
private boolean isConcept = false;
private ModuleHelper helper;
public SpecStepImpl(@NotNull ASTNode node) {
super(node);
helper = new ModuleHelper();
}
public SpecStepImpl(@NotNull ASTNode node, ModuleHelper helper) {
super(node);
this.helper = helper;
}
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SpecVisitor) ((SpecVisitor) visitor).visitStep(this);
else super.accept(visitor);
}
public void setConcept(boolean isConcept) {
this.isConcept = isConcept;
}
@Override
public StepValue getStepValue() {
return SpecPsiImplUtil.getStepValue(this);
}
public String getName() {
return SpecPsiImplUtil.getStepValue(this).getStepText();
}
@Nullable
@Override
public PsiElement getNameIdentifier() {
return this;
}
@Override
public PsiElement setName(@NonNls @NotNull String s) {
return null;
}
@Override
public ItemPresentation getPresentation() {
return SpecPsiImplUtil.getPresentation(this);
}
@Override
@Nullable
public SpecTable getInlineTable() {
return isConcept ? getSpecTableFromConceptStep() : findChildByClass(SpecTable.class);
}
private SpecTableImpl getSpecTableFromConceptStep() {
ConceptTable conceptTable = findChildByClass(ConceptTable.class);
return conceptTable == null ? null : new SpecTableImpl(conceptTable.getNode());
}
@Override
@NotNull
public List<SpecArg> getArgList() {
return PsiTreeUtil.getChildrenOfTypeAsList(this, SpecArg.class);
}
@Override
public List<SpecStaticArg> getStaticArgList() {
List<SpecArg> argList = getArgList();
List<SpecStaticArg> specStaticArgs = new ArrayList<SpecStaticArg>();
for (SpecArg arg : argList) {
SpecStaticArg staticArg = PsiTreeUtil.getChildOfType(arg, SpecStaticArg.class);
if (staticArg != null) {
specStaticArgs.add(staticArg);
}
}
return specStaticArgs;
}
@Override
public PsiReference getReference() {
return helper.isGaugeModule(this) ? new StepReference(this) : null;
}
}