package org.jetbrains.plugins.cucumber.steps.reference;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.TokenType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.cucumber.psi.GherkinElementTypes;
import org.jetbrains.plugins.cucumber.psi.GherkinTokenTypes;
import org.jetbrains.plugins.cucumber.psi.impl.GherkinStepImpl;
public class CucumberStepReferenceProvider extends PsiReferenceProvider {
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
if (element instanceof GherkinStepImpl) {
TokenSet textAndParamSet = TokenSet.create(GherkinTokenTypes.TEXT, GherkinTokenTypes.STEP_PARAMETER_TEXT,
GherkinTokenTypes.STEP_PARAMETER_BRACE, GherkinElementTypes.STEP_PARAMETER);
ASTNode textNode = element.getNode().findChildByType(textAndParamSet);
textAndParamSet = TokenSet.orSet(textAndParamSet, TokenSet.create(TokenType.WHITE_SPACE));
if (textNode != null) {
int start = textNode.getTextRange().getStartOffset();
int end = textNode.getTextRange().getEndOffset();
int endBeforeSpace = end;
textNode = textNode.getTreeNext();
while (textNode != null && textAndParamSet.contains(textNode.getElementType())) {
if (textNode.getElementType() == TokenType.WHITE_SPACE) {
endBeforeSpace = end;
} else {
endBeforeSpace = textNode.getTextRange().getEndOffset();
}
end = textNode.getTextRange().getEndOffset();
textNode = textNode.getTreeNext();
}
TextRange tr = new TextRange(start, endBeforeSpace);
CucumberStepReference reference = new CucumberStepReference(element, tr.shiftRight(-element.getTextOffset()));
return new PsiReference[] {reference};
}
}
return PsiReference.EMPTY_ARRAY;
}
}