From 01578153ee8228562d0f64d3847e7fc91573da36 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Wed, 24 May 2023 06:44:35 +0200 Subject: [PATCH] [clang][Diagnostics][NFC] Don't create oversized CaretLine Instead of creating a CaretLine the size of the SourceLine, just leave it empty at first, let HighlightRange resize it to fit all the ~, then resize it to fit the ^. Then we can save ourselves the work to remove the trailing whitespace again. Differential Revision: https://reviews.llvm.org/D151286 --- clang/lib/Frontend/TextDiagnostic.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index 74c555e..d285b88 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -1199,20 +1199,16 @@ void TextDiagnostic::emitSnippetAndCaret( // Build the byte to column map. const SourceColumnMap sourceColMap(SourceLine, DiagOpts->TabStop); - // Create a line for the caret that is filled with spaces that is the same - // number of columns as the line of source code. - std::string CaretLine(sourceColMap.columns(), ' '); - + std::string CaretLine; // Highlight all of the characters covered by Ranges with ~ characters. for (const auto &I : Ranges) highlightRange(I, LineNo, FID, sourceColMap, CaretLine, SM, LangOpts); // Next, insert the caret itself. if (CaretLineNo == LineNo) { - CaretColNo = sourceColMap.byteToContainingColumn(CaretColNo - 1); - if (CaretLine.size() < CaretColNo + 1) - CaretLine.resize(CaretColNo + 1, ' '); - CaretLine[CaretColNo] = '^'; + size_t Col = sourceColMap.byteToContainingColumn(CaretColNo - 1); + CaretLine.resize(std::max(Col + 1, CaretLine.size()), ' '); + CaretLine[Col] = '^'; } std::string FixItInsertionLine = buildFixItInsertionLine( @@ -1234,10 +1230,6 @@ void TextDiagnostic::emitSnippetAndCaret( CaretLine = ' ' + CaretLine; } - // Finally, remove any blank spaces from the end of CaretLine. - while (!CaretLine.empty() && CaretLine[CaretLine.size() - 1] == ' ') - CaretLine.erase(CaretLine.end() - 1); - // Emit what we have computed. emitSnippet(SourceLine, MaxLineNoDisplayWidth, DisplayLineNo); -- 2.7.4