diff --git a/clang/include/clang/Rewrite/Rewriter.h b/clang/include/clang/Rewrite/Rewriter.h index afa018d9cb01..c3ee0175c36f 100644 --- a/clang/include/clang/Rewrite/Rewriter.h +++ b/clang/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/clang/lib/Rewrite/Rewriter.cpp b/clang/lib/Rewrite/Rewriter.cpp index 805c61baed03..d81c38d6a466 100644 --- a/clang/lib/Rewrite/Rewriter.cpp +++ b/clang/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/clang/test/Misc/emit-html-insert.c b/clang/test/Misc/emit-html-insert.c new file mode 100644 index 000000000000..ac6b519a3a0d --- /dev/null +++ b/clang/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; }