Print fix-it hints properly around tabs, from Christian Adåker!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93750 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp
index fcefd4e..83b4542 100644
--- a/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -428,6 +428,42 @@
}
}
}
+ // 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 3fabda7..66685c6 100644
--- a/test/Misc/tabstop.c
+++ b/test/Misc/tabstop.c
@@ -28,3 +28,23 @@
//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: {{^ }} ( )