[lldb] Fix offset calculation when printing diagnostics in multiple ranges (#112466)
depends on https://github.com/llvm/llvm-project/pull/112451
This commit is contained in:
@@ -112,17 +112,21 @@ void RenderDiagnosticDetails(Stream &stream,
|
||||
// Print a line with caret indicator(s) below the lldb prompt + command.
|
||||
const size_t padding = *offset_in_command;
|
||||
stream << std::string(padding, ' ');
|
||||
size_t offset = 1;
|
||||
for (const DiagnosticDetail &detail : remaining_details) {
|
||||
auto &loc = *detail.source_location;
|
||||
{
|
||||
size_t x_pos = 1;
|
||||
for (const DiagnosticDetail &detail : remaining_details) {
|
||||
auto &loc = *detail.source_location;
|
||||
|
||||
if (offset > loc.column)
|
||||
continue;
|
||||
if (x_pos > loc.column)
|
||||
continue;
|
||||
|
||||
stream << std::string(loc.column - offset, ' ') << cursor;
|
||||
for (unsigned i = 0; i + 1 < loc.length; ++i)
|
||||
stream << underline;
|
||||
offset = loc.column + 1;
|
||||
stream << std::string(loc.column - x_pos, ' ') << cursor;
|
||||
++x_pos;
|
||||
for (unsigned i = 0; i + 1 < loc.length; ++i) {
|
||||
stream << underline;
|
||||
++x_pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
stream << '\n';
|
||||
|
||||
@@ -134,19 +138,19 @@ void RenderDiagnosticDetails(Stream &stream,
|
||||
// Get the information to print this detail and remove it from the stack.
|
||||
// Print all the lines for all the other messages first.
|
||||
stream << std::string(padding, ' ');
|
||||
size_t offset = 1;
|
||||
size_t x_pos = 1;
|
||||
for (auto &remaining_detail :
|
||||
llvm::ArrayRef(remaining_details).drop_back(1)) {
|
||||
uint16_t column = remaining_detail.source_location->column;
|
||||
if (offset <= column)
|
||||
stream << std::string(column - offset, ' ') << vbar;
|
||||
offset = column + 1;
|
||||
if (x_pos <= column)
|
||||
stream << std::string(column - x_pos, ' ') << vbar;
|
||||
x_pos = column + 1;
|
||||
}
|
||||
|
||||
// Print the line connecting the ^ with the error message.
|
||||
uint16_t column = detail->source_location->column;
|
||||
if (offset <= column)
|
||||
stream << std::string(column - offset, ' ') << joint << hbar << spacer;
|
||||
if (x_pos <= column)
|
||||
stream << std::string(column - x_pos, ' ') << joint << hbar << spacer;
|
||||
|
||||
// Print a colorized string based on the message's severity type.
|
||||
PrintSeverity(stream, detail->severity);
|
||||
|
||||
@@ -57,4 +57,22 @@ TEST_F(ErrorDisplayTest, RenderStatus) {
|
||||
DiagnosticDetail{loc1, eSeverityError, "Y", "Y"}});
|
||||
ASSERT_LT(StringRef(result).find("Y"), StringRef(result).find("X"));
|
||||
}
|
||||
{
|
||||
// Test that range diagnostics are emitted correctly.
|
||||
SourceLocation loc1 = {FileSpec{"a.c"}, 1, 1, 3, false, true};
|
||||
SourceLocation loc2 = {FileSpec{"a.c"}, 1, 5, 3, false, true};
|
||||
std::string result =
|
||||
Render({DiagnosticDetail{loc1, eSeverityError, "X", "X"},
|
||||
DiagnosticDetail{loc2, eSeverityError, "Y", "Y"}});
|
||||
auto lines = StringRef(result).split('\n');
|
||||
auto line1 = lines.first;
|
||||
lines = lines.second.split('\n');
|
||||
auto line2 = lines.first;
|
||||
lines = lines.second.split('\n');
|
||||
auto line3 = lines.first;
|
||||
// 1234567
|
||||
ASSERT_EQ(line1, "^~~ ^~~");
|
||||
ASSERT_EQ(line2, "| error: Y");
|
||||
ASSERT_EQ(line3, "error: X");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user