From e44433c29e59a57ef1fac9cd252a2a98a0afb2e7 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 18 Jan 2010 19:28:01 +0000 Subject: [PATCH] =?utf8?q?Print=20fix-it=20hints=20properly=20around=20tab?= =?utf8?q?s,=20from=20Christian=20Ad=C3=A5ker!?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93750 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Frontend/TextDiagnosticPrinter.cpp | 36 ++++++++++++++++++++++++++ test/Misc/tabstop.c | 20 ++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index fcefd4e358..83b4542caa 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -428,6 +428,42 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc, } } } + // Now that we have the entire fixit line, expand the tabs in it. + // Since we don't want to insert spaces in the middle of a word, + // find each word and the column it should line up with and insert + // spaces until they match. + if (!FixItInsertionLine.empty()) { + unsigned FixItPos = 0; + unsigned LinePos = 0; + unsigned TabExpandedCol = 0; + unsigned LineLength = LineEnd - LineStart; + + while (FixItPos < FixItInsertionLine.size() && LinePos < LineLength) { + // Find the next word in the FixIt line. + while (FixItPos < FixItInsertionLine.size() && + FixItInsertionLine[FixItPos] == ' ') + ++FixItPos; + unsigned CharDistance = FixItPos - TabExpandedCol; + + // Walk forward in the source line, keeping track of + // the tab-expanded column. + for (unsigned I = 0; I < CharDistance; ++I, ++LinePos) + if (LinePos >= LineLength || LineStart[LinePos] != '\t') + ++TabExpandedCol; + else + TabExpandedCol = + (TabExpandedCol/DiagOpts->TabStop + 1) * DiagOpts->TabStop; + + // Adjust the fixit line to match this column. + FixItInsertionLine.insert(FixItPos, TabExpandedCol-FixItPos, ' '); + FixItPos = TabExpandedCol; + + // Walk to the end of the word. + while (FixItPos < FixItInsertionLine.size() && + FixItInsertionLine[FixItPos] != ' ') + ++FixItPos; + } + } } // If the source line is too long for our terminal, select only the diff --git a/test/Misc/tabstop.c b/test/Misc/tabstop.c index 3fabda76eb..66685c62d1 100644 --- a/test/Misc/tabstop.c +++ b/test/Misc/tabstop.c @@ -28,3 +28,23 @@ void* d = 1; //CHECK-5: {{^ void\* b = 1;}} //CHECK-5: {{^ void\* c = 1;}} //CHECK-5: {{^void\* d = 1;}} + +// Test code modification hints + +void f(void) +{ + if (0 & 1 == 1) + {} +} + +// CHECK-3: {{^ }}if (0 & 1 == 1) +// CHECK-3: {{^ }} ( ) +// CHECK-3: {{^ }} ( ) + +// CHECK-4: {{^ }}if (0 & 1 == 1) +// CHECK-4: {{^ }} ( ) +// CHECK-4: {{^ }} ( ) + +// CHECK-5: {{^ }}if (0 & 1 == 1) +// CHECK-5: {{^ }} ( ) +// CHECK-5: {{^ }} ( ) -- 2.40.0