PSI Files
PSI(程序结构接口)文件是表示文件内容的结构的根,作为特定编程语言中元素的层次结构.
PsiFile类是所有PSI文件的公共基类,而特定语言的文件通常由其表示 子类. 例如,PsiJavaFile类表示Java文件,XmlFile类表示XML文件.
与具有应用范围的VirtualFile
和Document
不同(即使多个项目是打开的,每个文件由相同的VirtualFile
实例表示),PSI也有项目范围(同一个文件由多个PsiFile
实例表示)
如果文件属于同时打开的多个项目).
##如何获取PSI文件?
*来自一个动作:e.getData(LangDataKeys.PSI_FILE)
.
*来自VirtualFile:PsiManager.getInstance(project).findFile()
*来自Document:PsiDocumentManager.getInstance(project).getPsiFile()
*来自文件中的元素:psiElement.getContainingFile()
*要在项目的任何位置查找具有特定名称的文件,请使用FilenameIndex.getFilesByName(项目,名称,范围)
##如何处理PSI文件?
最有趣的修改操作是在单个PSI元素的级别上执行的,而不是作为整体的文件.
要迭代文件中的元素,请使用psiFile.accept(new PsiRecursiveElementWalkingVisitor()...);
PSI文件来自哪里?
由于PSI依赖于语言,因此通过使用“LanguageParserDefinitions.INSTANCE”,通过语言对象创建PSI文件. forLanguage(language).createFile(fileViewProvider)`方法.
与文档类似,当为特定文件访问PSI时,将按需创建PSI文件.
PSI文件持续多长时间?
与文档一样,PSI文件从相应的VirtualFile
实例中被弱引用,如果没有任何人引用,则可以进行垃圾收集.
##如何创建PSI文件?
PsiFileFactory
.getInstance(project).createFileFromText()
方法创建一个内存中的PSI文件
指定的内容.
要将PSI文件保存到磁盘,请使用PsiDirectory
.add()
方法.
##如何在PSI文件发生变化时收到通知?
PsiManager.getInstance(project).addPsiTreeChangeListener()
允许您接收有关项目PSI树的所有更改的通知.
##如何扩展PSI?
可以通过自定义语言插件扩展PSI以支持其他语言. 有关开发自定义语言插件的更多详细信息,请参阅自定义语言支持参考指南.
##使用PSI有哪些规则?
对PSI文件内容所做的任何更改都会反映在文档中,因此处理文档的所有规则(读/写操作,命令,只读状态处理)都有效.