forked from OSchip/llvm-project
[Basic] getColumnNumber returns location of CR+LF on Windows
When fixing a Clang-Tidy bug in D31406, reuse of FileID enabled the missing highlightRange function. Assertion in highlightRange failed because the end-of-range column number was 2 + the last column of a line on Windows. This fix is required to enable D31406. Differential Revision: https://reviews.llvm.org/D31713 llvm-svn: 299681
This commit is contained in:
parent
71724f642e
commit
a0b99e45e9
|
@ -1136,6 +1136,7 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *Buf = MemBuf->getBufferStart();
|
||||||
// See if we just calculated the line number for this FilePos and can use
|
// See if we just calculated the line number for this FilePos and can use
|
||||||
// that to lookup the start of the line instead of searching for it.
|
// that to lookup the start of the line instead of searching for it.
|
||||||
if (LastLineNoFileIDQuery == FID &&
|
if (LastLineNoFileIDQuery == FID &&
|
||||||
|
@ -1144,11 +1145,19 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,
|
||||||
unsigned *SourceLineCache = LastLineNoContentCache->SourceLineCache;
|
unsigned *SourceLineCache = LastLineNoContentCache->SourceLineCache;
|
||||||
unsigned LineStart = SourceLineCache[LastLineNoResult - 1];
|
unsigned LineStart = SourceLineCache[LastLineNoResult - 1];
|
||||||
unsigned LineEnd = SourceLineCache[LastLineNoResult];
|
unsigned LineEnd = SourceLineCache[LastLineNoResult];
|
||||||
if (FilePos >= LineStart && FilePos < LineEnd)
|
if (FilePos >= LineStart && FilePos < LineEnd) {
|
||||||
|
// LineEnd is the LineStart of the next line.
|
||||||
|
// A line ends with separator LF or CR+LF on Windows.
|
||||||
|
// FilePos might point to the last separator,
|
||||||
|
// but we need a column number at most 1 + the last column.
|
||||||
|
if (FilePos + 1 == LineEnd && FilePos > LineStart) {
|
||||||
|
if (Buf[FilePos - 1] == '\r' || Buf[FilePos - 1] == '\n')
|
||||||
|
--FilePos;
|
||||||
|
}
|
||||||
return FilePos - LineStart + 1;
|
return FilePos - LineStart + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *Buf = MemBuf->getBufferStart();
|
|
||||||
unsigned LineStart = FilePos;
|
unsigned LineStart = FilePos;
|
||||||
while (LineStart && Buf[LineStart-1] != '\n' && Buf[LineStart-1] != '\r')
|
while (LineStart && Buf[LineStart-1] != '\n' && Buf[LineStart-1] != '\r')
|
||||||
--LineStart;
|
--LineStart;
|
||||||
|
|
Loading…
Reference in New Issue