文件视图提供者

原文链接:
http://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/file_view_providers.html

文件视图提供者(查看FileViewProvider类)是在IntelliJ IDEA 6.0引入的。它的主要目的是为了管理单个文件多个PSI树的访问。

例如,一个JSPX页面有单独的Java代码(PsiJavaFile)的PSI树, 有单独的XML代码(XmlFile)的PSI树和单独的作为JspFile文件的PSI树。

每个PSI树都覆盖文件的整个内容,并且在有不同语言的内容的位置包含特殊的“外部语言元素”。

一个FileViewProvider实例对应单个VirtualFile、单个Document并且可以用来检索多个PsiFile实例。

我怎样得到一个FVP?

  • 虚拟文件:PsiManager.getInstance(project).findViewProvider()
  • PSI文件:psiFile.getViewProvider()

我能用它来做什么?

  • 得到一个文件中所有现有语言的PSI树列表:fileViewProvider.getLanguages()
  • 得到特定语言的PSI树:fileViewProvider.getPsi(language),其中Language参数可以采用在StdLanguages类中定义的语言类型的值。例如,要得到XML的PSI树,使用fileViewProvider.getPsi(StdLanguages.XML)
  • 在文件中指定的偏移处找到特定语言的元素:fileViewProvider.findElementAt(offset,language)

我怎样扩展FVP?

要创建一个拥有多种不同语言的文件类型,你的插件必须包含一个*IntelliJ平台 *核心可用的fileType.fileViewProviderFactory扩展点的扩展。

这个扩展点是使用FileTypeExtensionPointbean类声明的。

访问这个扩展点需要新建一个实现FileViewProviderFactory接口的Java类并在这个类中重写createFileViewProvider方法。

要声明fileType.fileViewProviderFactory扩展点的扩展,在plugin.xml文件中的<extensions>部分使用以下语法:

<extensions>
  <fileType.fileViewProviderFactory filetype="%file_type%" implementationClass="%class_name%" />
</extensions>

其中%file_type%指要创建的文件类型(例如"JFS"),%class_name%指实现FileViewProviderFactory接口的类名。

推荐阅读更多精彩内容