mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[NFC] Refactor some SourceMgr code
This commit is contained in:
parent
3f4cf6da80
commit
72df03bec7
@ -267,7 +267,7 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
|
||||
SmallVector<std::pair<unsigned, unsigned>, 4> ColRanges;
|
||||
std::pair<unsigned, unsigned> LineAndCol;
|
||||
StringRef BufferID = "<unknown>";
|
||||
std::string LineStr;
|
||||
StringRef LineStr;
|
||||
|
||||
if (Loc.isValid()) {
|
||||
unsigned CurBuf = FindBufferContainingLoc(Loc);
|
||||
@ -288,7 +288,7 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
|
||||
const char *BufEnd = CurMB->getBufferEnd();
|
||||
while (LineEnd != BufEnd && LineEnd[0] != '\n' && LineEnd[0] != '\r')
|
||||
++LineEnd;
|
||||
LineStr = std::string(LineStart, LineEnd);
|
||||
LineStr = StringRef(LineStart, LineEnd - LineStart);
|
||||
|
||||
// Convert any ranges to column ranges that only intersect the line of the
|
||||
// location.
|
||||
@ -370,8 +370,8 @@ SMDiagnostic::SMDiagnostic(const SourceMgr &sm, SMLoc L, StringRef FN, int Line,
|
||||
ArrayRef<std::pair<unsigned, unsigned>> Ranges,
|
||||
ArrayRef<SMFixIt> Hints)
|
||||
: SM(&sm), Loc(L), Filename(std::string(FN)), LineNo(Line), ColumnNo(Col),
|
||||
Kind(Kind), Message(std::string(Msg)), LineContents(std::string(LineStr)),
|
||||
Ranges(Ranges.vec()), FixIts(Hints.begin(), Hints.end()) {
|
||||
Kind(Kind), Message(Msg), LineContents(LineStr), Ranges(Ranges.vec()),
|
||||
FixIts(Hints.begin(), Hints.end()) {
|
||||
llvm::sort(FixIts);
|
||||
}
|
||||
|
||||
@ -386,13 +386,12 @@ static void buildFixItLine(std::string &CaretLine, std::string &FixItLine,
|
||||
|
||||
size_t PrevHintEndCol = 0;
|
||||
|
||||
for (ArrayRef<SMFixIt>::iterator I = FixIts.begin(), E = FixIts.end(); I != E;
|
||||
++I) {
|
||||
for (const llvm::SMFixIt &Fixit : FixIts) {
|
||||
// If the fixit contains a newline or tab, ignore it.
|
||||
if (I->getText().find_first_of("\n\r\t") != StringRef::npos)
|
||||
if (Fixit.getText().find_first_of("\n\r\t") != StringRef::npos)
|
||||
continue;
|
||||
|
||||
SMRange R = I->getRange();
|
||||
SMRange R = Fixit.getRange();
|
||||
|
||||
// If the line doesn't contain any part of the range, then ignore it.
|
||||
if (R.Start.getPointer() > LineEnd || R.End.getPointer() < LineStart)
|
||||
@ -421,16 +420,15 @@ static void buildFixItLine(std::string &CaretLine, std::string &FixItLine,
|
||||
// FIXME: This assertion is intended to catch unintended use of multibyte
|
||||
// characters in fixits. If we decide to do this, we'll have to track
|
||||
// separate byte widths for the source and fixit lines.
|
||||
assert((size_t)sys::locale::columnWidth(I->getText()) ==
|
||||
I->getText().size());
|
||||
assert((size_t)sys::locale::columnWidth(Fixit.getText()) ==
|
||||
Fixit.getText().size());
|
||||
|
||||
// This relies on one byte per column in our fixit hints.
|
||||
unsigned LastColumnModified = HintCol + I->getText().size();
|
||||
unsigned LastColumnModified = HintCol + Fixit.getText().size();
|
||||
if (LastColumnModified > FixItLine.size())
|
||||
FixItLine.resize(LastColumnModified, ' ');
|
||||
|
||||
std::copy(I->getText().begin(), I->getText().end(),
|
||||
FixItLine.begin() + HintCol);
|
||||
llvm::copy(Fixit.getText(), FixItLine.begin() + HintCol);
|
||||
|
||||
PrevHintEndCol = LastColumnModified;
|
||||
|
||||
@ -534,11 +532,9 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &OS, bool ShowColors,
|
||||
std::string CaretLine(NumColumns + 1, ' ');
|
||||
|
||||
// Expand any ranges.
|
||||
for (unsigned r = 0, e = Ranges.size(); r != e; ++r) {
|
||||
std::pair<unsigned, unsigned> R = Ranges[r];
|
||||
for (const std::pair<unsigned, unsigned> &R : Ranges)
|
||||
std::fill(&CaretLine[R.first],
|
||||
&CaretLine[std::min((size_t)R.second, CaretLine.size())], '~');
|
||||
}
|
||||
|
||||
// Add any fix-its.
|
||||
// FIXME: Find the beginning of the line properly for multibyte characters.
|
||||
|
Loading…
Reference in New Issue
Block a user