private List<JCCompilationUnit> runLastRound(PrintWriter xout,
                                                 int roundNumber,
                                                 boolean errorStatus,
                                                 JavaCompiler compiler,
                                                 List<JCCompilationUnit> roots,
                              TaskListener taskListener) throws IOException {
        roundNumber++;
        List<ClassSymbol> noTopLevelClasses = List.nil();
        Set<TypeElement> noAnnotations =  Collections.emptySet();
        printRoundInfo(xout, roundNumber, noTopLevelClasses, noAnnotations, true);

        Set<Element> emptyRootElements = Collections.emptySet(); // immutable
        RoundEnvironment renv = new JavacRoundEnvironment(true,
                                                          errorStatus,
                                                          emptyRootElements,
                                                          JavacProcessingEnvironment.this);
        if (taskListener != null)
            taskListener.started(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING_ROUND));

        try {
            discoveredProcs.iterator().runContributingProcs(renv);
        } finally {
            if (taskListener != null)
                taskListener.finished(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING_ROUND));
        }

        // Add any sources generated during the last round to the set
        // of files to be compiled.
        if (moreToDo()) {
            List<JCCompilationUnit> parsedFiles = sourcesToParsedFiles(compiler);
            roots = cleanTrees(roots).appendList(parsedFiles);
        }

        return roots;
    }