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; }
std::unique_ptr<SourceCoverageView> CodeCoverageTool::createFunctionView(const FunctionRecord &Function, CoverageMapping &Coverage) { auto FunctionCoverage = Coverage.getCoverageForFunction(Function); if (FunctionCoverage.empty()) return nullptr; auto SourceBuffer = getSourceFile(FunctionCoverage.getFilename()); if (!SourceBuffer) return nullptr; auto Expansions = FunctionCoverage.getExpansions(); auto View = llvm::make_unique<SourceCoverageView>( SourceBuffer.get(), ViewOpts, std::move(FunctionCoverage)); attachExpansionSubViews(*View, Expansions, Coverage); return View; }