Improve range highlighting in HTMLDiagnostic to correctly highlight ranges

that span multiple lines by inserting multiple "</span>" and "<span>" tags.

llvm-svn: 49403
This commit is contained in:
Ted Kremenek 2008-04-08 21:29:14 +00:00
parent dbd1c183b0
commit d8256ed2fe
1 changed files with 56 additions and 0 deletions

View 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>");
}
}