TypeScript to Java using symbol reference on JSReferenceExpression problem

Answered

Having code as:

import { HelloWorldService } from 'Frontend/generated/endpoints';
function MainLayout() {
    HelloWorldService.sayHello("Hello")
}

I want to be able to navigate to HelloWorldService.java from HelloWorldService.

To achieve above I've defined:

<psi.symbolReferenceProvider hostLanguage="TypeScript"
     hostElementClass="com.intellij.lang.javascript.psi.JSReferenceExpression"
     referenceClass="com.vaadin.plugin.symbols.HillaSymbolReference"
     targetClass="com.vaadin.plugin.symbols.HillaSymbol"
     implementationClass="com.vaadin.plugin.symbols.HillaSymbolReferenceProvider"/>

And implemented provider as:

override fun getReferences(host: PsiExternalReferenceHost, hints: PsiSymbolReferenceHints): Collection<PsiSymbolReference> {
     if (host !is JSReferenceExpression) {
         return emptyList()
     }

     return listOf(HillaSymbolReference(host))
}

Which is called and my HillaSymbolReference is created.


Problem is that my HillaSymbolReference::resolveReference is never called. There is already generic reference on HelloWorldService (referencing to import target), but I thought there might be multiple references defined.

My HillaSymbolReference definition:

class HillaSymbolReference(private val element: PsiElement) : PsiSymbolReference {
    override fun resolveReference(): Collection<Symbol> {
       // target resolving logic here
    }
    override fun getElement(): PsiElement {
        return element
    }
    override fun getRangeInElement(): TextRange {
        return element.textRange
    }
}

What I am missing?

0
1 comment

I was apparently missing time break; problem was in getRangeInElement() which, as name states (d'oh) points to RANGE in CURRENT ELEMENT (not range of element in document).

After changing to TextRange.allOf(element.text) everything works.

0

Please sign in to leave a comment.