public void generateReport(CoverageSuitesBundle suite, Project project) throws IOException {
    final long startNs = System.nanoTime();
    final ProjectData projectData = suite.getCoverageData();
    if (projectData == null) return;
    IDEACoverageRunner.setExcludeAnnotations(project, projectData);
    UnloadedUtil.appendUnloaded(projectData, new IdeaClassFinder(project, suite), suite.isBranchCoverage());

    final long generationStartNs = System.nanoTime();
    final ExportToHTMLSettings settings = ExportToHTMLSettings.getInstance(project);
    final HTMLReportBuilder builder = ReportBuilderFactory.createHTMLReportBuilder();
    builder.setReportDir(new File(settings.OUTPUT_DIRECTORY));
    final SourceCodeProvider sourceCodeProvider = classname -> DumbService.getInstance(project).runReadActionInSmartMode(() -> {
      if (project.isDisposed()) return "";
      final PsiClass psiClass = ClassUtil.findPsiClassByJVMName(PsiManager.getInstance(project), classname);
      return psiClass != null ? psiClass.getNavigationElement().getContainingFile().getText() : "";
    });
    builder.generateReport(new IDEACoverageData(projectData, sourceCodeProvider) {
      @NotNull
      @Override
      public Collection<ClassInfo> getClasses() {
        final Collection<ClassInfo> classes = super.getClasses();
        JavaCoverageSuite javaCoverageSuite = (JavaCoverageSuite)suite.getSuites()[0];
        if (!suite.isTrackTestFolders() ||
            javaCoverageSuite.getExcludedClassNames().length > 0 ||
            javaCoverageSuite.getExcludedPackageNames().length > 0) {
          final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
          final GlobalSearchScope productionScope = !suite.isTrackTestFolders() ? GlobalSearchScopesCore.projectProductionScope(project)
                                                                                : GlobalSearchScope.projectScope(project);
          for (Iterator<ClassInfo> iterator = classes.iterator(); iterator.hasNext(); ) {
            final ClassInfo aClass = iterator.next();
            final PsiClass psiClass = DumbService.getInstance(project).runReadActionInSmartMode(() -> {
              if (project.isDisposed()) return null;
              return psiFacade.findClass(aClass.getFQName(), productionScope);
            });
            if (psiClass == null || !suite.getCoverageEngine().acceptedByFilters(ReadAction.compute(() -> psiClass.getContainingFile()), suite)) {
              iterator.remove();
            }
          }
        }
        return classes;
      }
    });
    final long endNs = System.nanoTime();
    final long timeMs = TimeUnit.NANOSECONDS.toMillis(endNs - startNs);
    final long generationTimeMs = TimeUnit.NANOSECONDS.toMillis(endNs - generationStartNs);
    CoverageLogger.logHTMLReport(project, timeMs, generationTimeMs);
  }
public void generateReport(CoverageSuitesBundle suite, Project project)