Appearance
A file view provider (FileViewProvider) manages access to multiple PSI trees within a single file.
For example, a JSPX page has a separate PSI tree for the Java code in it (PsiJavaFile), a separate tree for the XML code (XmlFile), and a separate tree for JSP as a whole (JspFile).
Each of the PSI trees covers the entire contents of the file and contains special "outer language elements" in the places where contents in a different language can be found.
A FileViewProvider instance corresponds to a single VirtualFile, a single Document, and can retrieve multiple PsiFile instances.
How do I get a FileViewProvider?
- From a
VirtualFile:PsiManager.getInstance(project).findViewProvider() - From a
PsiFile:psiFile.getViewProvider()
What can I do with a FileViewProvider?
- To get the set of all languages for which PSI trees exist in a file:
fileViewProvider.getLanguages() - To get the PSI tree for a particular language:
fileViewProvider.getPsi(language). For example, to get the PSI tree for XML, usefileViewProvider.getPsi(XMLLanguage.INSTANCE). - To find an element of a particular language at the specified offset in the file:
fileViewProvider.findElementAt(offset, language)
How do I extend the FileViewProvider?
To create a file type that has multiple interspersing trees for different languages, a plugin must implement FileViewProviderFactory and return your FileViewProvider implementation from createFileViewProvider() method.
Register the factory by annotating the implementation class with @ExtensionImpl:
java
@ExtensionImpl
public class MyFileViewProviderFactory implements FileViewProviderFactory {
@Override
public FileViewProvider createFileViewProvider(VirtualFile file, Language language, PsiManager manager, boolean eventSystemEnabled) {
return new MyFileViewProvider(manager, file, eventSystemEnabled);
}
}