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