diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2018-03-01 09:48:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-01 09:48:15 +0300 |
commit | aff7560952c372ca6514752533b201bf2eb348e8 (patch) | |
tree | dd42acb5be97dfd5a6f8d3e5c21c36cbbfbe1306 /main/src | |
parent | 86f9f98784f54bd6f44d84d07313ba429797053b (diff) | |
parent | 07a592c7412748a111bdf50500d13b2c94e6f650 (diff) |
Merge pull request #3991 from mono/master-optimizedifftracker
Master optimizedifftracker
Diffstat (limited to 'main/src')
-rw-r--r-- | main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs | 7 | ||||
-rw-r--r-- | main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs | 28 |
2 files changed, 21 insertions, 14 deletions
diff --git a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs index 4c86cc3fdf..60a86146a0 100644 --- a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs +++ b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs @@ -37,7 +37,7 @@ namespace Mono.TextEditor.Utils internal class CompressingNode : IRedBlackTreeNode { - internal readonly T value; + internal T value; internal int count, totalCount; public CompressingNode (T value, int count) @@ -311,8 +311,11 @@ namespace Mono.TextEditor.Utils return GetNode (ref index).value; } set { - if (index < Count) + if (index < Count) { RemoveAt (index); + } else { + InsertRange (Count, index - Count, default (T)); + } Insert (index, value); } } diff --git a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs index d35ced6951..ce941d0eee 100644 --- a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs +++ b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs @@ -33,9 +33,13 @@ namespace Mono.TextEditor { class LineChangeInfo { + internal readonly static LineChangeInfo Unchanged = new LineChangeInfo (TextDocument.LineState.Unchanged); + internal readonly static LineChangeInfo Dirty = new LineChangeInfo (TextDocument.LineState.Dirty); + internal readonly static LineChangeInfo Changed = new LineChangeInfo (TextDocument.LineState.Changed); + public Mono.TextEditor.TextDocument.LineState state; - public LineChangeInfo (Mono.TextEditor.TextDocument.LineState state) + LineChangeInfo (Mono.TextEditor.TextDocument.LineState state) { this.state = state; } @@ -91,17 +95,17 @@ namespace Mono.TextEditor var startLine = trackDocument.GetLineByOffset (change.NewOffset); var endLine = trackDocument.GetLineByOffset (change.NewOffset + change.InsertionLength); var lineNumber = startLine.LineNumber; - var oldState = lineNumber < lineStates.Count ? lineStates [lineNumber] : null; - if (oldState != null && oldState.state == TextDocument.LineState.Dirty) + var insertedLines = endLine.LineNumber - lineNumber + 1; + var oldState = lineNumber < lineStates.Count && insertedLines == 1 ? lineStates [lineNumber] : null; + if (oldState != null && oldState.state == TextDocument.LineState.Dirty) { continue; - var insertedLines = endLine.LineNumber - lineNumber; + } try { - lineStates [lineNumber] = new LineChangeInfo (Mono.TextEditor.TextDocument.LineState.Dirty); + if (lineStates.Count < lineNumber + insertedLines) + lineStates.InsertRange (lineStates.Count, lineNumber + insertedLines - lineStates.Count, LineChangeInfo.Unchanged); + lineStates.SetRange (lineNumber, insertedLines, LineChangeInfo.Dirty); if (trackDocument != null) - trackDocument.CommitLineUpdate (lineNumber); - while (insertedLines-- > 0) { - lineStates.Insert (lineNumber, new LineChangeInfo (Mono.TextEditor.TextDocument.LineState.Dirty)); - } + trackDocument.CommitMultipleLineUpdate (lineNumber, lineNumber + insertedLines); } catch (Exception ex) { Console.WriteLine ("error while DiffTracker.TrackDocument_TextChanged:" + ex); } @@ -113,11 +117,11 @@ namespace Mono.TextEditor if (lineStates != null) { foreach (var node in lineStates.tree) { if (node.value.state == Mono.TextEditor.TextDocument.LineState.Dirty) - node.value.state = Mono.TextEditor.TextDocument.LineState.Changed; + node.value = LineChangeInfo.Changed; } } else { lineStates = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y)); - lineStates.InsertRange(0, document.LineCount + 1, new LineChangeInfo (Mono.TextEditor.TextDocument.LineState.Unchanged)); + lineStates.InsertRange (0, document.LineCount + 1, LineChangeInfo.Unchanged); trackDocument.TextChanging += TrackDocument_TextChanging; trackDocument.TextChanged += TrackDocument_TextChanged; } @@ -126,7 +130,7 @@ namespace Mono.TextEditor public void Reset () { lineStates = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y)); - lineStates.InsertRange(0, trackDocument.LineCount + 1, new LineChangeInfo (Mono.TextEditor.TextDocument.LineState.Unchanged)); + lineStates.InsertRange(0, trackDocument.LineCount + 1, LineChangeInfo.Unchanged); } } } |