summaryrefslogtreecommitdiff
path: root/tools/llvm-cov/SourceCoverageViewHTML.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-cov/SourceCoverageViewHTML.cpp')
-rw-r--r--tools/llvm-cov/SourceCoverageViewHTML.cpp90
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 += "&lt;";
- else if (C == '>')
- Result += "&gt;";
- else if (C == '\"')
- Result += "&quot;";
- 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 += "&nbsp;";
+ 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(