Beispiel #1
0
        internal TextReplaceAction AddChange(int offset, int removedChars, string insertedText)
        {
            if (offset < 0)
            {
                throw new ArgumentOutOfRangeException("offset", "Should be >= 0");
            }
            if (offset >= document.TextLength)
            {
                throw new ArgumentOutOfRangeException("offset", "Should be < document.TextLength");
            }
            if (removedChars < 0)
            {
                throw new ArgumentOutOfRangeException("removedChars", "Should be >= 0");
            }
            if (removedChars > offset + document.TextLength)
            {
                throw new ArgumentOutOfRangeException("removedChars", "Tried to remove beyond end of text");
            }
            if (removedChars == 0 && string.IsNullOrEmpty(insertedText))
            {
                return(null);
            }
            var action = new TextReplaceAction(offset, removedChars, insertedText);

            changes.Add(action);
            return(action);
        }
            public override bool Equals(object obj)
            {
                TextReplaceAction other = obj as TextReplaceAction;

                if (other == null)
                {
                    return(false);
                }
                return(this.Offset == other.Offset && this.RemovalLength == other.RemovalLength && this.NewText == other.NewText);
            }
Beispiel #3
0
        TextReplaceAction AddChange(int offset, int removedChars, string insertedText)
        {
            if (removedChars == 0 && string.IsNullOrEmpty(insertedText))
            {
                return(null);
            }
            var action = new TextReplaceAction(offset, removedChars, insertedText);

            changes.Add(action);
            return(action);
        }
Beispiel #4
0
        public void ApplyChanges(int startOffset, int length, Action <int, int, string> documentReplace, Func <int, int, string, bool> filter = null)
        {
            int endOffset = startOffset + length;
            TextReplaceAction previousChange = null;
            int delta = 0;

            var depChanges = new List <TextReplaceAction> ();

            changes.Sort(new ReplaceActionComparer());
            foreach (var change in changes)
            {
                if (previousChange != null)
                {
                    if (change.Equals(previousChange))
                    {
                        // ignore duplicate changes
                        continue;
                    }
                    if (change.Offset < previousChange.Offset + previousChange.RemovalLength)
                    {
                        var sb = new StringBuilder();
                                                #if DEBUG
                        sb.AppendLine("change 1:" + change + " at " + document.ToLocation(change.Offset));
                        sb.AppendLine(change.StackTrace);

                        sb.AppendLine("change 2:" + previousChange + " at " + document.ToLocation(previousChange.Offset));
                        sb.AppendLine(previousChange.StackTrace);
                                                #endif
                        sb.AppendLine("Detected overlapping changes " + change + "/" + previousChange);
                        throw new InvalidOperationException(sb.ToString());
                    }
                }
                previousChange = change;

                bool skipChange = change.Offset <startOffset || change.Offset> endOffset;
                skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText);
                skipChange &= !depChanges.Contains(change);

                if (!skipChange)
                {
                    documentReplace(change.Offset + delta, change.RemovalLength, change.NewText);
                    delta += change.NewText.Length - change.RemovalLength;

                    /*if (change.DependsOn != null) {
                     *      depChanges.Add(change.DependsOn);
                     * }*/
                }
            }
            changes.Clear();
        }
        public void ApplyChanges(int startOffset, int length, Action <int, int, string> documentReplace, Func <int, int, string, bool> filter = null)
        {
            int endOffset = startOffset + length;
            //			Console.WriteLine ("apply:"+ startOffset + "->" + endOffset);
            //			Console.WriteLine (document.Text.Substring (0, startOffset) + new string ('x',length) + document.Text.Substring (startOffset+ length));

            TextReplaceAction previousChange = null;
            int delta      = 0;
            var depChanges = new List <TextReplaceAction> ();

            foreach (var change in changes.OrderBy(c => c.Offset))
            {
                if (previousChange != null)
                {
                    if (change.Equals(previousChange))
                    {
                        // ignore duplicate changes
                        continue;
                    }
                    if (change.Offset < previousChange.Offset + previousChange.RemovalLength)
                    {
                        throw new InvalidOperationException("Detected overlapping changes " + change + "/" + previousChange);
                    }
                }
                previousChange = change;
                bool skipChange = change.Offset + change.RemovalLength <startOffset || change.Offset> endOffset;
                skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText);
                skipChange &= !depChanges.Contains(change);
                if (!skipChange)
                {
                    documentReplace(change.Offset + delta, change.RemovalLength, change.NewText);
                    delta += change.NewText.Length - change.RemovalLength;
                    if (change.DependsOn != null)
                    {
                        depChanges.Add(change.DependsOn);
                    }
                }
            }
            changes.Clear();
        }
		TextReplaceAction AddChange(int offset, int removedChars, string insertedText)
		{
			if (removedChars == 0 && string.IsNullOrEmpty (insertedText))
				return null;
			var action = new TextReplaceAction (offset, removedChars, insertedText);
			changes.Add(action);
			return action;
		}