public void UpdateOffsetsAndInvalidate(IEnumerable <DocumentChangeEventArgs> changes) { foreach (DocumentChangeEventArgs change in changes) { // Update offsets of all items segments.UpdateOffsets(change); // Remove any items affected by the change AXmlParser.Log("Changed {0}-{1}", change.Offset, change.Offset + change.InsertionLength); // Removing will cause one of the ends to be set to change.Offset // FindSegmentsContaining includes any segments touching // so that conviniently takes care of the +1 byte var segmentsContainingOffset = segments.FindOverlappingSegments(change.Offset, change.InsertionLength); foreach (AXmlObject obj in segmentsContainingOffset.OfType <AXmlObject>().Where(o => o.IsCached)) { InvalidateCache(obj, false); } foreach (TouchedRange range in segmentsContainingOffset.OfType <TouchedRange>()) { AXmlParser.Log("Found that {0} dependeds on ({1}-{2})", range.TouchedByObject, range.StartOffset, range.EndOffset); InvalidateCache(range.TouchedByObject, true); segments.Remove(range); } } }