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
diff options
context:
space:
mode:
authorMarius Ungureanu <marius.ungureanu@xamarin.com>2019-06-06 14:07:07 +0300
committerGitHub <noreply@github.com>2019-06-06 14:07:07 +0300
commitef5ea322347547cb6d971b6097b41965312178e6 (patch)
treeb001d993392d7173d9298ab28dc4c8c52e58d6b4 /main/src/addins/MonoDevelop.AssemblyBrowser
parent90188b9e4cc397df36ca9fa0626a9e970bfd88c3 (diff)
[IDE] Overall energy consumption and UI hang improvements (#7695)
* Misc perf improvements immediately after project load * Use ImmutableDictionary<TargetFramework>, CWT won't work - the strings are collected * Dump * Use DefaultScheduler via Task.Run, Task.Factory is context dependent * [AssemblyBrowser] Cleanups, mostly related to task usage * [Debugger, VCS] Some Task.Factory fixes Fixes VSTS #900427 - Review usage of Task.Factory.StartNew * Use ordinal comparisons here * [ASsemblyBrowser] Fix child nodes not appearing in the list * [VCS] Fix improper usage of cancellation token source * Remove unneeded string ordering * [AsssemblyBrowser] Fix workspace leak and delay project loading. It's not common to get to a project item from the IDE, so we can delay loading that while we get everything else setup * [MSBuild] Switch this to Task.Run, so we don't accidentally parse on the UI thread * Add doc comment * [AssemblyBrowser] Massively improve time it takes to open and a couple of fixes Reuse the typesystem created for decompilation. No need to create a new one just to load the treeview. Prefer using AddChildren everywhere rather than Add. This helps not sort the tree every time we're adding an element. Don't bother gathering all the types in an assembly. Most likely we will only need to gather types from just one assembly, so defer that to the namespace node builder. Fix multiple iteration of a type's members when trying to load a project metadata view. And fix nested types to appear in the tree. * Optimize this a bit more * Minor refactors to avoid extra Funcs * Reuse typesystem for loader, add new feature transform to prevent language breaking
Diffstat (limited to 'main/src/addins/MonoDevelop.AssemblyBrowser')
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs69
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs196
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs33
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs5
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs12
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs2
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs4
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs35
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs4
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs44
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs2
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceBuilder.cs14
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs49
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs38
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynMemberNodeBuilder.cs47
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynTypeNodeBuilder.cs36
16 files changed, 274 insertions, 316 deletions
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
index 15a38cfc9f..c4afa8c1b6 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserViewContent.cs
@@ -40,6 +40,7 @@ using System.Collections.Immutable;
using MonoDevelop.Ide;
using Microsoft.CodeAnalysis.CodeRefactorings;
using MonoDevelop.Ide.Gui.Documents;
+using System.Threading;
namespace MonoDevelop.AssemblyBrowser
{
@@ -47,7 +48,8 @@ namespace MonoDevelop.AssemblyBrowser
{
readonly static string[] defaultAssemblies = new string[] { "mscorlib", "System", "System.Core", "System.Xml" };
AssemblyBrowserWidget widget;
-
+ CancellationTokenSource cts = new CancellationTokenSource ();
+
protected override Control OnGetViewControl (DocumentViewContent view)
{
widget.SetToolbar (view.GetToolbar ());
@@ -67,11 +69,13 @@ namespace MonoDevelop.AssemblyBrowser
FillWidget ();
}
- protected override async Task OnInitialize (ModelDescriptor modelDescriptor, Properties status)
+ protected override Task OnInitialize (ModelDescriptor modelDescriptor, Properties status)
{
if (modelDescriptor is FileDescriptor fileDescriptor) {
Load (fileDescriptor.FilePath);
}
+
+ return Task.CompletedTask;
}
protected override bool OnTryReuseDocument (ModelDescriptor modelDescriptor)
@@ -92,9 +96,9 @@ namespace MonoDevelop.AssemblyBrowser
{
var loader = widget.AddReferenceByFileName (filePath);
if (loader != null) {
- loader.LoadingTask.ContinueWith (delegate {
- widget.SelectAssembly (loader);
- });
+ loader.LoadingTask
+ .ContinueWith (t => widget.SelectAssembly (t.Result), Runtime.MainTaskScheduler)
+ .Ignore ();
}
}
@@ -105,12 +109,14 @@ namespace MonoDevelop.AssemblyBrowser
protected override void OnDispose ()
{
- if (currentWs != null)
- currentWs.WorkspaceLoaded -= Handle_WorkspaceLoaded;
+ if (cts != null) {
+ cts.Cancel ();
+ cts.Dispose ();
+ cts = null;
+ }
widget = null;
- if (Disposed != null)
- Disposed (this, EventArgs.Empty);
+ Disposed?.Invoke (this, EventArgs.Empty);
base.OnDispose ();
}
@@ -162,40 +168,29 @@ namespace MonoDevelop.AssemblyBrowser
//FindDerivedClassesHandler.FindDerivedClasses (type);
}
- void Handle_WorkspaceLoaded (object sender, EventArgs e)
- {
- foreach (var project in Ide.IdeApp.ProjectOperations.CurrentSelectedSolution.GetAllProjects ()) {
- var nav = Widget.TreeView.GetNodeAtObject (project);
- if (nav != null)
- Widget.TreeView.RefreshNode (nav);
- }
- }
-
- Ide.TypeSystem.MonoDevelopWorkspace currentWs;
- public async void FillWidget ()
+ public void FillWidget ()
{
if (Ide.IdeApp.ProjectOperations.CurrentSelectedSolution == null) {
foreach (var assembly in defaultAssemblies) {
- Widget.AddReferenceByAssemblyName (assembly);
+ Widget.AddReferenceByAssemblyName (assembly);
}
} else {
- var alreadyAdded = new HashSet<string> ();
- currentWs = IdeApp.TypeSystemService.GetWorkspace (IdeApp.ProjectOperations.CurrentSelectedSolution);
- if (currentWs != null)
- currentWs.WorkspaceLoaded += Handle_WorkspaceLoaded;
- var allTasks = new List<Task> ();
- foreach (var project in Ide.IdeApp.ProjectOperations.CurrentSelectedSolution.GetAllProjects ()) {
- try {
- Widget.AddProject (project, false);
- } catch (Exception e) {
- LoggingService.LogError ("Error while adding project " + project.Name + " to the tree.", e);
- }
- }
- await Task.WhenAll (allTasks).ContinueWith (delegate {
- Runtime.RunInMainThread (delegate {
+ var token = cts.Token;
+
+ var workspace = IdeApp.TypeSystemService.GetWorkspaceAsync (IdeApp.ProjectOperations.CurrentSelectedSolution)
+ .ContinueWith (t => {
+ if (token.IsCancellationRequested)
+ return;
+
+ foreach (var project in IdeApp.ProjectOperations.CurrentSelectedSolution.GetAllProjects ()) {
+ try {
+ Widget.AddProject (project, false);
+ } catch (Exception e) {
+ LoggingService.LogError ("Error while adding project " + project.Name + " to the tree.", e);
+ }
+ }
widget.StartSearch ();
- });
- });
+ }, token, TaskContinuationOptions.DenyChildAttach, Runtime.MainTaskScheduler);
}
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
index fc47e392e0..681fdac935 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyBrowserWidget.cs
@@ -880,19 +880,19 @@ namespace MonoDevelop.AssemblyBrowser
inspectEditor.Options = assemblyBrowserEditorOptions;
this.inspectEditor.MimeType = "text/x-csharp";
builder.DecompileAsync (inspectEditor, nav, new DecompileFlags { PublicOnly = PublicApiOnly, MethodBodies = false })
- .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler);
+ .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler).Ignore ();
break;
case 1:
inspectEditor.Options = assemblyBrowserEditorOptions;
this.inspectEditor.MimeType = "text/x-ilasm";
builder.DisassembleAsync (inspectEditor, nav)
- .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler);
+ .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler).Ignore ();
break;
case 2:
inspectEditor.Options = assemblyBrowserEditorOptions;
this.inspectEditor.MimeType = "text/x-csharp";
builder.DecompileAsync (inspectEditor, nav, new DecompileFlags { PublicOnly = PublicApiOnly, MethodBodies = true })
- .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler);
+ .ContinueWith (l => SetReferencedSegments (l.Result), Runtime.MainTaskScheduler).Ignore ();
break;
default:
inspectEditor.Options = assemblyBrowserEditorOptions;
@@ -914,24 +914,30 @@ namespace MonoDevelop.AssemblyBrowser
internal void Open (string url, AssemblyLoader currentAssembly = null, bool expandNode = true)
{
Task.WhenAll (this.definitions.Select (d => d.LoadingTask)).ContinueWith (d => {
- Application.Invoke ((o, args) => {
- suspendNavigation = false;
- ITreeNavigator nav = SearchMember (url, expandNode);
- if (definitions.Count == 0) // we've been disposed
- return;
- if (nav != null)
- return;
- try {
- if (currentAssembly != null) {
- OpenFromAssembly (url, currentAssembly);
- } else {
- OpenFromAssemblyNames (url);
- }
- } catch (Exception e) {
- LoggingService.LogError ("Error while opening the assembly browser with id:" + url, e);
+ // At least one of them failed.
+ if (d.IsFaulted) {
+ LoggingService.LogError ("Failed to load assemblies", d.Exception);
+
+ // It's possible the assembly in which the type we're looking for exists
+ // so try probing for it regardless.
+ }
+
+ suspendNavigation = false;
+ ITreeNavigator nav = SearchMember (url, expandNode);
+ if (definitions.Count == 0) // we've been disposed
+ return;
+ if (nav != null)
+ return;
+ try {
+ if (currentAssembly != null) {
+ OpenFromAssembly (url, currentAssembly);
+ } else {
+ OpenFromAssemblyNames (url);
}
- });
- });
+ } catch (Exception e) {
+ LoggingService.LogError ("Error while opening the assembly browser with id:" + url, e);
+ }
+ }, Runtime.MainTaskScheduler).Ignore ();
}
void OpenFromAssembly (string url, AssemblyLoader currentAssembly, bool expandNode = true)
@@ -960,16 +966,14 @@ namespace MonoDevelop.AssemblyBrowser
result.LoadingTask.ContinueWith (t2 => {
if (definitions.Count == 0) // disposed
return;
- Application.Invoke ((o, args) => {
- var nav = SearchMember (url, expandNode);
- if (nav == null) {
- if (++i == references.Length)
- LoggingService.LogError ("Assembly browser: Can't find: " + url + ".");
- else
- loadNext ();
- }
- });
- }, TaskScheduler.Current);
+ var nav = SearchMember (url, expandNode);
+ if (nav == null) {
+ if (++i == references.Length)
+ LoggingService.LogError ("Assembly browser: Can't find: " + url + ".");
+ else
+ loadNext ();
+ }
+ }, Runtime.MainTaskScheduler).Ignore ();
};
}
@@ -997,51 +1001,44 @@ namespace MonoDevelop.AssemblyBrowser
LoggingService.LogError ("Assembly browser: Can't find: " + url + ".");
}
return;
- };
- Task.Factory.ContinueWhenAll (tasks.ToArray (), tarr => {
- var exceptions = tarr.Where (t => t.IsFaulted).Select (t => t.Exception).ToArray ();
- if (exceptions != null) {
- var ex = new AggregateException (exceptions).Flatten ();
- if (ex.InnerExceptions.Count > 0) {
- foreach (var inner in ex.InnerExceptions) {
- LoggingService.LogError ("Error while loading assembly in the browser.", inner);
- }
- throw ex;
+ }
+
+ Task.WhenAll (tasks.ToArray ())
+ .ContinueWith (t => {
+ if (t.IsFaulted) {
+ LoggingService.LogError ("Error while loading assemblies in the browser", t.Exception);
+ return;
}
- }
- if (definitions.Count == 0) // disposed
- return;
- Application.Invoke ((o, args) => {
+
+ if (definitions.Count == 0) // disposed
+ return;
+
var nav = SearchMember (url);
if (nav == null) {
LoggingService.LogError ("Assembly browser: Can't find: " + url + ".");
}
- });
- }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Current);
+ }, Runtime.MainTaskScheduler).Ignore ();
}
- internal void SelectAssembly (AssemblyLoader loader)
+ internal void SelectAssembly (PEFile cu)
{
- PEFile cu = loader.Assembly;
- Application.Invoke ((o, args) => {
- ITreeNavigator nav = TreeView.GetRootNode ();
- if (nav == null)
- return;
+ ITreeNavigator nav = TreeView.GetRootNode ();
+ if (nav == null)
+ return;
+
+ if (expandedMember) {
+ expandedMember = false;
+ return;
+ }
- if (expandedMember) {
- expandedMember = false;
+ do {
+ if (nav.DataItem == cu || (nav.DataItem as AssemblyLoader)?.Assembly == cu) {
+ nav.ExpandToNode ();
+ nav.Selected = true;
+ nav.ScrollToNode ();
return;
}
-
- do {
- if (nav.DataItem == cu || (nav.DataItem as AssemblyLoader)?.Assembly == cu) {
- nav.ExpandToNode ();
- nav.Selected = true;
- nav.ScrollToNode ();
- return;
- }
- } while (nav.MoveNext ());
- });
+ } while (nav.MoveNext ());
}
void Dispose<T> (ITreeNavigator nav) where T:class, IDisposable
@@ -1095,6 +1092,8 @@ namespace MonoDevelop.AssemblyBrowser
def.Dispose ();
definitions = definitions.Clear ();
}
+
+ projects.Clear ();
ActiveMember = null;
resultListStore = null;
@@ -1124,7 +1123,7 @@ namespace MonoDevelop.AssemblyBrowser
ImmutableList<AssemblyLoader> definitions = ImmutableList<AssemblyLoader>.Empty;
- List<Project> projects = new List<Project> ();
+ HashSet<Project> projects = new HashSet<Project> ();
internal AssemblyLoader AddReferenceByAssemblyName (PEFile reference, bool expand = false)
{
@@ -1158,38 +1157,36 @@ namespace MonoDevelop.AssemblyBrowser
var result = new AssemblyLoader (this, fileName);
definitions = definitions.Add (result);
result.LoadingTask = result.LoadingTask.ContinueWith (task => {
- Application.Invoke ((o, args) => {
- if (TreeView == null || definitions.Count == 0)
- return;
- var fullName = result.Assembly.FullName;
-
- // filter duplicate assemblies, can happen on opening the same assembly at different locations.
- foreach (var d in definitions) {
- if (!d.IsLoaded || d == result)
- continue;
- if (d.Assembly.FullName == fullName) {
- definitions = definitions.Remove (result);
- LoggingService.LogInfo ("AssemblyBrowser: Loaded duplicate assembly : " + fullName); // Write a log info in case that happens, shouldn't happen often.
- return;
- }
+ if (TreeView == null || definitions.Count == 0)
+ return task.Result;
+ var fullName = result.Assembly.FullName;
+
+ // filter duplicate assemblies, can happen on opening the same assembly at different locations.
+ foreach (var d in definitions) {
+ if (!d.IsLoaded || d == result)
+ continue;
+ if (d.Assembly.FullName == fullName) {
+ definitions = definitions.Remove (result);
+ LoggingService.LogInfo ("AssemblyBrowser: Loaded duplicate assembly : " + fullName); // Write a log info in case that happens, shouldn't happen often.
+ return task.Result;
}
-
- try {
- ITreeBuilder builder;
- if (definitions.Count + projects.Count == 1) {
- builder = TreeView.LoadTree (result);
- } else {
- builder = TreeView.AddChild (result, false);
- }
- if (TreeView.GetSelectedNode () == null)
- builder.Selected = builder.Expanded = expand;
- } catch (Exception e) {
- LoggingService.LogError ("Error while adding assembly to the assembly list", e);
+ }
+
+ try {
+ ITreeBuilder builder;
+ if (definitions.Count + projects.Count == 1) {
+ builder = TreeView.LoadTree (result);
+ } else {
+ builder = TreeView.AddChild (result, expand);
}
- });
+ if (TreeView.GetSelectedNode () == null)
+ builder.Selected = builder.Expanded = expand;
+ } catch (Exception e) {
+ LoggingService.LogError ("Error while adding assembly to the assembly list", e);
+ }
return task.Result;
- }
- );
+ }, Runtime.MainTaskScheduler);
+
return result;
}
@@ -1198,7 +1195,7 @@ namespace MonoDevelop.AssemblyBrowser
if (project == null)
throw new ArgumentNullException ("project");
- if (projects.Contains (project)) {
+ if (!projects.Add (project)) {
// Select the project.
if (selectReference) {
ITreeNavigator navigator = TreeView.GetNodeAtObject (project);
@@ -1209,14 +1206,16 @@ namespace MonoDevelop.AssemblyBrowser
return;
}
- projects.Add (project);
+
ITreeBuilder builder;
if (definitions.Count + projects.Count == 1) {
builder = TreeView.LoadTree (project);
} else {
- builder = TreeView.AddChild (project);
+ builder = TreeView.AddChild (project, false);
}
- builder.Selected = builder.Expanded = selectReference;
+
+ if (TreeView.GetSelectedNode () == null || selectReference)
+ builder.Selected = builder.Expanded = selectReference;
}
//MonoDevelop.Components.RoundedFrame popupWidgetFrame;
@@ -1258,6 +1257,7 @@ namespace MonoDevelop.AssemblyBrowser
foreach (var def in ensuredDefinitions) {
if (!definitions.Contains (def)) {
definitions = definitions.Add (def);
+
Application.Invoke ((o, args) => {
if (ensuredDefinitions.Count + projects.Count == 1) {
TreeView.LoadTree (def.LoadingTask.Result);
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs
index 31d7aed461..8baaf723a1 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/AssemblyLoader.cs
@@ -35,6 +35,7 @@ using ICSharpCode.Decompiler.Metadata;
using System.Reflection.Metadata;
using System.Linq;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
+using ICSharpCode.Decompiler.CSharp.Transforms;
namespace MonoDevelop.AssemblyBrowser
{
@@ -63,18 +64,13 @@ namespace MonoDevelop.AssemblyBrowser
public PEFile Assembly => AssemblyTask.Result;
public Task<PEFile> AssemblyTask => assemblyDefinitionTaskSource.Task;
- public MetadataReader ModuleDefinition {
- get {
- return assemblyLoaderTask.Result.Metadata;
- }
- }
-
CSharpDecompiler csharpDecompiler;
public CSharpDecompiler CSharpDecompiler {
get {
if (csharpDecompiler == null) {
- csharpDecompiler = new CSharpDecompiler (DecompilerTypeSystem, new ICSharpCode.Decompiler.DecompilerSettings ());
+ csharpDecompiler = new CSharpDecompiler (DecompilerTypeSystem, new ICSharpCode.Decompiler.DecompilerSettings (LanguageVersion.Latest));
+ csharpDecompiler.AstTransforms.Add (new EscapeInvalidIdentifiers ());
}
return csharpDecompiler;
@@ -84,16 +80,13 @@ namespace MonoDevelop.AssemblyBrowser
DecompilerTypeSystem decompilerTypeSystem;
public DecompilerTypeSystem DecompilerTypeSystem {
get {
- LoadTypeSystem (Assembly);
+ if (decompilerTypeSystem == null) {
+ decompilerTypeSystem = new DecompilerTypeSystem (Assembly, new AssemblyResolver (Assembly, widget));
+ }
return decompilerTypeSystem;
}
}
- void LoadTypeSystem (PEFile peFile)
- {
- decompilerTypeSystem = new DecompilerTypeSystem (peFile, new AssemblyResolver (Assembly, widget));
- }
-
public Error Error { get; internal set; }
public bool IsLoaded { get; private set; }
@@ -122,19 +115,7 @@ namespace MonoDevelop.AssemblyBrowser
assemblyDefinitionTaskSource.SetResult (null);
return null;
} finally { IsLoaded = true; }
- });
- }
-
- ICompilation typeSystem;
-
- public ICompilation GetMinimalTypeSystem ()
- {
- if (typeSystem != null)
- return typeSystem;
- var assembly = Assembly;
- if (assembly == null)
- return null;
- return typeSystem = new SimpleCompilation (assembly.WithOptions (TypeSystemOptions.Default | TypeSystemOptions.Uncached | TypeSystemOptions.KeepModifiers), MinimalCorlib.Instance);
+ }, src.Token);
}
class MyUniversalAssemblyResolver : UniversalAssemblyResolver
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs
index 197fb93c08..df992f6f8c 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/MetadataExtensions.cs
@@ -40,6 +40,11 @@ namespace MonoDevelop.AssemblyBrowser
entity.Accessibility == Accessibility.ProtectedOrInternal ||
entity.Accessibility == Accessibility.Public;
+ public static bool IsPublic (this Microsoft.CodeAnalysis.ISymbol entity) =>
+ entity.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.Protected ||
+ entity.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.ProtectedOrInternal ||
+ entity.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.Public;
+
public static string GetStockIcon (this Accessibility attributes)
{
switch (attributes) {
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs
index 9e9ed85e07..58aa2b9a6f 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyBrowserTypeNodeBuilder.cs
@@ -34,6 +34,7 @@ using MonoDevelop.Ide.TypeSystem;
using ICSharpCode.Decompiler.CSharp.OutputVisitor;
using System.Threading.Tasks;
using System.Collections.Generic;
+using System.Linq;
namespace MonoDevelop.AssemblyBrowser
{
@@ -79,5 +80,16 @@ namespace MonoDevelop.AssemblyBrowser
return treeBuilder.GetParentDataItem (typeof(AssemblyLoader), true) != null;
}
+ protected static void AddFilteredChildren<T> (ITreeBuilder builder, IReadOnlyCollection<T> collection, bool publicApiOnly) where T:IEntity
+ {
+ if (collection.Count == 0)
+ return;
+
+ var children = publicApiOnly
+ ? collection.Where (x => x.IsPublic ())
+ : collection;
+
+ builder.AddChildren (collection);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs
index 98d83e6e94..641aa3412d 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceNodeBuilder.cs
@@ -82,7 +82,7 @@ namespace MonoDevelop.AssemblyBrowser
if (e2 == null)
return -1;
- return e1.Name.CompareTo (e2.Name);
+ return string.Compare(e1.Name, e2.Name, StringComparison.Ordinal);
} catch (Exception e) {
LoggingService.LogError ("Exception in assembly browser sort function.", e);
return -1;
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
index dc17aa56b6..fc1f30d49d 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
@@ -67,9 +67,7 @@ namespace MonoDevelop.AssemblyBrowser
public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
{
- var r1 = thisNode.DataItem as ITypeReference;
- var r2 = thisNode.DataItem as ITypeReference;
- return r1.ToString ().CompareTo (r2.ToString ());
+ return string.Compare (thisNode.NodeName, otherNode.NodeName, StringComparison.Ordinal);
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs
index 0e2c3fd73a..d4ac415ec8 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/AssemblyNodeBuilder.cs
@@ -100,26 +100,23 @@ namespace MonoDevelop.AssemblyBrowser
var resources = new AssemblyResourceFolder (assemblyLoader.Assembly);
if (resources.Resources.Any ())
treeBuilder.AddChild (resources);
-
- var namespaces = new Dictionary<string, NamespaceData> ();
- bool publicOnly = Widget.PublicApiOnly;
-
- foreach (var type in assemblyLoader.GetMinimalTypeSystem ().MainModule.TopLevelTypeDefinitions) {
- string namespaceName = string.IsNullOrEmpty (type.Namespace) ? "" : type.Namespace;
- if (!namespaces.ContainsKey (namespaceName))
- namespaces [namespaceName] = new NamespaceData (namespaceName);
-
- var ns = namespaces [namespaceName];
- ns.Types.Add ((type.IsPublic (), type));
- }
- treeBuilder.AddChildren (namespaces.Where (ns => ns.Key != "" && (!publicOnly || ns.Value.Types.Any (t => t.isPublic))).Select (n => n.Value));
- if (namespaces.ContainsKey ("")) {
- foreach (var child in namespaces [""].Types) {
- if (((INamedElement)child.typeObject).Name == "<Module>")
- continue;
- treeBuilder.AddChild (child);
- }
+ var mainModule = assemblyLoader.DecompilerTypeSystem.MainModule;
+ var rootData = new NamespaceData (mainModule.RootNamespace);
+ if (rootData.Types.Length > 0)
+ treeBuilder.AddChild (rootData);
+
+ var allNamespaces = new List<NamespaceData> (32);
+ CollectNamespaces (allNamespaces, mainModule.RootNamespace.ChildNamespaces);
+ treeBuilder.AddChildren (allNamespaces);
+ }
+
+ void CollectNamespaces (List<NamespaceData> accumulator, IEnumerable<INamespace> namespaces)
+ {
+ accumulator.AddRange (namespaces.Select (x => new NamespaceData(x)));
+
+ foreach (var ns in namespaces) {
+ CollectNamespaces (accumulator, ns.ChildNamespaces);
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs
index 81b1fa822b..e9b28c36dd 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/MethodDefinitionNodeBuilder.cs
@@ -124,14 +124,14 @@ namespace MonoDevelop.AssemblyBrowser
}
- public static async Task<List<ReferenceSegment>> DecompileAsync (TextEditor data, AssemblyLoader assemblyLoader, Func<CSharpDecompiler, SyntaxTree> decompile, DecompilerSettings settings = null, DecompileFlags flags = null)
+ public static Task<List<ReferenceSegment>> DecompileAsync (TextEditor data, AssemblyLoader assemblyLoader, Func<CSharpDecompiler, SyntaxTree> decompile, DecompilerSettings settings = null, DecompileFlags flags = null)
{
if (data == null)
throw new ArgumentNullException (nameof (data));
if (assemblyLoader == null)
throw new ArgumentNullException (nameof (assemblyLoader));
- return await Task.Run (async delegate {
+ return Task.Run (async delegate {
settings = settings ?? GetDecompilerSettings (data, publicOnly: flags.PublicOnly);
var csharpDecompiler = assemblyLoader.CSharpDecompiler;
try {
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs
index b875def8f7..90f83a0e73 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Cecil/TypeDefinitionNodeBuilder.cs
@@ -98,46 +98,28 @@ namespace MonoDevelop.AssemblyBrowser
public override void BuildChildNodes (ITreeBuilder builder, object dataObject)
{
var type = (ITypeDefinition)dataObject;
- var list = new System.Collections.ArrayList ();
if (type.DirectBaseTypes.Any ())
- list.Add (new BaseTypeFolder (type));
- bool publicOnly = Widget.PublicApiOnly;
-
- foreach (var field in type.Fields.OrderBy (m => m.Name, StringComparer.InvariantCulture)) {
- if (publicOnly && !field.IsPublic ())
- continue;
- builder.AddChild (field);
- }
-
- foreach (var property in type.Properties.OrderBy (m => m.Name, StringComparer.InvariantCulture)) {
- var accessor = property.Getter ?? property.Setter;
- if (publicOnly && !accessor.IsPublic ())
- continue;
- builder.AddChild (property);
- }
+ builder.AddChild (new BaseTypeFolder (type));
- foreach (var evt in type.Events.OrderBy (m => m.Name, StringComparer.InvariantCulture)) {
- var accessor = evt.AddAccessor ?? evt.RemoveAccessor;
- if (publicOnly && !accessor.IsPublic ())
- continue;
- builder.AddChild (evt);
- }
+ bool publicOnly = Widget.PublicApiOnly;
- var accessorMethods = type.GetAccessors ();
- foreach (var method in type.Methods.OrderBy (m => m.Name, StringComparer.InvariantCulture)) {
- if (publicOnly && !method.IsPublic ())
- continue;
- if (!accessorMethods.Contains (method)) {
- builder.AddChild (method);
- }
- }
+ // PERF: We can take advantage of the fact that AddChildren is faster than AddChild, due to not processing
+ // sorting of child nodes. Avoid creating additional collection, as TreeBuilder does not optimize for ICollection implementors,
+ // thus the overhead of creating a IEnumerable is not that big.
+ AddFilteredChildren (builder, type.Members, publicOnly);
+ AddFilteredChildren (builder, type.NestedTypes, publicOnly);
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
{
return true;
}
-
+
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ return -50;
+ }
+
#region IAssemblyBrowserNodeBuilder
internal static void PrintAssembly (StringBuilder result, ITreeNavigator navigator)
{
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs
index e9a6b593a2..9262f9612f 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/ModuleReferenceNodeBuilder.cs
@@ -70,7 +70,7 @@ namespace MonoDevelop.AssemblyBrowser
if (e2 == null)
return 1;
- return e1.Name.CompareTo (e2.Name);
+ return string.Compare (e1.Name, e2.Name, StringComparison.Ordinal);
} catch (Exception e) {
LoggingService.LogError ("Exception in assembly browser sort function.", e);
return -1;
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceBuilder.cs
index 89c848dc27..0307db2738 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceBuilder.cs
@@ -64,7 +64,7 @@ namespace MonoDevelop.AssemblyBrowser
if (e2 == null)
return -1;
- return e1.Name.CompareTo (e2.Name);
+ return string.Compare (e1.Name, e2.Name, StringComparison.Ordinal);
} catch (Exception e) {
LoggingService.LogError ("Exception in assembly browser sort function.", e);
return -1;
@@ -87,12 +87,12 @@ namespace MonoDevelop.AssemblyBrowser
public override void BuildChildNodes (ITreeBuilder ctx, object dataObject)
{
NamespaceData ns = (NamespaceData)dataObject;
- bool publicOnly = Widget.PublicApiOnly;
- foreach (var type in ns.Types) {
- if (publicOnly && !type.isPublic)
- continue;
- ctx.AddChild (type.typeObject);
- }
+
+ IEnumerable<object> result = ns.Types;
+ if (Widget.PublicApiOnly)
+ result = result.Where (x => NamespaceData.IsPublic (x));
+
+ ctx.AddChildren (result);
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs
index 56950b7d79..47a2f0f7f7 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/NamespaceData.cs
@@ -28,42 +28,61 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using ICSharpCode.Decompiler.TypeSystem;
+using MonoDevelop.Ide.TypeSystem;
namespace MonoDevelop.AssemblyBrowser
{
class NamespaceData : IDisposable
{
- List<(bool, object)> types = new List<(bool, object)> ();
-
- public string Name {
- get;
- private set;
+ public string Name { get; }
+ INamespace decompilerNs;
+ Microsoft.CodeAnalysis.INamespaceSymbol roslynNamespace;
+
+ public static bool IsPublic (object typeObject)
+ {
+ return (typeObject is ITypeDefinition typeDefinition && typeDefinition.IsPublic ())
+ || (typeObject is Microsoft.CodeAnalysis.INamedTypeSymbol symbol && symbol.IsPublic ());
}
- public List<(bool isPublic, object typeObject)> Types {
+ object [] types;
+ public object[] Types {
get {
+ if (types == null) {
+ types = decompilerNs?.Types.ToArray ()
+ ?? roslynNamespace?.GetTypeMembers ().ToArray ()
+ ?? Array.Empty<object> ();
+ }
return types;
}
}
-
- public NamespaceData (string name)
+
+ public NamespaceData(INamespace ns)
{
- this.Name = name;
+ Name = ns.FullName;
+ decompilerNs = ns;
+
+ // Remove <Module> from root namespace.
+ if (ns.ParentNamespace == null) {
+ types = decompilerNs.Types.Where (x => x.Name != "<Module>").ToArray ();
+ }
+ }
+
+ public NamespaceData(Microsoft.CodeAnalysis.INamespaceSymbol namespaceSymbol)
+ {
+ Name = namespaceSymbol.GetFullName ();
+ roslynNamespace = namespaceSymbol;
}
public void Dispose ()
{
- if (types != null) {
- // types.ForEach (t => t.Dispose ());
- types.Clear ();
- types = null;
- }
+ types = null;
}
public override string ToString ()
{
- return string.Format ("[Namespace: Name={0}, #Types={1}]", Name, Types.Count);
+ return string.Format ("[Namespace: Name={0}, #Types={1}]", Name, Types.Length);
}
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs
index e65bfd01da..15487176c0 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/ProjectNodeBuilder.cs
@@ -58,7 +58,7 @@ namespace MonoDevelop.AssemblyBrowser
var project = (Project)dataObject;
return project.Name;
}
-
+
public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo)
{
var project = (Project)dataObject;
@@ -74,27 +74,27 @@ namespace MonoDevelop.AssemblyBrowser
var dom = IdeApp.TypeSystemService.GetCompilationAsync (project).Result;
if (dom == null)
return;
- bool nestedNamespaces = builder.Options ["NestedNamespaces"];
- HashSet<string> addedNames = new HashSet<string> ();
- foreach (var ns in dom.Assembly.GlobalNamespace.GetNamespaceMembers ()) {
- FillNamespaces (builder, project, ns);
+
+ var data = new List<NamespaceData> (32);
+ CollectNamespaces (data, dom.Assembly.GlobalNamespace.GetNamespaceMembers ());
+ builder.AddChildren (data);
+
+ var types = dom.Assembly.GlobalNamespace.GetTypeMembers ();
+ if (types.Length > 0) {
+ var children = publicOnly
+ ? types.Where (t => t.IsPublic ())
+ : types;
+
+ builder.AddChildren (children);
}
- builder.AddChildren (dom.Assembly.GlobalNamespace.GetTypeMembers ()
- .Where (type => !publicOnly || type.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.Public));
}
- public static void FillNamespaces (ITreeBuilder builder, Project project, Microsoft.CodeAnalysis.INamespaceSymbol ns)
+ static void CollectNamespaces (List<NamespaceData> acc, IEnumerable<Microsoft.CodeAnalysis.INamespaceSymbol> namespaces)
{
- var members = ns.GetTypeMembers ();
- //IParserContext ctx = IdeApp.Workspace.ParserDatabase.GetProjectParserContext (project);
- if (members.Any ()) {
- var data = new NamespaceData (ns.Name);
- foreach (var member in members)
- data.Types.Add ((member.DeclaredAccessibility == Microsoft.CodeAnalysis.Accessibility.Public, member));
- builder.AddChild (data);
- }
- foreach (var nSpace in ns.GetNamespaceMembers ()) {
- FillNamespaces (builder, project, nSpace);
+ acc.AddRange (namespaces.Select (x => new NamespaceData (x)));
+
+ foreach (var ns in namespaces) {
+ CollectNamespaces (acc, ns.GetNamespaceMembers ());
}
}
@@ -118,7 +118,7 @@ namespace MonoDevelop.AssemblyBrowser
if (e2 == null)
return 1;
- return e1.Name.CompareTo (e2.Name);
+ return string.Compare (e1.Name, e2.Name, StringComparison.Ordinal);
} catch (Exception e) {
LoggingService.LogError ("Exception in assembly browser sort function.", e);
return -1;
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynMemberNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynMemberNodeBuilder.cs
index 57b2f79562..3707a94029 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynMemberNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynMemberNodeBuilder.cs
@@ -45,39 +45,14 @@ namespace MonoDevelop.AssemblyBrowser
public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
{
- if (!(otherNode.DataItem is ISymbol)) return 1;
-
- if (thisNode.Options ["GroupByType"]) {
- int v1 = GetTypeSortValue (thisNode.DataItem);
- int v2 = GetTypeSortValue (otherNode.DataItem);
- if (v1 < v2) return -1;
- else if (v1 > v2) return 1;
- }
- if (thisNode.Options ["GroupByAccess"]) {
- int v1 = GetAccessSortValue (((ISymbol)thisNode.DataItem).DeclaredAccessibility);
- int v2 = GetAccessSortValue (((ISymbol)otherNode.DataItem).DeclaredAccessibility);
- if (v1 < v2) return -1;
- else if (v1 > v2) return 1;
+ try {
+ if (thisNode == null || otherNode == null)
+ return -1;
+ return string.Compare (thisNode.NodeName, otherNode.NodeName, StringComparison.OrdinalIgnoreCase);
+ } catch (Exception e) {
+ LoggingService.LogError ("Exception in assembly browser sort function.", e);
+ return -1;
}
- return DefaultSort;
- }
-
- int GetTypeSortValue (object member)
- {
- if (member is IFieldSymbol) return 0;
- if (member is IEventSymbol) return 1;
- if (member is IPropertySymbol) return 2;
- if (member is IMethodSymbol) return 3;
- return 4;
- }
-
- int GetAccessSortValue (Accessibility mods)
- {
- if ((mods & Accessibility.Private) != 0) return 0;
- if ((mods & Accessibility.Internal) != 0) return 1;
- if ((mods & Accessibility.Protected) != 0) return 2;
- if ((mods & Accessibility.Public) != 0) return 3;
- return 4;
}
public Task<List<ReferenceSegment>> DecompileAsync (TextEditor data, ITreeNavigator navigator, DecompileFlags flags)
@@ -85,17 +60,17 @@ namespace MonoDevelop.AssemblyBrowser
return DisassembleAsync (data, navigator);
}
- public Task<List<ReferenceSegment>> DisassembleAsync (TextEditor data, ITreeNavigator navigator)
+ public async Task<List<ReferenceSegment>> DisassembleAsync (TextEditor data, ITreeNavigator navigator)
{
var symbol = navigator.DataItem as ISymbol;
if (symbol == null) {
data.Text = "// DataItem is no symbol " + navigator.DataItem; // should never happen
LoggingService.LogError ("DataItem is no symbol " + navigator.DataItem);
- return AssemblyBrowserTypeNodeBuilder.EmptyReferenceSegmentTask;
+ return new List<ReferenceSegment> ();
}
var location = symbol.Locations [0];
if (location.IsInSource) {
- var root = location.SourceTree.GetRoot ();
+ var root = await location.SourceTree.GetRootAsync ();
var node = root.FindNode (location.SourceSpan);
if (node != null) {
data.Text = node.ToFullString ();
@@ -106,7 +81,7 @@ namespace MonoDevelop.AssemblyBrowser
data.Text = "// Error: Symbol " + symbol.MetadataName + " is not in source."; // should never happen
LoggingService.LogError ("Symbol " + symbol.MetadataName + " is not in source.");
}
- return AssemblyBrowserTypeNodeBuilder.EmptyReferenceSegmentTask;
+ return new List<ReferenceSegment> ();
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynTypeNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynTypeNodeBuilder.cs
index 81b74424aa..b798484b31 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynTypeNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/Roslyn/RoslynTypeNodeBuilder.cs
@@ -88,30 +88,24 @@ namespace MonoDevelop.AssemblyBrowser
if (classData.TypeKind == TypeKind.Delegate)
return;
- builder.AddChildren (classData.GetTypeMembers ()
- .Where (innerClass => innerClass.DeclaredAccessibility == Accessibility.Public ||
- (innerClass.DeclaredAccessibility == Accessibility.Protected && publicProtectedOnly) ||
- !publicOnly));
+ Func<ISymbol, bool> filter = symbol => !MethodPropertyFilter (symbol);
+ if (Widget.PublicApiOnly)
+ filter = symbol => symbol.IsPublic () && !MethodPropertyFilter (symbol);
- builder.AddChildren (classData.GetMembers ().OfType<IMethodSymbol> ().Where (m => m.MethodKind != MethodKind.PropertyGet && m.MethodKind != MethodKind.PropertySet)
- .Where (method => method.DeclaredAccessibility == Accessibility.Public ||
- (method.DeclaredAccessibility == Accessibility.Protected && publicProtectedOnly) ||
- !publicOnly));
+ var typeMembers = classData.GetTypeMembers ();
+ if (typeMembers.Length > 0) {
+ builder.AddChildren (Enumerable.Where (typeMembers, filter));
+ }
- builder.AddChildren (classData.GetMembers ().OfType<IPropertySymbol> ()
- .Where (property => property.DeclaredAccessibility == Accessibility.Public ||
- (property.DeclaredAccessibility == Accessibility.Protected && publicProtectedOnly) ||
- !publicOnly));
+ var members = classData.GetMembers ();
+ if (members.Length > 0) {
+ builder.AddChildren (members.Where (filter));
+ }
- builder.AddChildren (classData.GetMembers ().OfType<IFieldSymbol> ()
- .Where (field => field.DeclaredAccessibility == Accessibility.Public ||
- (field.DeclaredAccessibility == Accessibility.Protected && publicProtectedOnly) ||
- !publicOnly));
-
- builder.AddChildren (classData.GetMembers ().OfType<IEventSymbol> ()
- .Where (e => e.DeclaredAccessibility == Accessibility.Public ||
- (e.DeclaredAccessibility == Accessibility.Protected && publicProtectedOnly) ||
- !publicOnly));
+ bool MethodPropertyFilter (ISymbol symbol)
+ {
+ return symbol is IMethodSymbol method && (method.MethodKind == MethodKind.PropertyGet || method.MethodKind == MethodKind.PropertySet);
+ }
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)