How to programmatically determine new and modified files via plugin?



  1. I need to get the set of new and modified source files in a project. I looked into IdeDocumentHistory and ChangeList* as well as many other classes. I don't get the files I expect from the methods I found. It also appears that one needs to have a version control system in place to be able to identify the source files.
  2. I would like to be able to determine new and modified files in a project without requiring VCS. I expect there must be a way, since the compiler is incremental. I also expect that it is likely to be an aggregation of various file reporting mechanisms.  Another reason I believe this must be possible is because Undo exists for each file, so modifications must be tracked.
  3. I would also like to be able to identify generated source files.

Any suggestions on how I go about getting the results I need? 

Below is the code I have created which provides source files. I am concerned that in some situations, it will produce too many results.
I am starting with a CompileContext object.



    private static Set<VirtualFile> getFilesToProcess(final CompileContext compileContext)
        final CompileScope compileScope = compileContext.getCompileScope();
        final Set<VirtualFile> newFiles =
            new HashSet<>(Arrays.asList(compileScope.getFiles(null, true)));


        return Collections.unmodifiableSet(newFiles);

    private static List<VirtualFile> getFilesToShow(@NotNull final Project project)
        final List<VirtualFile> filesData = new ArrayList<>();
        final Runnable filesToShowRunnable = () -> {
            final FileEditorManagerImpl editorManager =
            final ArrayList<VirtualFile> editors = new ArrayList<>();
            final Set<VirtualFile> addedFiles = new LinkedHashSet<>();
            for (final Pair<VirtualFile, EditorWindow> pair :

            for (final VirtualFile editor : editors)

            if (filesData.size() <= 1
                && editors.size() == 1
                && (filesData.isEmpty() || !editors.get(0).equals(filesData.get(0)))
                && addedFiles.add(editors.get(0)))
                filesData.add(0, editors.get(0));

        if (EDT.isCurrentThreadEdt())

        return filesData;


Please sign in to leave a comment.