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 | |
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
-rw-r--r-- | Driver/RewriteTest.cpp | 2 | ||||
-rw-r--r-- | Rewrite/Rewriter.cpp | 25 |
2 files changed, 18 insertions, 9 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index a8d658e237..103610248a 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -78,7 +78,7 @@ RewriteTest::~RewriteTest() { SourceLocation::getFileLoc(MainFileID, BufPtr-MainBufStart); // Rewrite the single tab character into a sequence of spaces. - Rewrite.ReplaceText(TabLoc, 1, "xxxxxxxxxxx", Spaces); + Rewrite.ReplaceText(TabLoc, 1, " ", Spaces); } // Get the buffer corresponding to MainFileID. If we haven't changed it, then 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); } |