原文鏈接:
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
接口的類名。