std::unique_ptr<SourceCoverageView> CodeCoverageTool::createSourceFileView(StringRef SourceFile, CoverageMapping &Coverage) { auto SourceBuffer = getSourceFile(SourceFile); if (!SourceBuffer) return nullptr; auto FileCoverage = Coverage.getCoverageForFile(SourceFile); if (FileCoverage.empty()) return nullptr; auto Expansions = FileCoverage.getExpansions(); auto View = llvm::make_unique<SourceCoverageView>( SourceBuffer.get(), ViewOpts, std::move(FileCoverage)); attachExpansionSubViews(*View, Expansions, Coverage); for (auto Function : Coverage.getInstantiations(SourceFile)) { auto SubViewCoverage = Coverage.getCoverageForFunction(*Function); auto SubViewExpansions = SubViewCoverage.getExpansions(); auto SubView = llvm::make_unique<SourceCoverageView>( SourceBuffer.get(), ViewOpts, std::move(SubViewCoverage)); attachExpansionSubViews(*SubView, SubViewExpansions, Coverage); if (SubView) { unsigned FileID = Function->CountedRegions.front().FileID; unsigned Line = 0; for (const auto &CR : Function->CountedRegions) if (CR.FileID == FileID) Line = std::max(CR.LineEnd, Line); View->addInstantiation(Function->Name, Line, std::move(SubView)); } } return View; }
/// \brief Render an array of all the source files, also pass back a Summary. void renderFiles(ArrayRef<std::string> SourceFiles, ArrayRef<FileCoverageSummary> FileReports) { // Start List of Files. emitArrayStart(); for (unsigned I = 0, E = SourceFiles.size(); I < E; ++I) { // Render the file. auto FileCoverage = Coverage.getCoverageForFile(SourceFiles[I]); renderFile(FileCoverage, FileReports[I]); } // End List of Files. emitArrayEnd(); }