Exemplo n.º 1
0
        /// <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?
            }
        }
Exemplo n.º 2
0
        /// <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))));
        }