| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying   file Copyright.txt or https://cmake.org/licensing for details.  */#ifndef cmCTestCoverageHandler_h#define cmCTestCoverageHandler_h#include "cmConfigure.h" // IWYU pragma: keep#include "cmCTestGenericHandler.h"#include "cmsys/RegularExpression.hxx"#include <iosfwd>#include <map>#include <set>#include <string>#include <vector>class cmGeneratedFileStream;class cmMakefile;class cmXMLWriter;class cmCTestCoverageHandlerContainer{public:  int Error;  std::string SourceDir;  std::string BinaryDir;  typedef std::vector<int> SingleFileCoverageVector;  typedef std::map<std::string, SingleFileCoverageVector> TotalCoverageMap;  TotalCoverageMap TotalCoverage;  std::ostream* OFS;  bool Quiet;};/** \class cmCTestCoverageHandler * \brief A class that handles coverage computation for ctest * */class cmCTestCoverageHandler : public cmCTestGenericHandler{public:  typedef cmCTestGenericHandler Superclass;  /*   * The main entry point for this class   */  int ProcessHandler() override;  cmCTestCoverageHandler();  void Initialize() override;  /**   * This method is called when reading CTest custom file   */  void PopulateCustomVectors(cmMakefile* mf) override;  /** Report coverage only for sources with these labels.  */  void SetLabelFilter(std::set<std::string> const& labels);private:  bool ShouldIDoCoverage(std::string const& file, std::string const& srcDir,                         std::string const& binDir);  void CleanCoverageLogFiles(std::ostream& log);  bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);  void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);  void StartCoverageLogXML(cmXMLWriter& xml);  void EndCoverageLogXML(cmXMLWriter& xml);  //! Handle coverage using GCC's GCov  int HandleGCovCoverage(cmCTestCoverageHandlerContainer* cont);  void FindGCovFiles(std::vector<std::string>& files);  //! Handle coverage using Intel's LCov  int HandleLCovCoverage(cmCTestCoverageHandlerContainer* cont);  bool FindLCovFiles(std::vector<std::string>& files);  //! Handle coverage using xdebug php coverage  int HandlePHPCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage for Python with coverage.py  int HandleCoberturaCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage for mumps  int HandleMumpsCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage for Jacoco  int HandleJacocoCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage for Delphi (Pascal)  int HandleDelphiCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage for Jacoco  int HandleBlanketJSCoverage(cmCTestCoverageHandlerContainer* cont);  //! Handle coverage using Bullseye  int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont);  int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont);  int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont,                                std::set<std::string>& coveredFileNames,                                std::vector<std::string>& files,                                std::vector<std::string>& filesFullPath);  int RunBullseyeCommand(cmCTestCoverageHandlerContainer* cont,                         const char* cmd, const char* arg,                         std::string& outputFile);  bool ParseBullsEyeCovsrcLine(std::string const& inputLine,                               std::string& sourceFile, int& functionsCalled,                               int& totalFunctions, int& percentFunction,                               int& branchCovered, int& totalBranches,                               int& percentBranch);  bool GetNextInt(std::string const& inputLine, std::string::size_type& pos,                  int& value);  //! Handle Python coverage using Python's Trace.py  int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont);  // Find the source file based on the source and build tree. This is used for  // Trace.py mode, since that one does not tell us where the source file is.  std::string FindFile(cmCTestCoverageHandlerContainer* cont,                       std::string const& fileName);  std::set<std::string> FindUncoveredFiles(    cmCTestCoverageHandlerContainer* cont);  std::vector<std::string> CustomCoverageExclude;  std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex;  std::vector<std::string> ExtraCoverageGlobs;  // Map from source file to label ids.  class LabelSet : public std::set<int>  {  };  typedef std::map<std::string, LabelSet> LabelMapType;  LabelMapType SourceLabels;  LabelMapType TargetDirs;  // Map from label name to label id.  typedef std::map<std::string, int> LabelIdMapType;  LabelIdMapType LabelIdMap;  std::vector<std::string> Labels;  int GetLabelId(std::string const& label);  // Label reading and writing methods.  void LoadLabels();  void LoadLabels(const char* dir);  void WriteXMLLabels(cmXMLWriter& xml, std::string const& source);  // Label-based filtering.  std::set<int> LabelFilter;  bool IntersectsFilter(LabelSet const& labels);  bool IsFilteredOut(std::string const& source);};#endif
 |