Intellij custom language plugin reference from Java code

Answered

I need to create a `Reference` (https://plugins.jetbrains.com/docs/intellij/references-and-resolve.html) to my custom language elements from Java code. This is needed for rename refactoring support and other things. Basically I want to create a functionality similar to what Android Studio does when renaming resources in xml files also renames the corresponding fields in `R.string` class.

I've been able to successfully register references from string literals via `PsiReferenceContributor` and `PsiReferenceProvider` following this https://plugins.jetbrains.com/docs/intellij/reference-contributor.html#define-a-reference-contributor example. But when I try to apply a similar pattern for `PsiIdentifier::class.java` or other psi types, the reference provider method `getReferencesByElement` doesn't get triggered, see code

override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
registrar.registerReferenceProvider(
psiElement(PsiIdentifier::class.java), // PsiIdentifier instead of PsiLiteralExpression
object : PsiReferenceProvider() {
override fun getReferencesByElement(
element: PsiElement,
context: ProcessingContext
): Array<PsiReference> {
// not triggered ever
}
}
)
}

Then I stumbled upon `PsiScopeProcessor` class, which is a little more difficult to use. But I wonder if it is what should be used in my case and if there are other options. If I really do have to use `PsiScopeProcessor`, then are there any simple enough plugins doing similar thing that I should take a look at as an example?

0
3 comments

PsiIdentifier doesn't allow injecting references. If you want to handle rename events, you can install com.intellij.refactoring.listeners.RefactoringElementListener provided by com.intellij.refactoring.listeners.RefactoringElementListenerProvider

0

Yann Cebron I see, thanks. But how can I manually trigger renaming of Java fields?

0

com.intellij.refactoring.RefactoringFactory#createRename()

0

Please sign in to leave a comment.