基於Intellij 插件開發指南

1. VFS 相關(VirtualFileSystem)

1.1 VFS做用:

  • 提供一個處理文件的通用API,而不關心文件的具體位置(不管文件位於磁盤上、歸檔文件中仍是HTTP服務器上)
  • 追蹤文件變化,而且在檢測到文件內容發生更改時能提供新舊兩個版本的文件
  • 創建文件在VFS和持久化存儲之間的關聯

1.2. VFS中獲取VirtualFile

  • 從本地IO文件中獲取
File ioFile = new File("./io.java")
VritualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(ioFile)
virtualFile.refresh(false, true)
複製代碼
  • 利用FileChooser獲取
FileChooserDescriptor singleFileDescriptor = FileChooserDescriptorFactory.createSingleFileDescriptor();
VirtualFile virtualFile = FileChooser.chooseFile(singleFileDescriptor, project, null);
複製代碼
  • 經過URL獲取
VirtualFileManager.getInstance().findFileByUrl("xxx");
VirtualFileManager.getInstance().refreshAndFindFileByUrl("xxx");
複製代碼

1.3對VirtualFile進行讀寫操做

和Android同樣,Intellij Platform不容許直接在主線程進行實時的文件寫入,須要經過一個異步任務進行。java

WriteCommandAction.runWriteCommandAction(project, new Runnable() {
     @Override
    public void run() {
    //   virtualFile.getInputStream() / virtualFile.getOutputStream()         
    }
 });
複製代碼

1.4 在異步任務結束後,切回UI線程進行UI更新

ApplicationManager.getApplication().invokeLater(new Runnable(){ 
 ...
})

複製代碼

2. PSI相關(Program Structure Interface)

2.1 PSI介紹

PSI(Program Structure Interface)是Intellij Platform中一個很是重要的概念,在IDE所管理的Project中,每一個目錄,Package,源代碼和資源文件都會被抽象成相應的PSI對象。git

2.2 經常使用子類

PsiDirectory、PsiJavaFile和XmlFilegithub

2.3 建立目錄和文件

//建立目錄
PsiDirectory baseDir = PsiDirectoryFactory.getInstance(project).createDirectory(project.getBaseDir());
//建立Java文件
PsiJavaFile psiFile = (PsiJavaFile) PsiFileFactory.getInstance(project).createFileFromText("", StdFileTypes.JAVA, "");
//建立Xml文件
XmlFile psiFile = (XmlFile) PsiFileFactory.getInstance(project).createFileFromText("", StdFileTypes.XML, "");
複製代碼

2.4 讀寫文件

和寫入VirtualFile同樣,讀寫操做都須要在WriteCommandAction異步線程中進行。bash

2.5 Xml文件寫入屬性

XmlDocument document = xmlFile.getDocument();
if (document != null && document.getRootTag() != null) {
XmlTag rootTag = document.getRootTag();
rootTag.getAttribute(attrName).setValue(attrValue);//set value for exists attr.      
rootTag.setAttribute(name,value);//add a new attr and setting value
}
複製代碼

2.6 搜索文件

//  方法一:(全類名)
JavaPsiFacade.getInstance(mFile.getProject()).findClass(qualifiedName,GlobalSearchScope.alScope(mFile.getProject()));
//  方法二: (全類名)
FilenameIndex.getFilesByName()
//  方法三: (短類名)
PsiShortNamesCache.getInstance().getClassesByName()
複製代碼

2.7 建立Class文件類

PsiClass clazz = JavaDirectoryService.getInstance().createClass(subDir, className)
複製代碼

2.8 修改Class內容

// 建立Class元素生成器
 PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(mFile.getProject());
 // 利用生成器建立對應的元素(每種元素都對應兩種生成方式)
 elementFactory.createField() / elementFactory.createFieldFromText()
 elementFactory.createMethod() / elementFactory.createMethodFromText()  
 elementFactory.createClass() / elementFactory.createClassFromText()
      ... 
 //將元素添加到class中
 clazz.add(field)

複製代碼

2.9 修改class的繼承關係

respClass.getExtendsList().add(getReferenceClass(elementFactory, BaseModelStr));
複製代碼

3.0 修改元素(class field method)的修飾關鍵字(public static ... )

// 添加
respClass.getModifierList().add(elementFactory.createKeyword("public"));
// 刪除
reqClass.getModifierList().getFirstChild().delete();
複製代碼

3. PSI 與 VFS的聯繫

// VirtualFile 轉 PsiFile
PsiManager.getInstance(project).findFile(virtualFile);

// PsiFile 轉 VirtualFile
VirtualFile virtualFile = psiFile.getVirtualFile();
複製代碼

4 其餘經常使用方法

// 格式化代碼
CodeStyleManager.getInstance(project).reformat(psiClass);
// 用編輯器打開指定文件
FileEditorManager.getInstance(project).openTextEditor(new OpenFileDescriptor(project, virtualFile), true);

複製代碼

5. 代碼實例

github倉庫地址服務器

相關文章
相關標籤/搜索