1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- SourceCoverageViewText.cpp - A text-based code coverage view -------===// 2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// The LLVM Compiler Infrastructure 4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details. 7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \file This file implements the text-based coverage renderer. 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "SourceCoverageViewText.h" 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Optional.h" 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/SmallString.h" 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringExtras.h" 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm; 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarExpected<CoveragePrinter::OwnedStream> 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarCoveragePrinterText::createViewFile(StringRef Path, bool InToplevel) { 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return createOutputStream(Path, "txt", InToplevel); 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CoveragePrinterText::closeViewFile(OwnedStream OS) { 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS->operator<<('\n'); 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarError CoveragePrinterText::createIndexFile(ArrayRef<StringRef> SourceFiles) { 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto OSOrErr = createOutputStream("index", "txt", /*InToplevel=*/true); 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Error E = OSOrErr.takeError()) 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return E; 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto OS = std::move(OSOrErr.get()); 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_ostream &OSRef = *OS.get(); 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (StringRef SF : SourceFiles) 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OSRef << getOutputPath(SF, "txt", /*InToplevel=*/false) << '\n'; 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Error::success(); 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace { 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const unsigned LineCoverageColumnWidth = 7; 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const unsigned LineNumberColumnWidth = 5; 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \brief Get the width of the leading columns. 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarunsigned getCombinedColumnWidth(const CoverageViewOptions &Opts) { 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (Opts.ShowLineStats ? LineCoverageColumnWidth + 1 : 0) + 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar (Opts.ShowLineNumbers ? LineNumberColumnWidth + 1 : 0); 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \brief The width of the line that is used to divide between the view and 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// the subviews. 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarunsigned getDividerWidth(const CoverageViewOptions &Opts) { 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return getCombinedColumnWidth(Opts) + 4; 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // anonymous namespace 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderViewHeader(raw_ostream &) {} 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderViewFooter(raw_ostream &) {} 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderSourceName(raw_ostream &OS) { 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getOptions().colored_ostream(OS, raw_ostream::CYAN) << getSourceName() 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << ":\n"; 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderLinePrefix(raw_ostream &OS, 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ViewDepth) { 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (unsigned I = 0; I < ViewDepth; ++I) 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << " |"; 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderLineSuffix(raw_ostream &, unsigned) {} 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderViewDivider(raw_ostream &OS, 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ViewDepth) { 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ViewDepth != 0 && "Cannot render divider at top level"); 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar renderLinePrefix(OS, ViewDepth - 1); 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(2); 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned Length = getDividerWidth(getOptions()); 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (unsigned I = 0; I < Length; ++I) 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '-'; 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '\n'; 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderLine( 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_ostream &OS, LineRef L, 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const coverage::CoverageSegment *WrappedSegment, 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CoverageSegmentArray Segments, unsigned ExpansionCol, unsigned ViewDepth) { 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef Line = L.Line; 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned LineNumber = L.LineNo; 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Optional<raw_ostream::Colors> Highlight; 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallVector<std::pair<unsigned, unsigned>, 2> HighlightedRanges; 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The first segment overlaps from a previous line, so we treat it specially. 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (WrappedSegment && WrappedSegment->HasCount && WrappedSegment->Count == 0) 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Highlight = raw_ostream::RED; 103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Output each segment of the line, possibly highlighted. 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned Col = 1; 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto *S : Segments) { 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned End = std::min(S->Col, static_cast<unsigned>(Line.size()) + 1); 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar colored_ostream(OS, Highlight ? *Highlight : raw_ostream::SAVEDCOLOR, 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getOptions().Colors && Highlight, /*Bold=*/false, 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /*BG=*/true) 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << Line.substr(Col - 1, End - Col); 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getOptions().Debug && Highlight) 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar HighlightedRanges.push_back(std::make_pair(Col, End)); 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Col = End; 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Col == ExpansionCol) 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Highlight = raw_ostream::CYAN; 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else if (S->HasCount && S->Count == 0) 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Highlight = raw_ostream::RED; 119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Highlight = None; 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Show the rest of the line. 124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar colored_ostream(OS, Highlight ? *Highlight : raw_ostream::SAVEDCOLOR, 125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getOptions().Colors && Highlight, /*Bold=*/false, /*BG=*/true) 126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << Line.substr(Col - 1, Line.size() - Col + 1); 127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '\n'; 128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getOptions().Debug) { 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &Range : HighlightedRanges) 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "Highlighted line " << LineNumber << ", " << Range.first 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << " -> " << Range.second << '\n'; 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Highlight) 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "Highlighted line " << LineNumber << ", " << Col << " -> ?\n"; 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderLineCoverageColumn( 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_ostream &OS, const LineCoverageStats &Line) { 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!Line.isMapped()) { 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(LineCoverageColumnWidth) << '|'; 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string C = formatCount(Line.ExecutionCount); 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(LineCoverageColumnWidth - C.size()); 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar colored_ostream(OS, raw_ostream::MAGENTA, 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Line.hasMultipleRegions() && getOptions().Colors) 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << C; 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '|'; 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderLineNumberColumn(raw_ostream &OS, 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned LineNo) { 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallString<32> Buffer; 155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_svector_ostream BufferOS(Buffer); 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar BufferOS << LineNo; 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Str = BufferOS.str(); 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Trim and align to the right. 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Str = Str.substr(0, std::min(Str.size(), (size_t)LineNumberColumnWidth)); 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(LineNumberColumnWidth - Str.size()) << Str << '|'; 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderRegionMarkers( 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_ostream &OS, CoverageSegmentArray Segments, unsigned ViewDepth) { 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar renderLinePrefix(OS, ViewDepth); 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(getCombinedColumnWidth(getOptions())); 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned PrevColumn = 1; 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto *S : Segments) { 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!S->IsRegionEntry) 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar continue; 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Skip to the new region. 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (S->Col > PrevColumn) 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(S->Col - PrevColumn); 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PrevColumn = S->Col + 1; 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string C = formatCount(S->Count); 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PrevColumn += C.size(); 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '^' << C; 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << '\n'; 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getOptions().Debug) 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto *S : Segments) 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "Marker at " << S->Line << ":" << S->Col << " = " 185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << formatCount(S->Count) << (S->IsRegionEntry ? "\n" : " (pop)\n"); 186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderExpansionSite( 189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_ostream &OS, LineRef L, const coverage::CoverageSegment *WrappedSegment, 190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CoverageSegmentArray Segments, unsigned ExpansionCol, unsigned ViewDepth) { 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar renderLinePrefix(OS, ViewDepth); 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.indent(getCombinedColumnWidth(getOptions()) + (ViewDepth == 0 ? 0 : 1)); 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar renderLine(OS, L, WrappedSegment, Segments, ExpansionCol, ViewDepth); 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderExpansionView(raw_ostream &OS, 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExpansionView &ESV, 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ViewDepth) { 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Render the child subview. 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getOptions().Debug) 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "Expansion at line " << ESV.getLine() << ", " << ESV.getStartCol() 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << " -> " << ESV.getEndCol() << '\n'; 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ESV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/false, 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ViewDepth + 1); 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid SourceCoverageViewText::renderInstantiationView(raw_ostream &OS, 208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar InstantiationView &ISV, 209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ViewDepth) { 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar renderLinePrefix(OS, ViewDepth); 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << ' '; 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, ViewDepth); 213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 214