SMDiagnostic: don't emit ranges if there are /any/ multibyte characters.

Right now, only OS X has a way to determine the column width of a string
(PR14910). Until we have a good way to deal with this, we just won't
print carets, source ranges, or fixits for SMDiagnostic if the source line
has multibyte characters in it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172164 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jordan Rose 2013-01-11 02:37:55 +00:00
parent a7aec400a7
commit 9b1e854698

View File

@ -336,6 +336,10 @@ static void printSourceLine(raw_ostream &S, StringRef LineContents) {
S << '\n';
}
static bool isNonASCII(char c) {
return c & 0x80;
}
void SMDiagnostic::print(const char *ProgName, raw_ostream &S,
bool ShowColors) const {
// Display colors only if OS supports colors.
@ -392,18 +396,17 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S,
if (LineNo == -1 || ColumnNo == -1)
return;
// FIXME: If there are multibyte characters in the source, all our ranges will
// be wrong. To do this properly, we'll need a byte-to-column map like Clang's
// TextDiagnostic. For now, we'll just handle tabs by expanding them later,
// and bail out rather than show incorrect ranges and misaligned fixits for
// any other odd characters.
SmallString<128> PrintableLine(LineContents);
std::replace(PrintableLine.begin(), PrintableLine.end(), '\t', ' ');
size_t NumColumns = (size_t)llvm::sys::locale::columnWidth(PrintableLine);
if (NumColumns != PrintableLine.size()) {
// FIXME: If there are multibyte or multi-column characters in the source, all
// our ranges will be wrong. To do this properly, we'll need a byte-to-column
// map like Clang's TextDiagnostic. For now, we'll just handle tabs by
// expanding them later, and bail out rather than show incorrect ranges and
// misaligned fixits for any other odd characters.
if (std::find_if(LineContents.begin(), LineContents.end(), isNonASCII) !=
LineContents.end()) {
printSourceLine(S, LineContents);
return;
}
size_t NumColumns = LineContents.size();
// Build the line with the caret and ranges.
std::string CaretLine(NumColumns+1, ' ');