Creating reference contributors for Gherkin language elements

Answered

Hi!

I'm trying to create Gherkin reference contributors for project specific things, however I'm having trouble with them.

1)

I noticed that registered PsiReferenceProviders seem to work only for GherkinSteps, when registered e.g. as 

registrar.registerReferenceProvider(PlatformPatterns.psiElement(GherkinStep.class), new PsiReferenceProvider() {...});

However when I try to catch elements other than steps, e.g. GherkinScenarios or GherkinTags:

registrar.registerReferenceProvider(PlatformPatterns.psiElement(GherkinTag.class), new PsiReferenceProvider() {...});

nothing happens.

I debug my code as well, matching PsiElement.class as the pattern, but it was still only GherkinSteps PsiReferenceProvider#getReferencesByElement was executed for.

I haven't managed to find out if this works this way intentionally or not, but based on the current behaviour I don't seem to be able to add any reference to GherkinTags.

 

2)

A different problem is that I would like to extend the set of references for a GherkinStep that is coming from the Gherkin plugin (org.jetbrains.plugins.cucumber.steps.reference.CucumberStepReference), with my own custom reference.

So, the Gherkin plugin adds this reference to steps to navigate to the step definition methods on Java side. However, I would like to add a reference to only certain steps, and only to a certain of those steps, specifically a path parameter, so that users could navigate to different files based on that path value.

After I add my contributor and reference, it seems that the only reference that is available is the one from the Gherkin plugin but not mine.

Is there a way to add my reference contributor while also keeping any other registered elsewhere?

 

Any help would be appreciated.

0
2 comments

Hi Tamás,

1) To retrieve references from contributors PsiElement should return

ReferenceProvidersRegistry.getReferencesFromProviders(this);

 in method #getReferences. I've updated class GherkinTagImpl and pushed the change. 

2) Looks like this behaviour defined by com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference#COMPARATOR. If there are several references it'll take the one with shortest range.

0

Thank you Andrey,

I will look into them.

0

Please sign in to leave a comment.