Browse Source

Fixed ast formatter.

newNRvisualizers
mike 14 years ago
parent
commit
d07356a544
  1. 26
      ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs

26
ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs

@ -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();
} }

Loading…
Cancel
Save