diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-16 06:11:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-16 06:11:58 +0000 |
commit | 3245a0a1c7a4fd74fca845b2edba275bb126d773 (patch) | |
tree | ab2aab4b4acc1ce3427c823ee94da56635472898 /lib/Rewrite/HTMLRewrite.cpp | |
parent | 8ac661c3c5ffaeedfb3268994ad864ade77b3ba0 (diff) |
Add a mode of hackily syntax highlighting comments. This has a number of
problems, including the fact that it doesn't work well with multi-line
comments due to Ted's crazy table. However, that could be fixed, and it
does work with single-line ones :).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49778 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Rewrite/HTMLRewrite.cpp')
-rw-r--r-- | lib/Rewrite/HTMLRewrite.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp index 9ed5953c60..e35664f546 100644 --- a/lib/Rewrite/HTMLRewrite.cpp +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -14,11 +14,11 @@ #include "clang/Rewrite/Rewriter.h" #include "clang/Rewrite/HTMLRewrite.h" +#include "clang/Lex/Preprocessor.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/MemoryBuffer.h" #include <sstream> - using namespace clang; void html::EscapeText(Rewriter& R, unsigned FileID, @@ -176,7 +176,6 @@ void html::AddHeaderFooterInternalBuiltinCSS(Rewriter& R, unsigned FileID) { SourceLocation EndLoc = SourceLocation::getFileLoc(FileID, FileEnd-FileStart); // Generate header - R.InsertCStrBefore(StartLoc, "<html>\n<head>\n" "<style type=\"text/css\">\n" @@ -186,6 +185,7 @@ void html::AddHeaderFooterInternalBuiltinCSS(Rewriter& R, unsigned FileID) { " .code { border-spacing:0px; width:100%; }\n" " .code { font-family: \"Andale Mono\", monospace; font-size:10pt }\n" " .code { line-height: 1.2em }\n" + " .comment { color:#A0A0A0 }\n" " .num { width:2.5em; padding-right:2ex; background-color:#eeeeee }\n" " .num { text-align:right; font-size: smaller }\n" " .num { color:#444444 }\n" @@ -217,3 +217,44 @@ void html::AddHeaderFooterInternalBuiltinCSS(Rewriter& R, unsigned FileID) { R.InsertCStrAfter(EndLoc, "</body></html>\n"); } + +/// SyntaxHighlight - Relex the specified FileID and annotate the HTML with +/// information about keywords, macro expansions etc. This uses the macro +/// table state from the end of the file, so it won't be perfectly perfect, +/// but it will be reasonably close. +void html::SyntaxHighlight(Rewriter &R, unsigned FileID, Preprocessor &PP) { + RewriteBuffer &RB = R.getEditBuffer(FileID); + + // Inform the preprocessor that we want to retain comments as tokens, so we + // can highlight them. + PP.SetCommentRetentionState(true, false); + + // Start parsing the specified input file. + PP.EnterMainSourceFile(); + + // Lex all the tokens. + const SourceManager &SourceMgr = PP.getSourceManager(); + Token Tok; + do { + PP.Lex(Tok); + // Ignore tokens whose logical location was not the main file. + SourceLocation LLoc = SourceMgr.getLogicalLoc(Tok.getLocation()); + std::pair<unsigned, unsigned> LLocInfo = + SourceMgr.getDecomposedFileLoc(LLoc); + + if (LLocInfo.first != FileID) + continue; + + unsigned TokOffs = LLocInfo.second; + unsigned TokLen = Tok.getLength(); + switch (Tok.getKind()) { + default: break; + case tok::comment: + RB.InsertTextAfter(TokOffs, "<span class='comment'>", + strlen("<span class='comment'>")); + RB.InsertTextBefore(TokOffs+TokLen, "</span>", strlen("</span>")); + break; + } + + } while (Tok.isNot(tok::eof)); +} |