aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Rewrite/Rewriter.h16
-rw-r--r--lib/Rewrite/Rewriter.cpp8
-rw-r--r--test/Misc/emit-html-insert.c4
3 files changed, 19 insertions, 9 deletions
diff --git a/include/clang/Rewrite/Rewriter.h b/include/clang/Rewrite/Rewriter.h
index afa018d9cb..c3ee0175c3 100644
--- a/include/clang/Rewrite/Rewriter.h
+++ b/include/clang/Rewrite/Rewriter.h
@@ -102,13 +102,19 @@ private: // Methods only usable by Rewriter.
/// inserted text at the position.
unsigned getMappedOffset(unsigned OrigOffset,
bool AfterInserts = false) const{
- return Deltas.getDeltaAt(OrigOffset+AfterInserts)+OrigOffset;
+ return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset;
}
- /// AddDelta - When a change is made that shifts around the text buffer, this
- /// method is used to record that info.
- void AddDelta(unsigned OrigOffset, int Change) {
- return Deltas.AddDelta(OrigOffset, Change);
+ /// AddInsertDelta - When an insertion is made at a position, this
+ /// method is used to record that information.
+ void AddInsertDelta(unsigned OrigOffset, int Change) {
+ return Deltas.AddDelta(2*OrigOffset, Change);
+ }
+
+ /// AddReplaceDelta - When a replacement/deletion is made at a position, this
+ /// method is used to record that information.
+ void AddReplaceDelta(unsigned OrigOffset, int Change) {
+ return Deltas.AddDelta(2*OrigOffset+1, Change);
}
};
diff --git a/lib/Rewrite/Rewriter.cpp b/lib/Rewrite/Rewriter.cpp
index 805c61baed..d81c38d6a4 100644
--- a/lib/Rewrite/Rewriter.cpp
+++ b/lib/Rewrite/Rewriter.cpp
@@ -31,7 +31,7 @@ void RewriteBuffer::RemoveText(unsigned OrigOffset, unsigned Size) {
Buffer.erase(RealOffset, Size);
// Add a delta so that future changes are offset correctly.
- AddDelta(OrigOffset, -Size);
+ AddReplaceDelta(OrigOffset, -Size);
}
void RewriteBuffer::InsertText(unsigned OrigOffset,
@@ -45,7 +45,7 @@ void RewriteBuffer::InsertText(unsigned OrigOffset,
Buffer.insert(RealOffset, StrData, StrData+StrLen);
// Add a delta so that future changes are offset correctly.
- AddDelta(OrigOffset, StrLen);
+ AddInsertDelta(OrigOffset, StrLen);
}
/// ReplaceText - This method replaces a range of characters in the input
@@ -53,11 +53,11 @@ void RewriteBuffer::InsertText(unsigned OrigOffset,
/// operation.
void RewriteBuffer::ReplaceText(unsigned OrigOffset, unsigned OrigLength,
const char *NewStr, unsigned NewLength) {
- unsigned RealOffset = getMappedOffset(OrigOffset, false);
+ unsigned RealOffset = getMappedOffset(OrigOffset, true);
Buffer.erase(RealOffset, OrigLength);
Buffer.insert(RealOffset, NewStr, NewStr+NewLength);
if (OrigLength != NewLength)
- AddDelta(OrigOffset, NewLength-OrigLength);
+ AddReplaceDelta(OrigOffset, NewLength-OrigLength);
}
diff --git a/test/Misc/emit-html-insert.c b/test/Misc/emit-html-insert.c
new file mode 100644
index 0000000000..ac6b519a3a
--- /dev/null
+++ b/test/Misc/emit-html-insert.c
@@ -0,0 +1,4 @@
+// RUN: clang-cc %s -emit-html -o - | grep ">< 10; }"
+
+int a(int x) { return x
+< 10; }