Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main/src
diff options
context:
space:
mode:
authorMike Krüger <mikkrg@microsoft.com>2018-02-28 16:12:21 +0300
committerMike Krüger <mikkrg@microsoft.com>2018-02-28 16:12:21 +0300
commit23f90dc3f70f83f20ff64a4cf5a822020548f2de (patch)
tree4859b63002fde99a735c582612b5f03a5e02b6b1 /main/src
parent88fb7b541bf2f6ff3dea390c2907fb9121d5c5b0 (diff)
[TextEditor] Optimize diff tracker.
Diff tracker now allocates less objects and uses fewer calls for the tracking.
Diffstat (limited to 'main/src')
-rw-r--r--main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/CompressingTreeList.cs7
-rw-r--r--main/src/core/Mono.TextEditor.Shared/Mono.TextEditor/Document/DiffTracker.cs29
2 files changed, 22 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..aba89cbb72 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,18 @@ 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) {
+ Console.WriteLine ("skip!");
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 +118,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 +131,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);
}
}
}