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:
parent
dbd1c183b0
commit
d8256ed2fe
|
@ -312,4 +312,60 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R, SourceRange Range,
|
||||||
|
|
||||||
R.InsertCStrBefore(LogicalStart, "<span class=\"mrange\">");
|
R.InsertCStrBefore(LogicalStart, "<span class=\"mrange\">");
|
||||||
R.InsertCStrAfter(E, "</span>");
|
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>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue