void CodeCoverageTool::createExpansionSubView( const CountedRegion &ExpandedRegion, const FunctionCoverageMapping &Function, SourceCoverageView &Parent) { auto ExpandedLines = findExpandedFileInterestingLineRange( ExpandedRegion.ExpandedFileID, Function); if (ViewOpts.Debug) llvm::errs() << "Expansion of " << ExpandedRegion.ExpandedFileID << ":" << ExpandedLines.first << " -> " << ExpandedLines.second << " @ " << ExpandedRegion.FileID << ", " << ExpandedRegion.LineStart << ":" << ExpandedRegion.ColumnStart << "\n"; auto SourceBuffer = getSourceFile(Function.Filenames[ExpandedRegion.ExpandedFileID]); if (!SourceBuffer) return; auto SubView = llvm::make_unique<SourceCoverageView>(SourceBuffer.get(), Parent.getOptions()); auto RegionManager = llvm::make_unique<SourceCoverageDataManager>(); for (const auto &CR : Function.CountedRegions) { if (CR.FileID == ExpandedRegion.ExpandedFileID) RegionManager->insert(CR); } SubView->load(std::move(RegionManager)); createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function); Parent.addExpansion(ExpandedRegion, std::move(SubView)); }
void CodeCoverageTool::attachExpansionSubViews( SourceCoverageView &View, ArrayRef<ExpansionRecord> Expansions, const CoverageMapping &Coverage) { if (!ViewOpts.ShowExpandedRegions) return; for (const auto &Expansion : Expansions) { auto ExpansionCoverage = Coverage.getCoverageForExpansion(Expansion); if (ExpansionCoverage.empty()) continue; auto SourceBuffer = getSourceFile(ExpansionCoverage.getFilename()); if (!SourceBuffer) continue; auto SubViewExpansions = ExpansionCoverage.getExpansions(); auto SubView = SourceCoverageView::create(Expansion.Function.Name, SourceBuffer.get(), ViewOpts, std::move(ExpansionCoverage)); attachExpansionSubViews(*SubView, SubViewExpansions, Coverage); View.addExpansion(Expansion.Region, std::move(SubView)); } }