2023-04-25 16:10:47 +02:00

3.0 KiB

PSI Cookbook

This page gives recipes for the most common operations for working with the PSI (Program Structure Interface).

Unlike Developing Custom Language Plugins, it is about working with the PSI of existing languages (such as Java).

See also the section.

General

How do I find a file if I know its name but don't know the path?

FilenameIndex.getFilesByName()

How do I find where a particular PSI element is used?

ReferencesSearch.search()

How do I rename a PSI element?

RefactoringFactory.createRename()

How can I cause the PSI for a virtual file to be rebuilt?

FileContentUtil.reparseFiles()

Java Specific

If your plugin depends on Java functionality and targets 2019.2 or later, please make sure to follow the steps from this blog post. Also consider using UAST if your plugin supports other JVM languages.

{style="note"}

How do I find all inheritors of a class?

ClassInheritorsSearch.search()

How do I find a class by qualified name?

JavaPsiFacade.findClass()

How do I find a class by short name?

PsiShortNamesCache.getClassesByName()

How do I find a superclass of a Java class?

PsiClass.getSuperClass()

How do I get a reference to the containing package of a Java class?

  PsiJavaFile javaFile = (PsiJavaFile)psiClass.getContainingFile();
  PsiPackage psiPackage = JavaPsiFacade.getInstance(project)
        .findPackage(javaFile.getPackageName());

or

PsiUtil.getPackageName()

How do I find the methods overriding a specific method?

OverridingMethodsSearch.search()

How do I check the presence of a JVM library?

2023.2

Use dedicated (and heavily cached) methods from JavaLibraryUtil:

  • hasLibraryClass() to check presence via known library class FQN
  • hasLibraryJar() using Maven coordinates (for example, io.micronaut:micronaut-core).