aboutsummaryrefslogtreecommitdiff
path: root/Rewrite/Rewriter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-10-13 00:46:29 +0000
committerChris Lattner <sabre@nondot.org>2007-10-13 00:46:29 +0000
commit57c337d9ab32b84eb6a2a1fb83822660e4cdd285 (patch)
tree527e3686b94428a9c777d4f2ba6ff256a3fba7b3 /Rewrite/Rewriter.cpp
parentfb5e5ba3c7708f3aef4db0ed30e8470b3ed4206a (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.cpp25
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);
}