|
|
|
@ -129,12 +129,12 @@ namespace ICSharpCode.NRefactory.CSharp |
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public void ApplyChanges() |
|
|
|
public void ApplyChanges() |
|
|
|
{ |
|
|
|
{ |
|
|
|
ApplyChanges(0, document.TextLength, document.Replace); |
|
|
|
ApplyChanges(0, document.TextLength, document.Replace, (o, l, v) => document.GetText(o, l) != v); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void ApplyChanges(int startOffset, int length) |
|
|
|
public void ApplyChanges(int startOffset, int length) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ApplyChanges(startOffset, length, document.Replace); |
|
|
|
ApplyChanges(startOffset, length, document.Replace, (o, l, v) => document.GetText(o, l) != v); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
@ -150,11 +150,12 @@ namespace ICSharpCode.NRefactory.CSharp |
|
|
|
ApplyChanges(startOffset, length, script.Replace); |
|
|
|
ApplyChanges(startOffset, length, script.Replace); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void ApplyChanges(int startOffset, int length, Action<int, int, string> documentReplace) |
|
|
|
public void ApplyChanges(int startOffset, int length, Action<int, int, string> documentReplace, Func<int, int, string, bool> filter = null) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int endOffset = startOffset + length; |
|
|
|
int endOffset = startOffset + length; |
|
|
|
TextReplaceAction previousChange = null; |
|
|
|
TextReplaceAction previousChange = null; |
|
|
|
int delta = 0; |
|
|
|
int delta = 0; |
|
|
|
|
|
|
|
var depChanges = new List<TextReplaceAction> (); |
|
|
|
foreach (var change in changes.OrderBy(c => c.Offset)) { |
|
|
|
foreach (var change in changes.OrderBy(c => c.Offset)) { |
|
|
|
if (previousChange != null) { |
|
|
|
if (previousChange != null) { |
|
|
|
if (change.Equals(previousChange)) { |
|
|
|
if (change.Equals(previousChange)) { |
|
|
|
@ -174,16 +175,17 @@ namespace ICSharpCode.NRefactory.CSharp |
|
|
|
} |
|
|
|
} |
|
|
|
previousChange = change; |
|
|
|
previousChange = change; |
|
|
|
|
|
|
|
|
|
|
|
if (change.Offset < startOffset) { |
|
|
|
bool skipChange = change.Offset < startOffset || change.Offset > endOffset; |
|
|
|
// skip all changes in front of the begin offset
|
|
|
|
skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText); |
|
|
|
continue; |
|
|
|
skipChange &= !depChanges.Contains(change); |
|
|
|
} else if (change.Offset > endOffset) { |
|
|
|
|
|
|
|
// skip this change unless it depends on one that we already applied
|
|
|
|
if (!skipChange) { |
|
|
|
continue; |
|
|
|
documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); |
|
|
|
|
|
|
|
delta += change.NewText.Length - change.RemovalLength; |
|
|
|
|
|
|
|
if (change.DependsOn != null) { |
|
|
|
|
|
|
|
depChanges.Add(change.DependsOn); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); |
|
|
|
|
|
|
|
delta += change.NewText.Length - change.RemovalLength; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
changes.Clear(); |
|
|
|
changes.Clear(); |
|
|
|
} |
|
|
|
} |
|
|
|
|