获取在 IntelliJ 中打开的项目中所有 PsiFiles/VirtualFiles 的列表

Get a list of all PsiFiles/VirtualFiles in opened project in IntelliJ

我正在 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?

感谢 Peter 的评论,我尝试了以下代码块:

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 它是空的!

意味着它只找到一个类型未知的 VirtualFile。

您可以使用 ProjectFileIndex.SERVICE.getInstance(project).iterateContent 遍历所有 VirtualFile。然后你可以使用 PsiManager#findFile 得到一个 PsiFile.