diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2012-06-13 12:12:49 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2012-06-13 12:14:44 +0400 |
commit | 83c58f371d0b3f36a780ca017cb00f9c6ad1bbba (patch) | |
tree | 3677162b6a68ebecf0f9571c6e67a3f3e4b58cb1 | |
parent | 1b6ffb8235519a006d51afd98014ad20186cfd1b (diff) |
Fixed 'Bug 5578 - Monodevelop 2.10.8.1 on Ubuntu 12.04 freezes'.
-rw-r--r-- | main/contrib/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs | 21 | ||||
-rw-r--r-- | main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/OnTheFlyFormatter.cs | 12 |
2 files changed, 29 insertions, 4 deletions
diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs index 26ce5e4622..dd2dd81c97 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs @@ -97,6 +97,11 @@ namespace ICSharpCode.NRefactory.CSharp get; set; } + + public DomRegion FormattingRegion { + get; + set; + } public AstFormattingVisitor(CSharpFormattingOptions policy, IDocument document, TextEditorOptions options = null) { @@ -111,6 +116,22 @@ namespace ICSharpCode.NRefactory.CSharp this.options = options ?? TextEditorOptions.Default; curIndent = new Indent(this.options); } + + protected virtual void VisitChildren (AstNode node) + { + if (!FormattingRegion.IsEmpty) { + if (node.EndLocation < FormattingRegion.Begin || node.StartLocation > FormattingRegion.End) + return; + } + + AstNode next; + for (var child = node.FirstChild; child != null; child = next) { + // Store next to allow the loop to continue + // if the visitor removes/replaces child. + next = child.NextSibling; + child.AcceptVisitor (this); + } + } /// <summary> /// Applies the changes to the input document. diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/OnTheFlyFormatter.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/OnTheFlyFormatter.cs index 6c3a7770f4..3cc20d8112 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/OnTheFlyFormatter.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Formatting/OnTheFlyFormatter.cs @@ -121,7 +121,7 @@ namespace MonoDevelop.CSharp.Formatting return sb.ToString (); } - static AstFormattingVisitor GetFormattingChanges (PolicyContainer policyParent, IEnumerable<string> mimeTypeChain, MonoDevelop.Ide.Gui.Document document, string input) + static AstFormattingVisitor GetFormattingChanges (PolicyContainer policyParent, IEnumerable<string> mimeTypeChain, MonoDevelop.Ide.Gui.Document document, string input, DomRegion formattingRegion) { using (var stubData = TextEditorData.CreateImmutable (input)) { stubData.Document.FileName = document.FileName; @@ -143,8 +143,10 @@ namespace MonoDevelop.CSharp.Formatting var policy = policyParent.Get<CSharpFormattingPolicy> (mimeTypeChain); var formattingVisitor = new AstFormattingVisitor (policy.CreateOptions (), stubData.Document, document.Editor.CreateNRefactoryTextEditorOptions ()) { - HadErrors = hadErrors + HadErrors = hadErrors, + FormattingRegion = formattingRegion }; + compilationUnit.AcceptVisitor (formattingVisitor); return formattingVisitor; } @@ -159,11 +161,13 @@ namespace MonoDevelop.CSharp.Formatting return; string text; int formatStartOffset, formatLength, realTextDelta; + DomRegion formattingRegion = DomRegion.Empty; if (exact) { text = data.Editor.Text; formatStartOffset = startOffset; formatLength = endOffset - startOffset; realTextDelta = 0; + formattingRegion = new DomRegion (data.Editor.OffsetToLocation (startOffset), data.Editor.OffsetToLocation (endOffset)); } else { var seg = ext.typeSystemSegmentTree.GetMemberSegmentAt (startOffset - 1); if (seg == null) @@ -174,12 +178,12 @@ namespace MonoDevelop.CSharp.Formatting // Build stub text = BuildStub (data, seg, startOffset, endOffset, out formatStartOffset); + formatLength = endOffset - seg.Offset; realTextDelta = seg.Offset - formatStartOffset; } - // Get changes from formatting visitor - var changes = GetFormattingChanges (policyParent, mimeTypeChain, data, text); + var changes = GetFormattingChanges (policyParent, mimeTypeChain, data, text, formattingRegion); if (changes == null) return; |