File View Providers
- IntelliJ IDEA * 6.0中引入了File View Providers(请参阅FileViewProvider). 其主要目的是管理单个文件中对多个PSI树的访问.
例如,一个JSPX页面有一个单独的PSI树,用于其中的Java代码(PsiJavaFile
),一个单独的XML代码树(XmlFile
),以及一个单独的JSP for JSP JspFile
:///java/jsp-openapi/src/com/intellij/psi/jsp/JspFile.java)).
每个PSI树都覆盖了文件的全部内容,并且在可以找到不同语言的内容的地方包含特殊的“外部语言元素”.
一个FileViewProvider
实例对应一个VirtualFile
,一个Document
,可以用来
检索多个PsiFile
实例.
如何获得FVP?
- 来自VirtualFile:
PsiManager.getInstance(project).findViewProvider()
- 来自PSI文件:
psiFile.getViewProvider()
FVP怎么办?
-
要获取文件中存在PSI树的所有语言的集合:
fileViewProvider.getLanguages()
-
获取特定语言的PSI树:
fileViewProvider.getPsi(language)
,其中language
参数可以取[Language]的值(upsource:///platform/core-api/src/com/ intellij/lang/Language.java)在StdLanguages类中定义的类型. 例如,要获取XML的PSI树,请使用fileViewProvider.getPsi(StdLanguages.XML)
. -
要在文件中指定的偏移量处查找特定语言的元素:
fileViewProvider.findElementAt(offset,language)
如何扩展FileViewProvider?
要创建具有针对不同语言的多个散布树的文件类型,您的插件必须包含 IntelliJ Platform 核心中可用的fileType.fileViewProviderFactory
扩展点的扩展.
此扩展点使用[FileTypeExtensionPoint]声明(upsource:///platform/core-api/src/com/intellij/openapi/fileTypes/FileTypeExtensionPoint.java)
豆类.
要访问此扩展点,请创建一个实现FileViewProviderFactory接口的Java类,并在此类中覆盖
createFileViewProvider
方法.
要声明fileType.fileViewProviderFactory
扩展点的扩展,请将以下语法添加到plugin.xml
文件的<extensions>
部分:
<extensions>
<fileType.fileViewProviderFactory filetype="%file_type%" implementationClass="%class_name%" />
</extensions>
其中%file_type%
指的是正在创建的文件的类型(例如,“JFS”),而%class_name%
指的是实现[FileViewProviderFactory
]的Java类的名称(upsource:///platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java)界面.