diff options
author | Chris Lattner <sabre@nondot.org> | 2007-10-13 00:46:29 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-10-13 00:46:29 +0000 |
commit | 57c337d9ab32b84eb6a2a1fb83822660e4cdd285 (patch) | |
tree | 527e3686b94428a9c777d4f2ba6ff256a3fba7b3 /Rewrite/Rewriter.cpp | |
parent | fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206a (diff) |
haha, my devious plot is complete:
$ clang rewrite.c -rewrite-test
prints:
int foo() {
b: foo();
f: foo();
foo();
}
for:
int foo() {
b: foo();
f: foo();
foo();
}
amazing.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42944 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Rewrite/Rewriter.cpp')
-rw-r--r-- | Rewrite/Rewriter.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/Rewrite/Rewriter.cpp b/Rewrite/Rewriter.cpp index 41c5c6ff3f..5f935c3281 100644 --- a/Rewrite/Rewriter.cpp +++ b/Rewrite/Rewriter.cpp @@ -114,17 +114,26 @@ void RewriteBuffer::InsertText(unsigned OrigOffset, /// operation. void RewriteBuffer::ReplaceText(unsigned OrigOffset, unsigned OrigLength, const char *NewStr, unsigned NewLength) { - InsertText(OrigOffset, NewStr, NewLength); - return; + unsigned RealOffset = getMappedOffset(OrigOffset); + assert(RealOffset+OrigLength <= Buffer.size() && "Invalid location"); + + // Overwrite the common piece. + memcpy(&Buffer[RealOffset], NewStr, std::min(OrigLength, NewLength)); - unsigned MappedOffs = getMappedOffset(OrigOffset); - // TODO: FIXME location. - assert(OrigOffset+OrigLength <= Buffer.size() && "Invalid location"); - if (OrigLength == NewLength) { - // If replacing without shifting around, just overwrite the text. - memcpy(&Buffer[OrigOffset], NewStr, NewLength); + // If replacing without shifting around, just overwrite the text. + if (OrigLength == NewLength) return; + + // If inserting more than existed before, this is like an insertion. + if (NewLength > OrigLength) { + Buffer.insert(Buffer.begin()+RealOffset+OrigLength, + NewStr+OrigLength, NewStr+NewLength); + } else { + // If insertion less than existed before, this is like a removal. + Buffer.erase(Buffer.begin()+RealOffset+NewLength, + Buffer.begin()+RealOffset+OrigLength); } + AddDelta(OrigOffset, NewLength-OrigLength); } |