HashSet<FoldSegment> UpdateFoldSegmentWorker (List<FoldSegment> newSegments, out bool update, CancellationToken token = default(CancellationToken))
{
var oldSegments = new List<FoldSegment> (FoldSegments);
int oldIndex = 0;
bool foldedSegmentAdded = false;
newSegments.Sort ();
var newFoldedSegments = new HashSet<FoldSegment> ();
foreach (FoldSegment newFoldSegment in newSegments) {
if (token.IsCancellationRequested) {
update = false;
return null;
}
int offset = newFoldSegment.Offset;
while (oldIndex < oldSegments.Count && offset > oldSegments [oldIndex].Offset) {
RemoveFolding (oldSegments [oldIndex]);
oldIndex++;
}
if (oldIndex < oldSegments.Count && offset == oldSegments [oldIndex].Offset) {
FoldSegment curSegment = oldSegments [oldIndex];
if (curSegment.IsFolded && newFoldSegment.Length != curSegment.Length)
curSegment.IsFolded = newFoldSegment.IsFolded = false;
curSegment.Length = newFoldSegment.Length;
curSegment.Description = newFoldSegment.Description;
curSegment.EndColumn = curSegment.EndOffset - curSegment.EndLine.Offset + 1;
curSegment.Column = offset - curSegment.StartLine.Offset + 1;
if (newFoldSegment.IsFolded) {
foldedSegmentAdded |= !curSegment.IsFolded;
curSegment.isFolded = true;
}
if (curSegment.isFolded)
newFoldedSegments.Add (curSegment);
oldIndex++;
} else {
DocumentLine startLine = splitter.GetLineByOffset (offset);
DocumentLine endLine = splitter.GetLineByOffset (newFoldSegment.EndOffset);
if (endLine != null)
newFoldSegment.EndColumn = newFoldSegment.EndOffset - endLine.Offset + 1;
if (startLine != null)
newFoldSegment.Column = offset - startLine.Offset + 1;
newFoldSegment.isAttached = true;
foldedSegmentAdded |= newFoldSegment.IsFolded;
if (oldIndex < oldSegments.Count && newFoldSegment.Length == oldSegments [oldIndex].Length) {
newFoldSegment.isFolded = oldSegments [oldIndex].IsFolded;
}
if (newFoldSegment.IsFolded)
newFoldedSegments.Add (newFoldSegment);
foldSegmentTree.Add (newFoldSegment);
}
}
while (oldIndex < oldSegments.Count) {
if (token.IsCancellationRequested) {
update = false;
return null;
}
RemoveFolding (oldSegments [oldIndex]);
oldIndex++;
}
bool countChanged = foldedSegments.Count != newFoldedSegments.Count;
update = foldedSegmentAdded || countChanged;
return newFoldedSegments;
}