/// <summary> /// Initializes a new instance of a <see cref="TextVersion"/>. /// </summary> /// <param name="textBuffer">The <see cref="ITextBuffer"/> to which the version belongs.</param> /// <param name="imageVersion">The <see cref="ITextImageVersion"/> of the associated snapshot.</param> public TextVersion(ITextBuffer textBuffer, TextImageVersion imageVersion) { if (textBuffer == null) { throw new ArgumentNullException(nameof(textBuffer)); } if (imageVersion == null) { throw new ArgumentNullException(nameof(imageVersion)); } this.TextBuffer = textBuffer; _textImageVersion = imageVersion; }
internal TextImageVersion CreateNext(int reiteratedVersionNumber, int length, INormalizedTextChangeCollection changes) { int newVersionNumber = this.VersionNumber + 1; if (reiteratedVersionNumber < 0) { // If there are no changes (e.g. readonly region edit or content type change), then // we consider this a reiteration of the current version. changes can be null in the special case // of doing a reload (at which point the reload code will call SetChanges after computing the diff). reiteratedVersionNumber = ((changes != null) && (changes.Count == 0)) ? this.ReiteratedVersionNumber : newVersionNumber; } else if (reiteratedVersionNumber > newVersionNumber) { throw new ArgumentOutOfRangeException(nameof(reiteratedVersionNumber)); } if (length == -1) { length = this.Length; int changeCount = changes.Count; for (int c = 0; c < changeCount; ++c) { length += changes[c].Delta; } } var newVersion = new TextImageVersion(newVersionNumber, reiteratedVersionNumber, length, this.Identifier); // Arguably this should happen as an atomic operation but it is unlikely to cause a race condition // because, in general, people won't even be looking at these properties until they get a change event // (which happens after everything has been set). this.SetChanges(changes); this.Next = newVersion; return(newVersion); }