示例#1
0
        /// <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;
        }
示例#2
0
        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);
        }