xref: /freebsd-src/contrib/llvm-project/llvm/tools/llvm-cov/CoverageReport.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- CoverageReport.h - Code coverage report ----------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This class implements rendering of a code coverage report.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_COV_COVERAGEREPORT_H
140b57cec5SDimitry Andric #define LLVM_COV_COVERAGEREPORT_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "CoverageFilters.h"
170b57cec5SDimitry Andric #include "CoverageSummaryInfo.h"
180b57cec5SDimitry Andric #include "CoverageViewOptions.h"
195f757f3fSDimitry Andric #include <map>
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
23*0fca6ea1SDimitry Andric class ThreadPoolInterface;
245f757f3fSDimitry Andric 
250b57cec5SDimitry Andric /// Displays the code coverage report.
260b57cec5SDimitry Andric class CoverageReport {
270b57cec5SDimitry Andric   const CoverageViewOptions &Options;
280b57cec5SDimitry Andric   const coverage::CoverageMapping &Coverage;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric   void render(const FileCoverageSummary &File, raw_ostream &OS) const;
310b57cec5SDimitry Andric   void render(const FunctionCoverageSummary &Function, const DemangleCache &DC,
320b57cec5SDimitry Andric               raw_ostream &OS) const;
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric public:
350b57cec5SDimitry Andric   CoverageReport(const CoverageViewOptions &Options,
360b57cec5SDimitry Andric                  const coverage::CoverageMapping &Coverage)
370b57cec5SDimitry Andric       : Options(Options), Coverage(Coverage) {}
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   void renderFunctionReports(ArrayRef<std::string> Files,
400b57cec5SDimitry Andric                              const DemangleCache &DC, raw_ostream &OS);
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   /// Prepare file reports for the files specified in \p Files.
430b57cec5SDimitry Andric   static std::vector<FileCoverageSummary>
440b57cec5SDimitry Andric   prepareFileReports(const coverage::CoverageMapping &Coverage,
450b57cec5SDimitry Andric                      FileCoverageSummary &Totals, ArrayRef<std::string> Files,
460b57cec5SDimitry Andric                      const CoverageViewOptions &Options,
470b57cec5SDimitry Andric                      const CoverageFilter &Filters = CoverageFiltersMatchAll());
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   static void
500b57cec5SDimitry Andric   prepareSingleFileReport(const StringRef Filename,
510b57cec5SDimitry Andric                           const coverage::CoverageMapping *Coverage,
520b57cec5SDimitry Andric                           const CoverageViewOptions &Options,
530b57cec5SDimitry Andric                           const unsigned LCP,
540b57cec5SDimitry Andric                           FileCoverageSummary *FileReport,
550b57cec5SDimitry Andric                           const CoverageFilter *Filters);
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   /// Render file reports for every unique file in the coverage mapping.
580b57cec5SDimitry Andric   void renderFileReports(raw_ostream &OS,
590b57cec5SDimitry Andric                          const CoverageFilters &IgnoreFilenameFilters) const;
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric   /// Render file reports for the files specified in \p Files.
620b57cec5SDimitry Andric   void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files) const;
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric   /// Render file reports for the files specified in \p Files and the functions
650b57cec5SDimitry Andric   /// in \p Filters.
660b57cec5SDimitry Andric   void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files,
670b57cec5SDimitry Andric                          const CoverageFiltersMatchAll &Filters) const;
685f757f3fSDimitry Andric 
695f757f3fSDimitry Andric   /// Render file reports with given data.
705f757f3fSDimitry Andric   void renderFileReports(raw_ostream &OS,
715f757f3fSDimitry Andric                          const std::vector<FileCoverageSummary> &FileReports,
725f757f3fSDimitry Andric                          const FileCoverageSummary &Totals,
735f757f3fSDimitry Andric                          bool ShowEmptyFiles) const;
745f757f3fSDimitry Andric };
755f757f3fSDimitry Andric 
765f757f3fSDimitry Andric /// Prepare reports for every non-trivial directories (which have more than 1
775f757f3fSDimitry Andric /// source files) of the source files. This class uses template method pattern.
785f757f3fSDimitry Andric class DirectoryCoverageReport {
795f757f3fSDimitry Andric public:
805f757f3fSDimitry Andric   DirectoryCoverageReport(
815f757f3fSDimitry Andric       const CoverageViewOptions &Options,
825f757f3fSDimitry Andric       const coverage::CoverageMapping &Coverage,
835f757f3fSDimitry Andric       const CoverageFiltersMatchAll &Filters = CoverageFiltersMatchAll())
845f757f3fSDimitry Andric       : Options(Options), Coverage(Coverage), Filters(Filters) {}
855f757f3fSDimitry Andric 
865f757f3fSDimitry Andric   virtual ~DirectoryCoverageReport() = default;
875f757f3fSDimitry Andric 
885f757f3fSDimitry Andric   /// Prepare file reports for each directory in \p SourceFiles. The total
895f757f3fSDimitry Andric   /// report for all files is returned and its Name is set to the LCP of all
905f757f3fSDimitry Andric   /// files. The size of \p SourceFiles must be greater than 1 or else the
915f757f3fSDimitry Andric   /// behavior is undefined, in which case you should use
925f757f3fSDimitry Andric   /// CoverageReport::prepareSingleFileReport instead. If an error occurs,
935f757f3fSDimitry Andric   /// the recursion will stop immediately.
945f757f3fSDimitry Andric   Expected<FileCoverageSummary>
955f757f3fSDimitry Andric   prepareDirectoryReports(ArrayRef<std::string> SourceFiles);
965f757f3fSDimitry Andric 
975f757f3fSDimitry Andric protected:
985f757f3fSDimitry Andric   // These member variables below are used for avoiding being passed
995f757f3fSDimitry Andric   // repeatedly in recursion.
1005f757f3fSDimitry Andric   const CoverageViewOptions &Options;
1015f757f3fSDimitry Andric   const coverage::CoverageMapping &Coverage;
1025f757f3fSDimitry Andric   const CoverageFiltersMatchAll &Filters;
1035f757f3fSDimitry Andric 
1045f757f3fSDimitry Andric   /// For calling CoverageReport::prepareSingleFileReport asynchronously
1055f757f3fSDimitry Andric   /// in prepareSubDirectoryReports(). It's not intended to be modified by
1065f757f3fSDimitry Andric   /// generateSubDirectoryReport().
107*0fca6ea1SDimitry Andric   ThreadPoolInterface *TPool;
1085f757f3fSDimitry Andric 
1095f757f3fSDimitry Andric   /// One report level may correspond to multiple directory levels as we omit
1105f757f3fSDimitry Andric   /// directories which have only one subentry. So we use this Stack to track
1115f757f3fSDimitry Andric   /// each report level's corresponding drectory level.
1125f757f3fSDimitry Andric   /// Each value in the stack is the LCP prefix length length of that report
1135f757f3fSDimitry Andric   /// level. LCPStack.front() is the root LCP. Current LCP is LCPStack.back().
1145f757f3fSDimitry Andric   SmallVector<unsigned, 32> LCPStack;
1155f757f3fSDimitry Andric 
1165f757f3fSDimitry Andric   // Use std::map to sort table rows in order.
1175f757f3fSDimitry Andric   using SubFileReports = std::map<StringRef, FileCoverageSummary>;
1185f757f3fSDimitry Andric   using SubDirReports =
1195f757f3fSDimitry Andric       std::map<StringRef,
1205f757f3fSDimitry Andric                std::pair<FileCoverageSummary, SmallVector<StringRef, 0>>>;
1215f757f3fSDimitry Andric 
1225f757f3fSDimitry Andric   /// This method is called when a report level is prepared during the
1235f757f3fSDimitry Andric   /// recursion. \p SubFiles are the reports for those files directly in the
1245f757f3fSDimitry Andric   /// current directory. \p SubDirs are the reports for subdirectories in
1255f757f3fSDimitry Andric   /// current directory. \p SubTotals is the sum of all, and its name is the
1265f757f3fSDimitry Andric   /// current LCP. Note that this method won't be called for trivial
1275f757f3fSDimitry Andric   /// directories.
1285f757f3fSDimitry Andric   virtual Error generateSubDirectoryReport(SubFileReports &&SubFiles,
1295f757f3fSDimitry Andric                                            SubDirReports &&SubDirs,
1305f757f3fSDimitry Andric                                            FileCoverageSummary &&SubTotals) = 0;
1315f757f3fSDimitry Andric 
1325f757f3fSDimitry Andric private:
1335f757f3fSDimitry Andric   Error prepareSubDirectoryReports(const ArrayRef<StringRef> &Files,
1345f757f3fSDimitry Andric                                    FileCoverageSummary *Totals);
1350b57cec5SDimitry Andric };
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric } // end namespace llvm
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric #endif // LLVM_COV_COVERAGEREPORT_H
140