From: Chris Lattner Date: Sat, 13 Oct 2007 00:46:29 +0000 (+0000) Subject: haha, my devious plot is complete: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=57c337d9ab32b84eb6a2a1fb83822660e4cdd285;p=clang 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 --- 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); }