File View Providers
Edit pageLast modified: 08 April 2024A 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
?
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 contain an extension to the com.intellij.fileType.fileViewProviderFactory
extension point.
Implement FileViewProviderFactory
and return your FileViewProvider
implementation from createFileViewProvider()
method.
Register as follows in plugin.xml:
<extensions defaultExtensionNs="com.intellij">
<fileType.fileViewProviderFactory
filetype="$FILE_TYPE$"
implementationClass="com.example.MyFileViewProviderFactory"/>
</extensions>
Where $FILE_TYPE$
refers to the type of the file being created (for example, "JSF").
Thanks for your feedback!