/// <summary> /// Processes the insert change for Type II backtracking detection. /// </summary> /// <param name="anEvent">An event.</param> /// <param name="offset">The offset.</param> /// <param name="insertedText">The inserted text.</param> /// <param name="logProvider">The log provider.</param> private void ProcessInsertType2(Event anEvent, int offset, string insertedText, ILogProvider logProvider) { // Do nothing if the insertion happened with a paste command. if (logProvider.CausedByPaste(anEvent)) { return; } if (logProvider.CausedByAutoFormatting(anEvent)) { return; } // See if there is are any previous deletions that contains this insertedText. foreach (var delete in this.DeleteSegments) { if (delete.Text.Contains(insertedText.Trim())) { if (this.FilterType2Backtracking(delete, insertedText)) { var desc = string.Format( "Type2 [{2} -> {3}]: \"{0}\" - \"{1}\"", delete.Text, insertedText, delete.Event.ID, anEvent.ID); var instance = new Type2BacktrackingPatternInstance( delete.Event, anEvent, desc); this.Patterns.Add(instance); } } // TODO Maybe consider very similar piece of code? } }
/// <summary> /// Processes the delete change for Type I backtracking detection. /// </summary> /// <param name="anEvent">An event.</param> /// <param name="offset">The offset.</param> /// <param name="length">The length.</param> /// <param name="deletedText">The deleted text.</param> /// <param name="logProvider">The log provider.</param> private void ProcessDeleteType1(Event anEvent, int offset, int length, string deletedText, ILogProvider logProvider) { if (logProvider.CausedByAutoFormatting(anEvent)) { return; } int endOffset = offset + length; // Iterate the segments list var list = this.InsertSegments[this.CurrentFile]; var detectedInserts = new List <Tuple <InsertSegment, string> >(); for (int i = 0; i < list.Count; ++i) { if (endOffset <= list[i].Offset) { list[i].Offset -= length; } else if (offset <= list[i].Offset && list[i].Offset < endOffset && endOffset < list[i].EndOffset) { detectedInserts.Add( Tuple.Create( list[i], list[i].Text.Substring(0, endOffset - list[i].Offset))); list.Insert(i + 1, list[i].Split(endOffset)); list.RemoveAt(i); --i; } else if (offset <= list[i].Offset && list[i].EndOffset <= endOffset) { detectedInserts.Add( Tuple.Create( list[i], list[i].Text)); list.RemoveAt(i); --i; } else if (list[i].Offset < offset && offset < list[i].EndOffset) { list.Insert(i + 1, list[i].Split(offset)); } else if (list[i].EndOffset <= offset) { // Do nothing. } else { Debug.Assert(false, "Invalid control flow"); } } // Add Type1 backtracking instances. this.Patterns.AddRange( detectedInserts .OrderByDescending(x => x.Item2.Length) .GroupBy(x => x.Item1.Event.ID) .OrderBy(x => x.Key) .Select(grp => grp.First()) .Where(x => this.FilterType1Backtracking(x.Item1, x.Item2)) .Select(x => new Type1BacktrackingPatternInstance( x.Item1.Event, anEvent, string.Format("Type1 [{2} -> {3}]: \"{0}\" - \"{1}\"", x.Item1.Text, x.Item2, x.Item1.Event.ID, anEvent.ID)))); }