[cfe-commits] r48512 - in /cfe/trunk: Driver/HTMLPrint.cpp include/clang/Rewrite/HTMLRewrite.h lib/Rewrite/HTMLRewrite.cpp

Ted Kremenek kremenek at apple.com
Tue Mar 18 16:08:52 PDT 2008


Author: kremenek
Date: Tue Mar 18 18:08:51 2008
New Revision: 48512

URL: http://llvm.org/viewvc/llvm-project?rev=48512&view=rev
Log:
Some cleanups to the HTMLRewrite API. Added support for printing out line
numbers (more work to be done on aesthetics).

Modified:
    cfe/trunk/Driver/HTMLPrint.cpp
    cfe/trunk/include/clang/Rewrite/HTMLRewrite.h
    cfe/trunk/lib/Rewrite/HTMLRewrite.cpp

Modified: cfe/trunk/Driver/HTMLPrint.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/HTMLPrint.cpp?rev=48512&r1=48511&r2=48512&view=diff

==============================================================================
--- cfe/trunk/Driver/HTMLPrint.cpp (original)
+++ cfe/trunk/Driver/HTMLPrint.cpp Tue Mar 18 18:08:51 2008
@@ -49,9 +49,10 @@
   
   html::EscapeText(R, FileID);
   html::AddLineNumbers(R, FileID);
-//  html::InsertTag(R, html::HEAD, StartLoc, EndLoc, true);  
-//  html::InsertTag(R, html::BODY, StartLoc, EndLoc, true);
-//  html::InsertTag(R, html::PRE, StartLoc, EndLoc);
+  html::InsertTag(R, html::PRE, StartLoc, EndLoc, 0, 0, true);
+  html::InsertTag(R, html::BODY, StartLoc, EndLoc, NULL, "\n", true);
+  html::InsertTag(R, html::HEAD, StartLoc, StartLoc, 0, 0, true);
+  html::InsertTag(R, html::HTML, StartLoc, EndLoc, NULL, "\n", true);
   
   // Emit the HTML.
   

Modified: cfe/trunk/include/clang/Rewrite/HTMLRewrite.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Rewrite/HTMLRewrite.h?rev=48512&r1=48511&r2=48512&view=diff

==============================================================================
--- cfe/trunk/include/clang/Rewrite/HTMLRewrite.h (original)
+++ cfe/trunk/include/clang/Rewrite/HTMLRewrite.h Tue Mar 18 18:08:51 2008
@@ -23,14 +23,26 @@
   
 namespace html {
   
-  enum Tags { PRE, HEAD, BODY };
+  // Basic operations.
+  
+  enum Tags { BODY,
+              DIV,
+              HEAD,
+              HTML,
+              PRE,
+              SPAN };
   
   void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false);
 
   void InsertTag(Rewriter& R, Tags tag,
                  SourceLocation OpenLoc, SourceLocation CloseLoc,
-                 bool NewlineOpen = false, bool NewlineClose = true,
-                 bool OutermostTag = false);
+                 const char* Attributes = NULL, const char* Content = NULL,
+                 bool Newline = false,
+                 bool OpenInsertBefore = true, bool CloseInsertAfter = true);
+  
+  // High-level operations.
+  
+  void AddLineNumbers(Rewriter& R, unsigned FileID);  
 
 } // end html namespace
 } // end clang namespace

Modified: cfe/trunk/lib/Rewrite/HTMLRewrite.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/HTMLRewrite.cpp?rev=48512&r1=48511&r2=48512&view=diff

==============================================================================
--- cfe/trunk/lib/Rewrite/HTMLRewrite.cpp (original)
+++ cfe/trunk/lib/Rewrite/HTMLRewrite.cpp Tue Mar 18 18:08:51 2008
@@ -20,6 +20,10 @@
 
 using namespace clang;
 
+//===----------------------------------------------------------------------===//
+// Basic operations.
+//===----------------------------------------------------------------------===//
+
 void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) {
   
   const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID);
@@ -46,46 +50,124 @@
   }
 }
 
