diff options
-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); } |