]> granicus.if.org Git - clang/commitdiff
Improve range highlighting in HTMLDiagnostic to correctly highlight ranges
authorTed Kremenek <kremenek@apple.com>
Tue, 8 Apr 2008 21:29:14 +0000 (21:29 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 8 Apr 2008 21:29:14 +0000 (21:29 +0000)
that span multiple lines by inserting multiple "</span>" and "<span>" tags.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49403 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/HTMLDiagnostics.cpp

index 8c89e6270a83797ac052a3f616a045c5b94cf295..870628963aa5384b996914d083b65a5135d25853 100644 (file)
@@ -312,4 +312,60 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R, SourceRange Range,
   
   R.InsertCStrBefore(LogicalStart, "<span class=\"mrange\">");
   R.InsertCStrAfter(E, "</span>");
+  
+  if (EndLineNo == StartLineNo)
+    return;
+  
+  // Add in </span><span> tags for intermediate lines.
+  
+  const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(MainFileID);
+
+  unsigned Pos = SourceMgr.getFullFilePos(LogicalStart);
+  unsigned EndPos = SourceMgr.getFullFilePos(E);  
+  const char* buf = Buf->getBufferStart();
+  
+  for (; Pos != EndPos; ++Pos) {
+    
+    SourceLocation L = SourceLocation::getFileLoc(MainFileID, Pos);
+    unsigned Col = SourceMgr.getColumnNumber(L);
+    
+    if (Col == 1) {
+      
+      // Start if a new line.  Scan to see if we hit anything that is not
+      // whitespace or a newline.
+      
+      unsigned PosTmp = Pos;
+      bool NewLine = false;
+      
+      for ( ; PosTmp != EndPos ; ++PosTmp) {
+        switch (buf[PosTmp]) {
+          case ' ':
+          case '\t': continue;
+          case '\n':
+            NewLine = true;
+            break;
+          default:
+            break;
+        }
+        
+        break;
+      }
+      
+      if (PosTmp == EndPos)
+        break;
+      
+      Pos = PosTmp;
+
+      // Don't highlight a blank line.
+      if (NewLine)
+        continue;
+      
+      // This line contains text that we should highlight.
+      // Ignore leading whitespace.
+      L = SourceLocation::getFileLoc(MainFileID, Pos);
+      R.InsertCStrAfter(L, "<span class=\"mrange\">");
+    }
+    else if (buf[Pos] == '\n')
+      R.InsertCStrBefore(L, "</span>");
+  }
 }