diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2018-02-28 11:06:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-28 11:06:57 +0300 |
commit | e8f5e1e12447c0077b3cb5c519696ec80c037572 (patch) | |
tree | 5ccb5104d32a2421b0960d1b065e59e5f58f6b44 /main/src | |
parent | f9cab250471197d167a66eb95e29880dc0755789 (diff) | |
parent | 66ff29871cc591bcc0b1cd1f86fde977fb98a884 (diff) |
Merge pull request #3980 from mono/master-issue3978
Master issue3978
Diffstat (limited to 'main/src')
4 files changed, 19 insertions, 13 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/StringBuilderCache.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/StringBuilderCache.cs index 8c01bb2310..b2957ed843 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/StringBuilderCache.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/StringBuilderCache.cs @@ -33,19 +33,25 @@ namespace MonoDevelop.Core /// </summary> public static class StringBuilderCache { - public static StringBuilder Allocate () + const int Threshold = 4096; + + public static StringBuilder Allocate () { - return SharedPools.Default<StringBuilder> ().Allocate (); + var result = SharedPools.Default<StringBuilder> ().Allocate (); + result.Clear (); + return result; } public static StringBuilder Allocate (string text) { - return SharedPools.Default<StringBuilder> ().Allocate ().Append (text); + return Allocate ().Append (text); } public static void Free (StringBuilder sb) { sb.Clear (); + if (sb.Capacity > Threshold) + sb.Capacity = Threshold; SharedPools.Default<StringBuilder> ().Free (sb); } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFormatter.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFormatter.cs index 95af55600a..bae1958b4b 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFormatter.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Text/TextFormatter.cs @@ -347,14 +347,14 @@ namespace MonoDevelop.Projects.Text StringBuilder sb = StringBuilderCache.Allocate (); indentColumnWidth = AddIndentString (sb, indentString); sb.Append (new string (' ', paragraphStartMargin)); - paragFormattedIndentString = StringBuilderCache.ReturnAndFree (sb); + paragFormattedIndentString = sb.ToString (); paragIndentColumnWidth = indentColumnWidth + paragraphStartMargin; if (LeftMargin > 0) { sb.Append (' ', LeftMargin); indentColumnWidth += LeftMargin; } - formattedIndentString = sb.ToString (); + formattedIndentString = StringBuilderCache.ReturnAndFree (sb); if (paragraphStart) curCol = paragIndentColumnWidth; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor.Extension/LineSeparatorTextEditorExtension.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor.Extension/LineSeparatorTextEditorExtension.cs index 9cef24e485..7ca68ce5b4 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor.Extension/LineSeparatorTextEditorExtension.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor.Extension/LineSeparatorTextEditorExtension.cs @@ -31,6 +31,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Editor; +using MonoDevelop.Core; namespace MonoDevelop.Ide.Editor.Extension { @@ -92,16 +93,13 @@ namespace MonoDevelop.Ide.Editor.Extension var separators = await lineSeparatorService.GetLineSeparatorsAsync (DocumentContext.AnalysisDocument, new TextSpan (0, Editor.Length), token); if (token.IsCancellationRequested) return; - var newMarkers = new List<ITextLineMarker> (); + RemoveMarkers (); foreach (var s in separators) { var line = Editor.GetLineByOffset (s.Start); var marker = Editor.TextMarkerFactory.CreateLineSeparatorMarker (Editor); Editor.AddMarker (line, marker); - newMarkers.Add (marker); + markers.Add (marker); } - - RemoveMarkers (); - markers = newMarkers; } void RemoveMarkers () diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/ProjectedDocumentContext.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/ProjectedDocumentContext.cs index b2fa634440..441f46cedc 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/ProjectedDocumentContext.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/Projection/ProjectedDocumentContext.cs @@ -30,6 +30,7 @@ using MonoDevelop.Core.Text; using MonoDevelop.Ide.Gui; using MonoDevelop.Ide.TypeSystem; using System.Threading.Tasks; +using MonoDevelop.Core; namespace MonoDevelop.Ide.Editor.Projection { @@ -101,7 +102,7 @@ namespace MonoDevelop.Ide.Editor.Projection ReparseDocumentInternal (); } - Task ReparseDocumentInternal () + async Task ReparseDocumentInternal () { var options = new ParseOptions { FileName = projectedEditor.FileName, @@ -110,8 +111,9 @@ namespace MonoDevelop.Ide.Editor.Projection RoslynDocument = projectedDocument, OldParsedDocument = parsedDocument }; - return TypeSystemService.ParseFile (options, projectedEditor.MimeType).ContinueWith (t => { - parsedDocument = t.Result; + var result = await TypeSystemService.ParseFile (options, projectedEditor.MimeType).ConfigureAwait (false); + await Runtime.RunInMainThread (delegate { + parsedDocument = result; base.OnDocumentParsed (EventArgs.Empty); }); } |