140 lines · c
1//===- CoverageReport.h - Code coverage report ----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This class implements rendering of a code coverage report.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_COV_COVERAGEREPORT_H14#define LLVM_COV_COVERAGEREPORT_H15 16#include "CoverageFilters.h"17#include "CoverageSummaryInfo.h"18#include "CoverageViewOptions.h"19#include <map>20 21namespace llvm {22 23class ThreadPoolInterface;24 25/// Displays the code coverage report.26class CoverageReport {27 const CoverageViewOptions &Options;28 const coverage::CoverageMapping &Coverage;29 30 void render(const FileCoverageSummary &File, raw_ostream &OS) const;31 void render(const FunctionCoverageSummary &Function, const DemangleCache &DC,32 raw_ostream &OS) const;33 34public:35 CoverageReport(const CoverageViewOptions &Options,36 const coverage::CoverageMapping &Coverage)37 : Options(Options), Coverage(Coverage) {}38 39 void renderFunctionReports(ArrayRef<std::string> Files,40 const DemangleCache &DC, raw_ostream &OS);41 42 /// Prepare file reports for the files specified in \p Files.43 static std::vector<FileCoverageSummary>44 prepareFileReports(const coverage::CoverageMapping &Coverage,45 FileCoverageSummary &Totals, ArrayRef<std::string> Files,46 const CoverageViewOptions &Options,47 const CoverageFilter &Filters = CoverageFiltersMatchAll());48 49 static void50 prepareSingleFileReport(const StringRef Filename,51 const coverage::CoverageMapping *Coverage,52 const CoverageViewOptions &Options,53 const unsigned LCP,54 FileCoverageSummary *FileReport,55 const CoverageFilter *Filters);56 57 /// Render file reports for every unique file in the coverage mapping.58 void renderFileReports(raw_ostream &OS,59 const CoverageFilters &IgnoreFilenameFilters) const;60 61 /// Render file reports for the files specified in \p Files.62 void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files) const;63 64 /// Render file reports for the files specified in \p Files and the functions65 /// in \p Filters.66 void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files,67 const CoverageFiltersMatchAll &Filters) const;68 69 /// Render file reports with given data.70 void renderFileReports(raw_ostream &OS,71 const std::vector<FileCoverageSummary> &FileReports,72 const FileCoverageSummary &Totals,73 bool ShowEmptyFiles) const;74};75 76/// Prepare reports for every non-trivial directories (which have more than 177/// source files) of the source files. This class uses template method pattern.78class DirectoryCoverageReport {79public:80 DirectoryCoverageReport(81 const CoverageViewOptions &Options,82 const coverage::CoverageMapping &Coverage,83 const CoverageFiltersMatchAll &Filters = CoverageFiltersMatchAll())84 : Options(Options), Coverage(Coverage), Filters(Filters) {}85 86 virtual ~DirectoryCoverageReport() = default;87 88 /// Prepare file reports for each directory in \p SourceFiles. The total89 /// report for all files is returned and its Name is set to the LCP of all90 /// files. The size of \p SourceFiles must be greater than 1 or else the91 /// behavior is undefined, in which case you should use92 /// CoverageReport::prepareSingleFileReport instead. If an error occurs,93 /// the recursion will stop immediately.94 Expected<FileCoverageSummary>95 prepareDirectoryReports(ArrayRef<std::string> SourceFiles);96 97protected:98 // These member variables below are used for avoiding being passed99 // repeatedly in recursion.100 const CoverageViewOptions &Options;101 const coverage::CoverageMapping &Coverage;102 const CoverageFiltersMatchAll &Filters;103 104 /// For calling CoverageReport::prepareSingleFileReport asynchronously105 /// in prepareSubDirectoryReports(). It's not intended to be modified by106 /// generateSubDirectoryReport().107 ThreadPoolInterface *TPool;108 109 /// One report level may correspond to multiple directory levels as we omit110 /// directories which have only one subentry. So we use this Stack to track111 /// each report level's corresponding drectory level.112 /// Each value in the stack is the LCP prefix length length of that report113 /// level. LCPStack.front() is the root LCP. Current LCP is LCPStack.back().114 SmallVector<unsigned, 32> LCPStack;115 116 // Use std::map to sort table rows in order.117 using SubFileReports = std::map<StringRef, FileCoverageSummary>;118 using SubDirReports =119 std::map<StringRef,120 std::pair<FileCoverageSummary, SmallVector<StringRef, 0>>>;121 122 /// This method is called when a report level is prepared during the123 /// recursion. \p SubFiles are the reports for those files directly in the124 /// current directory. \p SubDirs are the reports for subdirectories in125 /// current directory. \p SubTotals is the sum of all, and its name is the126 /// current LCP. Note that this method won't be called for trivial127 /// directories.128 virtual Error generateSubDirectoryReport(SubFileReports &&SubFiles,129 SubDirReports &&SubDirs,130 FileCoverageSummary &&SubTotals) = 0;131 132private:133 Error prepareSubDirectoryReports(const ArrayRef<StringRef> &Files,134 FileCoverageSummary *Totals);135};136 137} // end namespace llvm138 139#endif // LLVM_COV_COVERAGEREPORT_H140