aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
diff options
context:
space:
mode:
authorYing Yi <maggieyi666@gmail.com>2016-08-24 14:27:23 +0000
committerYing Yi <maggieyi666@gmail.com>2016-08-24 14:27:23 +0000
commit84dc971ee2bc444a41d01051dba5b83d103ad952 (patch)
treeed2637dc11ef83639d3aa81a281d6463dc8882fd /llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
parentc22e32deac405e042ffe4f05bf01bd5b6e3aa536 (diff)
downloadllvm-84dc971ee2bc444a41d01051dba5b83d103ad952.zip
llvm-84dc971ee2bc444a41d01051dba5b83d103ad952.tar.gz
llvm-84dc971ee2bc444a41d01051dba5b83d103ad952.tar.bz2
[llvm-cov] Add the project summary to each source file coverage report.
This patch includes the following changes: - Included header "Code coverage report" and include the date that the report was created. - Included title (as specified in a command line option, (i.e llvm-cov -project-title="Simple Test") - In the summary, list the elf files that the source code file has contributed to. - Used column heading for "Line No.", "Count No.", Source". Differential Revision: https://reviews.llvm.org/D23345 llvm-svn: 279628
Diffstat (limited to 'llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp')
-rw-r--r--llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp99
1 files changed, 88 insertions, 11 deletions
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
index 588b838..8245ebd 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
using namespace llvm;
@@ -88,10 +89,11 @@ pre {
padding: 5px 10px;
border-bottom: 1px solid #dbdbdb;
background-color: #eee;
+ line-height: 35px;
}
.centered {
display: table;
- margin-left: auto;
+ margin-left: left;
margin-right: auto;
border: 1px solid #dbdbdb;
border-radius: 3px;
@@ -169,6 +171,23 @@ td:first-child {
td:last-child {
border-right: none;
}
+.project-title {
+ font-size:36.0pt;
+ line-height:200%;
+ font-family:Calibri;
+ font-weight: bold;
+}
+.report-title {
+ font-size:16.0pt;
+ line-height:120%;
+ font-family:Arial;
+ font-weight: bold;
+}
+.created-time {
+ font-size:14.0pt;
+ line-height:120%;
+ font-family:Arial;
+}
)";
const char *EndHeader = "</head>";
@@ -197,6 +216,20 @@ const char *BeginTable = "<table>";
const char *EndTable = "</table>";
+const char *BeginProjectTitleDiv = "<div class='project-title'>";
+
+const char *EndProjectTitleDiv = "</div>";
+
+const char *BeginReportTitleDiv = "<div class='report-title'>";
+
+const char *EndReportTitleDiv = "</div>";
+
+const char *BeginCreatedTimeDiv = "<div class='created-time'>";
+
+const char *EndCreatedTimeDiv = "</div>";
+
+const char *LineBreak = "<br>";
+
std::string getPathToStyle(StringRef ViewPath) {
std::string PathToStyle = "";
std::string PathSep = sys::path::get_separator();
@@ -219,12 +252,12 @@ void emitPrelude(raw_ostream &OS, const CoverageViewOptions &Opts,
OS << "<link rel='stylesheet' type='text/css' href='"
<< escape(PathToStyle, Opts) << "'>";
- OS << EndHeader << "<body>" << BeginCenteredDiv;
+ OS << EndHeader << "<body>";
}
void emitEpilog(raw_ostream &OS) {
- OS << EndCenteredDiv << "</body>"
- "</html>";
+ OS << "</body>"
+ << "</html>";
}
} // anonymous namespace
@@ -261,15 +294,26 @@ Error CoveragePrinterHTML::createIndexFile(ArrayRef<StringRef> SourceFiles) {
// Emit a table containing links to reports for each file in the covmapping.
assert(Opts.hasOutputDirectory() && "No output directory for index file");
emitPrelude(OSRef, Opts, getPathToStyle(""));
+ if (Opts.hasProjectTitle())
+ OSRef << BeginProjectTitleDiv
+ << tag("span", escape(Opts.ProjectTitle, Opts)) << EndProjectTitleDiv;
+ OSRef << BeginReportTitleDiv
+ << tag("span", escape("Code Coverage Report", Opts))
+ << EndReportTitleDiv;
+ if (Opts.hasCreatedTime())
+ OSRef << BeginCreatedTimeDiv
+ << tag("span", escape(Opts.CreatedTimeStr, Opts))
+ << EndCreatedTimeDiv;
+ OSRef << LineBreak;
+ OSRef << BeginCenteredDiv << BeginTable;
OSRef << BeginSourceNameDiv << "Index" << EndSourceNameDiv;
- OSRef << BeginTable;
for (StringRef SF : SourceFiles) {
std::string LinkText = escape(sys::path::relative_path(SF), Opts);
std::string LinkTarget =
escape(getOutputPath(SF, "html", /*InToplevel=*/false), Opts);
OSRef << tag("tr", tag("td", tag("pre", a(LinkTarget, LinkText), "code")));
}
- OSRef << EndTable;
+ OSRef << EndTable << EndCenteredDiv;
emitEpilog(OSRef);
// Emit the default stylesheet.
@@ -284,16 +328,24 @@ Error CoveragePrinterHTML::createIndexFile(ArrayRef<StringRef> SourceFiles) {
}
void SourceCoverageViewHTML::renderViewHeader(raw_ostream &OS) {
- OS << BeginTable;
+ OS << LineBreak << BeginCenteredDiv << BeginTable;
}
void SourceCoverageViewHTML::renderViewFooter(raw_ostream &OS) {
- OS << EndTable;
+ OS << EndTable << EndCenteredDiv;
}
-void SourceCoverageViewHTML::renderSourceName(raw_ostream &OS) {
- OS << BeginSourceNameDiv << tag("pre", escape(getSourceName(), getOptions()))
- << EndSourceNameDiv;
+void SourceCoverageViewHTML::renderSourceName(raw_ostream &OS, bool WholeFile) {
+ OS << BeginSourceNameDiv;
+ // Render the source name for the view.
+ std::string SourceFile = isFunctionView() ? "Function: " : "Source: ";
+ SourceFile += getSourceName().str();
+ OS << tag("pre", escape(SourceFile, getOptions()));
+ // Render the object file name for the view.
+ if (WholeFile)
+ OS << tag("pre",
+ escape("Binary: " + getOptions().ObjectFilename, getOptions()));
+ OS << EndSourceNameDiv;
}
void SourceCoverageViewHTML::renderLinePrefix(raw_ostream &OS, unsigned) {
@@ -489,3 +541,28 @@ void SourceCoverageViewHTML::renderInstantiationView(raw_ostream &OS,
ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, ViewDepth);
OS << EndExpansionDiv;
}
+
+void SourceCoverageViewHTML::renderCellInTitle(raw_ostream &OS,
+ StringRef CellText) {
+ if (getOptions().hasProjectTitle())
+ OS << BeginProjectTitleDiv
+ << tag("span", escape(getOptions().ProjectTitle, getOptions()))
+ << EndProjectTitleDiv;
+
+ OS << BeginReportTitleDiv << tag("span", escape(CellText, getOptions()))
+ << EndReportTitleDiv;
+
+ if (getOptions().hasCreatedTime())
+ OS << BeginCreatedTimeDiv
+ << tag("span", escape(getOptions().CreatedTimeStr, getOptions()))
+ << EndCreatedTimeDiv;
+}
+
+void SourceCoverageViewHTML::renderTableHeader(raw_ostream &OS,
+ unsigned ViewDepth) {
+ renderLinePrefix(OS, ViewDepth);
+ OS << tag("td", tag("span", tag("pre", escape("Line No.", getOptions()))))
+ << tag("td", tag("span", tag("pre", escape("Count No.", getOptions()))))
+ << tag("td", tag("span", tag("pre", escape("Source", getOptions()))));
+ renderLineSuffix(OS, ViewDepth);
+}