/// inserted text at the position.
unsigned getMappedOffset(unsigned OrigOffset,
bool AfterInserts = false) const{
- return Deltas.getDeltaAt(OrigOffset+AfterInserts)+OrigOffset;
+ return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset;
}
- /// AddDelta - When a change is made that shifts around the text buffer, this
- /// method is used to record that info.
- void AddDelta(unsigned OrigOffset, int Change) {
- return Deltas.AddDelta(OrigOffset, Change);
+ /// AddInsertDelta - When an insertion is made at a position, this
+ /// method is used to record that information.
+ void AddInsertDelta(unsigned OrigOffset, int Change) {
+ return Deltas.AddDelta(2*OrigOffset, Change);
+ }
+
+ /// AddReplaceDelta - When a replacement/deletion is made at a position, this
+ /// method is used to record that information.
+ void AddReplaceDelta(unsigned OrigOffset, int Change) {
+ return Deltas.AddDelta(2*OrigOffset+1, Change);
}
};
Buffer.erase(RealOffset, Size);
// Add a delta so that future changes are offset correctly.
- AddDelta(OrigOffset, -Size);
+ AddReplaceDelta(OrigOffset, -Size);
}
void RewriteBuffer::InsertText(unsigned OrigOffset,
Buffer.insert(RealOffset, StrData, StrData+StrLen);
// Add a delta so that future changes are offset correctly.
- AddDelta(OrigOffset, StrLen);
+ AddInsertDelta(OrigOffset, StrLen);
}
/// ReplaceText - This method replaces a range of characters in the input
/// operation.
void RewriteBuffer::ReplaceText(unsigned OrigOffset, unsigned OrigLength,
const char *NewStr, unsigned NewLength) {
- unsigned RealOffset = getMappedOffset(OrigOffset, false);
+ unsigned RealOffset = getMappedOffset(OrigOffset, true);
Buffer.erase(RealOffset, OrigLength);
Buffer.insert(RealOffset, NewStr, NewStr+NewLength);
if (OrigLength != NewLength)
- AddDelta(OrigOffset, NewLength-OrigLength);
+ AddReplaceDelta(OrigOffset, NewLength-OrigLength);
}