if (!SourceBuffer)
return;
auto SubView = llvm::make_unique<SourceCoverageView>(
- SourceBuffer.get(), Parent.getOptions(), ExpandedLines.first,
- ExpandedLines.second, ExpandedRegion);
+ SourceBuffer.get(), Parent.getOptions(), ExpandedRegion);
SourceCoverageDataManager RegionManager;
for (const auto &CR : Function.CountedRegions) {
if (CR.FileID == ExpandedRegion.ExpandedFileID)
for (const auto &InstantiationSet : InstantiationSetCollector) {
if (InstantiationSet.second.size() < 2)
continue;
- auto InterestingRange = findExpandedFileInterestingLineRange(
- InstantiationSet.second.front()->CountedRegions.front().FileID,
- *InstantiationSet.second.front());
for (auto Function : InstantiationSet.second) {
- auto SubView = llvm::make_unique<SourceCoverageView>(
- View, InterestingRange.first, InterestingRange.second,
- Function->Name);
+ auto SubView =
+ llvm::make_unique<SourceCoverageView>(View, Function->Name);
createInstantiationSubView(SourceFile, *Function, *SubView);
View.addChild(std::move(SubView));
}
auto SourceBuffer = getSourceFile(SourceFile);
if (!SourceBuffer)
return 1;
- auto Range = findExpandedFileInterestingLineRange(MainFileID, Function);
- SourceCoverageView mainView(SourceBuffer.get(), ViewOpts, Range.first,
- Range.second);
+ SourceCoverageView mainView(SourceBuffer.get(), ViewOpts);
createSourceFileView(SourceFile, mainView, Function, true);
ViewOpts.colored_ostream(outs(), raw_ostream::CYAN)
<< Function.Name << " from " << SourceFile << ":";
line_iterator Lines(File);
// Advance the line iterator to the first line.
- while (Lines.line_number() < LineStart)
+ while (Lines.line_number() < LineOffset)
++Lines;
// The width of the leading columns
// subviews.
unsigned DividerWidth = CombinedColumnWidth + 4;
- for (size_t I = 0; I < LineCount; ++I) {
- unsigned LineNo = I + LineStart;
+ for (size_t I = 0, E = LineStats.size(); I < E; ++I) {
+ unsigned LineNo = I + LineOffset;
// Gather the child subviews that are visible on this line.
auto LineSubViews = gatherLineSubViews(CurrentChild, Children, LineNo);
void
SourceCoverageView::createLineCoverageInfo(SourceCoverageDataManager &Data) {
- LineStats.resize(LineCount);
- for (const auto &CR : Data.getSourceRegions()) {
+ auto CountedRegions = Data.getSourceRegions();
+ if (!CountedRegions.size())
+ return;
+
+ LineOffset = CountedRegions.front().LineStart;
+ LineStats.resize(CountedRegions.front().LineEnd - LineOffset + 1);
+ for (const auto &CR : CountedRegions) {
+ if (CR.LineEnd > LineStats.size())
+ LineStats.resize(CR.LineEnd - LineOffset + 1);
if (CR.Kind == coverage::CounterMappingRegion::SkippedRegion) {
// Reset the line stats for skipped regions.
for (unsigned Line = CR.LineStart; Line <= CR.LineEnd;
++Line)
- LineStats[Line - LineStart] = LineCoverageInfo();
+ LineStats[Line - LineOffset] = LineCoverageInfo();
continue;
}
- LineStats[CR.LineStart - LineStart].addRegionStartCount(CR.ExecutionCount);
+ LineStats[CR.LineStart - LineOffset].addRegionStartCount(CR.ExecutionCount);
for (unsigned Line = CR.LineStart + 1; Line <= CR.LineEnd; ++Line)
- LineStats[Line - LineStart].addRegionCount(CR.ExecutionCount);
+ LineStats[Line - LineOffset].addRegionCount(CR.ExecutionCount);
}
}
}
void SourceCoverageView::createRegionMarkers(SourceCoverageDataManager &Data) {
- for (const auto &CR : Data.getSourceRegions()) {
- if (CR.Kind == coverage::CounterMappingRegion::SkippedRegion)
- continue;
- if (CR.LineStart >= LineStart)
+ for (const auto &CR : Data.getSourceRegions())
+ if (CR.Kind != coverage::CounterMappingRegion::SkippedRegion)
Markers.push_back(
RegionMarker(CR.LineStart, CR.ColumnStart, CR.ExecutionCount));
- }
if (Options.Debug) {
for (const auto &Marker : Markers) {
private:
const MemoryBuffer &File;
const CoverageViewOptions &Options;
- unsigned LineStart, LineCount;
+ unsigned LineOffset;
SubViewKind Kind;
coverage::CounterMappingRegion ExpansionRegion;
std::vector<std::unique_ptr<SourceCoverageView>> Children;
public:
SourceCoverageView(const MemoryBuffer &File,
const CoverageViewOptions &Options)
- : File(File), Options(Options), LineStart(1), Kind(View),
- ExpansionRegion(coverage::Counter(), 0, 0, 0, 0, 0) {
- LineCount = File.getBuffer().count('\n') + 1;
- }
-
- SourceCoverageView(const MemoryBuffer &File,
- const CoverageViewOptions &Options, unsigned LineStart,
- unsigned LineEnd)
- : File(File), Options(Options), LineStart(LineStart),
- LineCount(LineEnd - LineStart + 1), Kind(View),
+ : File(File), Options(Options), LineOffset(0), Kind(View),
ExpansionRegion(coverage::Counter(), 0, 0, 0, 0, 0) {}
- SourceCoverageView(SourceCoverageView &Parent, unsigned LineStart,
- unsigned LineEnd, StringRef FunctionName)
- : File(Parent.File), Options(Parent.Options), LineStart(LineStart),
- LineCount(LineEnd - LineStart + 1), Kind(InstantiationView),
- ExpansionRegion(coverage::Counter(), 0, LineEnd, 0, LineEnd, 0),
+ SourceCoverageView(SourceCoverageView &Parent, StringRef FunctionName)
+ : File(Parent.File), Options(Parent.Options), LineOffset(0),
+ Kind(InstantiationView),
+ ExpansionRegion(coverage::Counter(), 0, 0, 0, 0, 0),
FunctionName(FunctionName) {}
SourceCoverageView(const MemoryBuffer &File,
- const CoverageViewOptions &Options, unsigned LineStart,
- unsigned LineEnd,
+ const CoverageViewOptions &Options,
const coverage::CounterMappingRegion &ExpansionRegion)
- : File(File), Options(Options), LineStart(LineStart),
- LineCount(LineEnd - LineStart + 1), Kind(ExpansionView),
+ : File(File), Options(Options), LineOffset(0), Kind(ExpansionView),
ExpansionRegion(ExpansionRegion) {}
const CoverageViewOptions &getOptions() const { return Options; }