void CodeCoverageTool::createExpansionSubView( const MappingRegion &ExpandedRegion, const FunctionCoverageMapping &Function, SourceCoverageView &Parent) { auto ExpandedLines = findExpandedFileInterestingLineRange( ExpandedRegion.ExpandedFileID, Function); if (ViewOpts.Debug) llvm::outs() << "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(), ExpandedLines.first, ExpandedLines.second, ExpandedRegion); SourceCoverageDataManager RegionManager; for (const auto &Region : Function.MappingRegions) { if (Region.FileID == ExpandedRegion.ExpandedFileID) RegionManager.insert(Region); } SubView->load(RegionManager); createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function); Parent.addChild(std::move(SubView)); }
bool CodeCoverageTool::createSourceFileView( StringRef SourceFile, SourceCoverageView &View, ArrayRef<FunctionCoverageMapping> FunctionMappingRecords, bool UseOnlyRegionsInMainFile) { SourceCoverageDataManager RegionManager; FunctionInstantiationSetCollector InstantiationSetCollector; for (const auto &Function : FunctionMappingRecords) { unsigned MainFileID; if (findMainViewFileID(SourceFile, Function, MainFileID)) continue; SmallSet<unsigned, 8> InterestingFileIDs; if (UseOnlyRegionsInMainFile) { InterestingFileIDs.insert(MainFileID); } else if (!gatherInterestingFileIDs(SourceFile, Function, InterestingFileIDs)) continue; // Get the interesting regions for (const auto &Region : Function.MappingRegions) { if (InterestingFileIDs.count(Region.FileID)) RegionManager.insert(Region); } InstantiationSetCollector.insert(Function, MainFileID); createExpansionSubViews(View, MainFileID, Function); } if (RegionManager.getSourceRegions().empty()) return true; View.load(RegionManager); // Show instantiations if (!ViewOpts.ShowFunctionInstantiations) return false; for (const auto &InstantiationSet : InstantiationSetCollector) { if (InstantiationSet.second.size() < 2) continue; auto InterestingRange = findExpandedFileInterestingLineRange( InstantiationSet.second.front()->MappingRegions.front().FileID, *InstantiationSet.second.front()); for (auto Function : InstantiationSet.second) { auto SubView = llvm::make_unique<SourceCoverageView>( View, InterestingRange.first, InterestingRange.second, Function->PrettyName); createInstantiationSubView(SourceFile, *Function, *SubView); View.addChild(std::move(SubView)); } } return false; }