diff options
-rw-r--r-- | Driver/HTMLDiagnostics.cpp | 9 | ||||
-rw-r--r-- | include/clang/Rewrite/HTMLRewrite.h | 16 | ||||
-rw-r--r-- | lib/Rewrite/HTMLRewrite.cpp | 17 |
3 files changed, 35 insertions, 7 deletions
diff --git a/Driver/HTMLDiagnostics.cpp b/Driver/HTMLDiagnostics.cpp index 870628963a..6910af74d0 100644 --- a/Driver/HTMLDiagnostics.cpp +++ b/Driver/HTMLDiagnostics.cpp @@ -199,8 +199,13 @@ void HTMLDiagnostics::HandlePathDiagnostic(const PathDiagnostic& D) { // Emit the HTML to disk. - for (RewriteBuffer::iterator I = Buf->begin(), E = Buf->end(); I!=E; ++I) - os << *I; + for (RewriteBuffer::iterator I = Buf->begin(), E = Buf->end(); I!=E; ++I) { + // Expand tabs. + if (*I == '\t') + os << " "; + else + os << *I; + } } void HTMLDiagnostics::HandlePiece(Rewriter& R, diff --git a/include/clang/Rewrite/HTMLRewrite.h b/include/clang/Rewrite/HTMLRewrite.h index b8f9b95913..d5bdc89070 100644 --- a/include/clang/Rewrite/HTMLRewrite.h +++ b/include/clang/Rewrite/HTMLRewrite.h @@ -24,8 +24,20 @@ class Rewriter; namespace html { - void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false); - std::string EscapeText(const std::string& s, bool EscapeSpaces = false); + /// EscapeText - HTMLize a specified file so that special characters are + /// are translated so that they are not interpreted as HTML tags. In this + /// version tabs are not replaced with spaces by default, as this can + /// introduce a serious performance overhead as the amount of replaced + /// text can be very large. + void EscapeText(Rewriter& R, unsigned FileID, + bool EscapeSpaces = false, bool ReplacesTabs = false); + + /// EscapeText - HTMLized the provided string so that special characters + /// in 's' are not interpreted as HTML tags. Unlike the version of + /// EscapeText that rewrites a file, this version by default replaces tabs + /// with spaces. + std::string EscapeText(const std::string& s, + bool EscapeSpaces = false, bool ReplaceTabs = true); void AddLineNumbers(Rewriter& R, unsigned FileID); diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp index 8bc44e3a81..3e0d71a5b6 100644 --- a/lib/Rewrite/HTMLRewrite.cpp +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -20,7 +20,8 @@ using namespace clang; -void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { +void html::EscapeText(Rewriter& R, unsigned FileID, + bool EscapeSpaces, bool ReplaceTabs) { const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID); const char* C = Buf->getBufferStart(); @@ -41,6 +42,9 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { break; case '\t': { + if (!ReplaceTabs) + break; + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); if (EscapeSpaces) @@ -72,7 +76,8 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { } } -std::string html::EscapeText(const std::string& s, bool EscapeSpaces) { +std::string html::EscapeText(const std::string& s, bool EscapeSpaces, + bool ReplaceTabs) { unsigned len = s.size(); std::ostringstream os; @@ -90,7 +95,13 @@ std::string html::EscapeText(const std::string& s, bool EscapeSpaces) { else os << ' '; break; - case '\t': for (unsigned i = 0; i < 4; ++i) os << " "; break; + case '\t': + if (ReplaceTabs) + for (unsigned i = 0; i < 4; ++i) os << " "; + else os << c; + + break; + case '<': os << "<"; break; case '>': os << ">"; break; case '&': os << "&"; break; |