+
+static void TagOpen(std::ostringstream& os, const char* TagStr,
+                    const char* Attr, const char* Content) {
+  
+  os << '<' << TagStr;
+  if (Attr) os << ' ' << Attr;
+  os << '>';
+  if (Content) os << Content;
+}
+
+static void TagClose(std::ostringstream& os, const char* TagStr) {
+  os << "</" << TagStr << ">";
+}
+
 void html::InsertTag(Rewriter& R, html::Tags tag,
                      SourceLocation B, SourceLocation E,
-                     bool NewlineOpen, bool NewlineClose, bool OutermostTag) {
+                     const char* Attributes,
+                     const char* Content, bool Newline,
+                     bool OpenInsertBefore, bool CloseInsertAfter) {
   
   const char* TagStr = 0;
   
   switch (tag) {
     default: break;      
-    case PRE: TagStr = "pre"; break;
-    case HEAD: TagStr = "head"; break;
     case BODY: TagStr = "body"; break;
+    case DIV:  TagStr = "div";  break;
+    case HEAD: TagStr = "head"; break;
+    case HTML: TagStr = "html"; break;
+    case PRE:  TagStr = "pre";  break;
+    case SPAN: TagStr = "span"; break;
   }
   
   assert (TagStr && "Tag not supported.");
 
-  { // Generate the opening tag.
-    std::ostringstream os;  
-    os << '<' << TagStr << '>';
-    if (NewlineOpen) os << '\n';
-    
-    const char* s = os.str().c_str();
-    unsigned n = os.str().size();
+  // Generate the opening tag.  We also generate the closing
+  // tag of the start and end SourceLocations are the same.
+
+  { 
+    std::ostringstream os;
+    TagOpen(os, TagStr, Attributes, Content);
+    if (B == E)  {
+      TagClose(os, TagStr);
+      if (Newline) os << '\n';
+    }
     
-    if (OutermostTag)
-      R.InsertTextBefore(B, s, n);
+    if (OpenInsertBefore)    
+      R.InsertTextBefore(B, os.str().c_str(), os.str().size());
     else
-      R.InsertTextAfter(B, s, n);
+      R.InsertTextAfter(B, os.str().c_str(), os.str().size());
   }
   
-  { // Generate the closing tag.
-    std::ostringstream os;  
-    os << "</" << TagStr << '>';
-    if (NewlineClose) os << '\n';
-    
-    const char* s = os.str().c_str();
-    unsigned n = os.str().size();
+  // Generate the closing tag if the start and end SourceLocations
+  // are different.
+  
+  if (B != E) {
+    std::ostringstream os;
+    TagClose(os, TagStr);
+    if (Newline) os << '\n';
     
-    if (OutermostTag)
-      R.InsertTextAfter(E, s, n);
+    if (CloseInsertAfter)    
+      R.InsertTextAfter(E, os.str().c_str(), os.str().size());
     else
-      R.InsertTextBefore(E, s, n);
+      R.InsertTextBefore(E, os.str().c_str(), os.str().size());
   }
 }
+
+//===----------------------------------------------------------------------===//
+// High-level operations.
+//===----------------------------------------------------------------------===//
+
+static void AddLineNumber(Rewriter& R, unsigned LineNo,
+                          SourceLocation B, SourceLocation E) {
+  
+  // Add two "div" tags: one to contain the line number, and the other
+  // to contain the content of the line.
+
+  std::ostringstream os;
+  os << LineNo;
+  html::InsertTag(R, html::SPAN, B, E, "class=Line");  
+  html::InsertTag(R, html::SPAN, B, B, "class=Num", os.str().c_str());  
+}
+
+void html::AddLineNumbers(Rewriter& R, unsigned FileID) {
+
+  const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID);
+  const char* FileBeg = Buf->getBufferStart();
+  const char* FileEnd = Buf->getBufferEnd();
+  const char* C = FileBeg;
+  
+  assert (C <= FileEnd);
+  
+  unsigned LineNo = 0;
+  unsigned FilePos = 0;
+  
+  while (C != FileEnd) {    
+    
+    ++LineNo;
+    unsigned LineStartPos = FilePos;
+    unsigned LineEndPos = FileEnd - FileBeg;
+    
+    assert (FilePos <= LineEndPos);
+    assert (C < FileEnd);
+    
+    // Scan until the newline (or end-of-file).
+    
+    for ( ; C != FileEnd ; ++C, ++FilePos)
+      if (*C == '\n') {
+        LineEndPos = FilePos;
+        break;
+      }
+    
+    AddLineNumber(R, LineNo,
+                  SourceLocation::getFileLoc(FileID, LineStartPos),
+                  SourceLocation::getFileLoc(FileID, LineEndPos));
+    
+    if (C != FileEnd) {
+      ++C;
+      ++FilePos;
+    }      
+  }    
+}





More information about the cfe-commits mailing list