diff options
Diffstat (limited to 'tools/llvm-cov/SourceCoverageViewHTML.cpp')
-rw-r--r-- | tools/llvm-cov/SourceCoverageViewHTML.cpp | 90 |
1 files changed, 57 insertions, 33 deletions
diff --git a/tools/llvm-cov/SourceCoverageViewHTML.cpp b/tools/llvm-cov/SourceCoverageViewHTML.cpp index e45c6f4cb473..acb67aa5cfc7 100644 --- a/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -25,31 +25,29 @@ namespace { // Return a string with the special characters in \p Str escaped. std::string escape(StringRef Str, const CoverageViewOptions &Opts) { - std::string Result; + std::string TabExpandedResult; unsigned ColNum = 0; // Record the column number. for (char C : Str) { - ++ColNum; - if (C == '&') - Result += "&"; - else if (C == '<') - Result += "<"; - else if (C == '>') - Result += ">"; - else if (C == '\"') - Result += """; - else if (C == '\n' || C == '\r') { - Result += C; - ColNum = 0; - } else if (C == '\t') { - // Replace '\t' with TabSize spaces. - unsigned NumSpaces = Opts.TabSize - (--ColNum % Opts.TabSize); + if (C == '\t') { + // Replace '\t' with up to TabSize spaces. + unsigned NumSpaces = Opts.TabSize - (ColNum % Opts.TabSize); for (unsigned I = 0; I < NumSpaces; ++I) - Result += " "; + TabExpandedResult += ' '; ColNum += NumSpaces; - } else - Result += C; + } else { + TabExpandedResult += C; + if (C == '\n' || C == '\r') + ColNum = 0; + else + ++ColNum; + } + } + std::string EscapedHTML; + { + raw_string_ostream OS{EscapedHTML}; + printHTMLEscaped(TabExpandedResult, OS); } - return Result; + return EscapedHTML; } // Create a \p Name tag around \p Str, and optionally set its \p ClassName. @@ -116,24 +114,39 @@ table { background: #ffffff; border: 1px solid #dbdbdb; } +.light-row-bold { + background: #ffffff; + border: 1px solid #dbdbdb; + font-weight: bold; +} .column-entry { - text-align: right; + text-align: left; } -.column-entry-left { +.column-entry-bold { + font-weight: bold; text-align: left; } .column-entry-yellow { - text-align: right; + text-align: left; background-color: #ffffd0; } +.column-entry-yellow:hover { + background-color: #fffff0; +} .column-entry-red { - text-align: right; + text-align: left; background-color: #ffd0d0; } +.column-entry-red:hover { + background-color: #fff0f0; +} .column-entry-green { - text-align: right; + text-align: left; background-color: #d0ffd0; } +.column-entry-green:hover { + background-color: #f0fff0; +} .line-number { text-align: right; color: #aaa; @@ -184,10 +197,14 @@ table { } th, td { vertical-align: top; - padding: 2px 5px; + padding: 2px 8px; border-collapse: collapse; border-right: solid 1px #eee; border-left: solid 1px #eee; + text-align: left; +} +td pre { + display: inline-block; } td:first-child { border-left: none; @@ -195,6 +212,9 @@ td:first-child { td:last-child { border-right: none; } +tr:hover { + background-color: #f0f0f0; +} )"; const char *EndHeader = "</head>"; @@ -287,13 +307,14 @@ void CoveragePrinterHTML::closeViewFile(OwnedStream OS) { static void emitColumnLabelsForIndex(raw_ostream &OS, const CoverageViewOptions &Opts) { SmallVector<std::string, 4> Columns; - Columns.emplace_back(tag("td", "Filename", "column-entry-left")); - Columns.emplace_back(tag("td", "Function Coverage", "column-entry")); + Columns.emplace_back(tag("td", "Filename", "column-entry-bold")); + Columns.emplace_back(tag("td", "Function Coverage", "column-entry-bold")); if (Opts.ShowInstantiationSummary) - Columns.emplace_back(tag("td", "Instantiation Coverage", "column-entry")); - Columns.emplace_back(tag("td", "Line Coverage", "column-entry")); + Columns.emplace_back( + tag("td", "Instantiation Coverage", "column-entry-bold")); + Columns.emplace_back(tag("td", "Line Coverage", "column-entry-bold")); if (Opts.ShowRegionSummary) - Columns.emplace_back(tag("td", "Region Coverage", "column-entry")); + Columns.emplace_back(tag("td", "Region Coverage", "column-entry-bold")); OS << tag("tr", join(Columns.begin(), Columns.end(), "")); } @@ -339,7 +360,7 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF, // Simplify the display file path, and wrap it in a link if requested. std::string Filename; if (IsTotals) { - Filename = "TOTALS"; + Filename = SF; } else { Filename = buildLinkToFile(SF, FCS); } @@ -360,7 +381,10 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF, FCS.RegionCoverage.getNumRegions(), FCS.RegionCoverage.getPercentCovered()); - OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row"); + if (IsTotals) + OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row-bold"); + else + OS << tag("tr", join(Columns.begin(), Columns.end(), ""), "light-row"); } Error CoveragePrinterHTML::createIndexFile( |