diff options
-rw-r--r-- | include/clang/Rewrite/Rewriter.h | 16 | ||||
-rw-r--r-- | lib/Rewrite/Rewriter.cpp | 8 | ||||
-rw-r--r-- | test/Misc/emit-html-insert.c | 4 |
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; } |