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?
Please sign in to leave a 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.