我正在IntelliJ中开发一个插件,我试图在整个项目源代码中查找所有注释。
我目前只能在打开或选定的文件中获取注释,而不是在所有项目文件中。这可以通过以下代码完成:
public void actionPerformed(AnActionEvent e) {
Editor editor = e.getData(PlatformDataKeys.EDITOR);
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
PsiElement element = psiFile.getFirstChild(); WORKS
for(PsiElement el : element.getParent().getChildren()){
for(PsiElement el2 : el.getChildren()){
if(el2 instanceof PsiComment){
这显然只给了我与编辑器中打开文件对应的PsiFile。
我发现我可以找到一个VirtualFiles列表,我可以从中提取PsiElements,但是,使用:
VirtualFile[] vFiles = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY);
也只给我选择的文件而不是所有的项目文件。
我是PsiElements和VirtualFiles的新手,因此可能会误解他们的用法。但是,如果我之前列出的代码很接近,有没有办法可以获得该项目的所有PsiFiles / VirtualFiles?
感谢彼得的评论,我尝试了以下代码块:
ProjectFileIndex.SERVICE.getInstance(e.getProject()).iterateContent(new ContentIterator() {
@Override
public boolean processFile(VirtualFile fileInProject) {
System.out.println(fileInProject.getFileType());
PsiFile psiFile1 = PsiManager.getInstance(e.getProject()).findFile(fileInProject);
if (psiFile1 == null)
System.out.println("IT'S NULL!");
System.out.println(psiFile1.getText());
return true;
}
});
作为输出的哪个给了我: com.intellij.openapi.fileTypes.UnknownFileType@18cf8e97 IT' S NULL!
意味着它只找到一个未知类型的VirtualFile。
答案 0 :(得分:1)
您可以使用ProjectFileIndex.SERVICE.getInstance(project).iterateContent
来迭代所有VirtualFile
。然后,您可以使用PsiManager#findFile
获取PsiFile
。