原文鏈接:
http://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/psi_files.html
PSI(程序結(jié)構(gòu)接口)文件是將文件內(nèi)容抽象為特定編程語言元素的層次結(jié)構(gòu)的文件。
PsiFile類是所有PSI文件的基類宵凌,特定語言的PSI文件是其子類宫盔。例如,PsiJavaFile類代表Java文件近速,XmlFile類代表XML文件。
不像VirtualFile
和Document
的作用域?yàn)閼?yīng)用 (即使多個項(xiàng)目被打開,每個文件只被相同的VirtualFile
所代表)吗坚,PSI的作用域?yàn)轫?xiàng)目(如果一個文件屬于多個同時打開項(xiàng)目菇晃,這個文件被多個PsiFile
實(shí)例所代表)册倒。
我怎樣得到一個PSI文件?
- 操作:
e.getData(LangDataKeys.PSI_FILE)
磺送; - 虛擬文件:
PsiManager.getInstance(project).findFile()
驻子; - 文檔:
PsiDocumentManager.getInstance(project).getPsiFile()
; - 文件內(nèi)的元素:
psiElement.getContainingFile()
估灿; - 在項(xiàng)目的任何地方查找指定名字的文件崇呵,使用
FilenameIndex.getFilesByName(project, name, scope)
。
我能用它來做什么馅袁?
大多數(shù)修改操作都在單獨(dú)的PSI元素上進(jìn)行域慷,而不是整個文件。
要遍歷文件中的元素汗销,使用psiFile.accept(new PsiRecursiveElementWalkingVisitor()...)
犹褒。
它從何而來?
由于PSI是依賴于語言的弛针,PSI文件是通過Language對象使用LanguageParserDefinitions.INSTANCE.forLanguage(language).createFile(fileViewProvider)
方法創(chuàng)建的叠骑。
像文檔一樣,PSI文件也是被訪問時按需創(chuàng)建的削茁。
PSI文件可以持久化多長時間宙枷?
像文檔一樣,PSI文件也是相應(yīng)的VirtualFile
實(shí)例的弱引用茧跋,如果沒有任何引用就會被垃圾回收機(jī)制回收慰丛。
我怎樣創(chuàng)建一個PSI文件?
PsiFileFactory
.getInstance(project).createFileFromText()
方法創(chuàng)建一個相應(yīng)內(nèi)容的內(nèi)存PSI文件瘾杭。
要保存PSI文件到磁盤诅病,使用PsiDirectory
.add()
方法。
PSI文件改變時我怎樣得到通知?
PsiManager.getInstance(project).addPsiTreeChangeListener()
允許你接受項(xiàng)目中PSI樹所有更改的通知睬隶。
我怎樣擴(kuò)展PSI锣夹?
PSI可以通過自定義語言插件擴(kuò)展支持其它語言 。更多關(guān)于開發(fā)自定義語言插件詳情苏潜,參閱自定義語言支持银萍。
使用PSI有什么規(guī)則?
所有對PSI文件內(nèi)容的更改都會反映到文檔上,所以使用文檔時所有規(guī)則(讀寫操作恤左、命令贴唇、只讀處理) 都是有效的。