From a1940eefe5c92821fc0e67a402fde4a3dce6522e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 9 Jul 2018 17:49:38 +0200 Subject: [PATCH] Clean Analyzer tree nodes --- .../TreeNodes/AnalyzedEventTreeNode.cs | 67 ++++++------------- .../TreeNodes/AnalyzedFieldTreeNode.cs | 6 +- .../TreeNodes/AnalyzedMethodTreeNode.cs | 3 +- .../TreeNodes/AnalyzedPropertyTreeNode.cs | 63 ++++++----------- .../TreeNodes/AnalyzedTypeTreeNode.cs | 3 +- 5 files changed, 46 insertions(+), 96 deletions(-) diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs index a541e964d..453d97a6b 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs @@ -18,72 +18,47 @@ using System; using System.Linq; -using System.Reflection.Metadata; +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy.TreeNodes; -namespace ICSharpCode.ILSpy.TreeNodes.Analyzer +namespace ICSharpCode.ILSpy.Analyzers.TreeNodes { internal sealed class AnalyzedEventTreeNode : AnalyzerEntityTreeNode { - readonly Decompiler.Metadata.PEFile module; - readonly EventDefinitionHandle analyzedEvent; + readonly IEvent analyzedEvent; readonly string prefix; - public AnalyzedEventTreeNode(Decompiler.Metadata.PEFile module, EventDefinitionHandle analyzedEvent, string prefix = "") + public AnalyzedEventTreeNode(IEvent analyzedEvent, string prefix = "") { - if (analyzedEvent == null) - throw new ArgumentNullException(nameof(analyzedEvent)); - this.module = module; - this.analyzedEvent = analyzedEvent; + this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent)); this.prefix = prefix; this.LazyLoading = true; } - public override Decompiler.Metadata.IMetadataEntity Member => new Decompiler.Metadata.EventDefinition(module, analyzedEvent); + public override IEntity Member => analyzedEvent; - public override object Icon - { - get { return EventTreeNode.GetIcon(new Decompiler.Metadata.EventDefinition(module, analyzedEvent)); } - } + public override object Icon => EventTreeNode.GetIcon(analyzedEvent); // TODO: This way of formatting is not suitable for events which explicitly implement interfaces. - public override object Text => prefix + Language.EventToString(new Decompiler.Metadata.EventDefinition(module, analyzedEvent), includeTypeName: true, includeNamespace: true); + public override object Text => prefix + Language.EventToString(analyzedEvent, includeTypeName: true, includeNamespace: true); protected override void LoadChildren() { - if (analyzedEvent.AddMethod != null) - this.Children.Add(new AnalyzedEventAccessorTreeNode(analyzedEvent.AddMethod, "add")); - - if (analyzedEvent.RemoveMethod != null) - this.Children.Add(new AnalyzedEventAccessorTreeNode(analyzedEvent.RemoveMethod, "remove")); + if (analyzedEvent.AddAccessor != null) + this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.AddAccessor, "add")); - foreach (var accessor in analyzedEvent.OtherMethods) - this.Children.Add(new AnalyzedEventAccessorTreeNode(accessor, null)); + if (analyzedEvent.RemoveAccessor != null) + this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.RemoveAccessor, "remove")); - if (AnalyzedEventFiredByTreeNode.CanShow(analyzedEvent)) - this.Children.Add(new AnalyzedEventFiredByTreeNode(analyzedEvent)); - - if (AnalyzedEventOverridesTreeNode.CanShow(analyzedEvent)) - this.Children.Add(new AnalyzedEventOverridesTreeNode(analyzedEvent)); - - if (AnalyzedInterfaceEventImplementedByTreeNode.CanShow(analyzedEvent)) - this.Children.Add(new AnalyzedInterfaceEventImplementedByTreeNode(analyzedEvent)); - } + //foreach (var accessor in analyzedEvent.OtherMethods) + // this.Children.Add(new AnalyzedAccessorTreeNode(accessor, null)); - /*public static AnalyzerTreeNode TryCreateAnalyzer(MemberReference member) - { - if (CanShow(member)) - return new AnalyzedEventTreeNode(member as EventDefinition); - else - return null; + foreach (var lazy in App.ExportProvider.GetExports>()) { + var analyzer = lazy.Value; + if (analyzer.Show(analyzedEvent)) { + this.Children.Add(new AnalyzerSearchTreeNode(analyzedEvent, analyzer)); + } + } } - - public static bool CanShow(IMemberReference member) - { - if (!(member is EventDefinition eventDef)) - return false; - - return !MainWindow.Instance.CurrentLanguage.ShowMember(eventDef.GetAccessors().First().Method) - || AnalyzedEventOverridesTreeNode.CanShow(eventDef); - }*/ } } diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs index e8bd28970..18bfd87b3 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs @@ -17,12 +17,10 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Reflection.Metadata; -using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.TypeSystem; -using ICSharpCode.ILSpy.Analyzers; +using ICSharpCode.ILSpy.TreeNodes; -namespace ICSharpCode.ILSpy.TreeNodes.Analyzer +namespace ICSharpCode.ILSpy.Analyzers.TreeNodes { class AnalyzedFieldTreeNode : AnalyzerEntityTreeNode { diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs index deff82874..dad1f6cb7 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs @@ -22,8 +22,9 @@ using System.Reflection.Metadata; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.ILSpy.Analyzers; +using ICSharpCode.ILSpy.TreeNodes; -namespace ICSharpCode.ILSpy.TreeNodes.Analyzer +namespace ICSharpCode.ILSpy.Analyzers.TreeNodes { internal class AnalyzedMethodTreeNode : AnalyzerEntityTreeNode { diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs index c9017371e..60f2f42d0 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedPropertyTreeNode.cs @@ -17,70 +17,45 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Reflection.Metadata; -using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy.TreeNodes; -namespace ICSharpCode.ILSpy.TreeNodes.Analyzer +namespace ICSharpCode.ILSpy.Analyzers.TreeNodes { sealed class AnalyzedPropertyTreeNode : AnalyzerEntityTreeNode { - readonly Decompiler.Metadata.PEFile module; - readonly PropertyDefinitionHandle analyzedProperty; - readonly bool isIndexer; + readonly IProperty analyzedProperty; readonly string prefix; - public AnalyzedPropertyTreeNode(Decompiler.Metadata.PEFile module, PropertyDefinitionHandle analyzedProperty, string prefix = "") + public AnalyzedPropertyTreeNode(IProperty analyzedProperty, string prefix = "") { - if (analyzedProperty == null) - throw new ArgumentNullException(nameof(analyzedProperty)); - using (LoadedAssembly.DisableAssemblyLoad()) { - this.isIndexer = analyzedProperty.HasMatchingDefaultMemberAttribute(module, out _); - } - this.module = module; - this.analyzedProperty = analyzedProperty; + this.analyzedProperty = analyzedProperty ?? throw new ArgumentNullException(nameof(analyzedProperty)); this.prefix = prefix; this.LazyLoading = true; } - public override object Icon => PropertyTreeNode.GetIcon(new Decompiler.Metadata.PropertyDefinition(module, analyzedProperty), isIndexer); + public override object Icon => PropertyTreeNode.GetIcon(analyzedProperty); // TODO: This way of formatting is not suitable for properties which explicitly implement interfaces. - public override object Text => prefix + Language.PropertyToString(new Decompiler.Metadata.PropertyDefinition(module, analyzedProperty), includeNamespace: true, includeTypeName: true, isIndexer: isIndexer); + public override object Text => prefix + Language.PropertyToString(analyzedProperty, includeNamespace: true, includeTypeName: true); protected override void LoadChildren() { - var accessors = module.Metadata.GetPropertyDefinition(analyzedProperty).GetAccessors(); - if (!accessors.Getter.IsNil) - this.Children.Add(new AnalyzedPropertyAccessorTreeNode(module, accessors.Getter, "get")); - if (!accessors.Setter.IsNil) - this.Children.Add(new AnalyzedPropertyAccessorTreeNode(module, accessors.Setter, "set")); + if (!analyzedProperty.CanGet) + this.Children.Add(new AnalyzedAccessorTreeNode(analyzedProperty.Getter, "get")); + if (!analyzedProperty.CanSet) + this.Children.Add(new AnalyzedAccessorTreeNode(analyzedProperty.Setter, "set")); //foreach (var accessor in analyzedProperty.OtherMethods) // this.Children.Add(new AnalyzedPropertyAccessorTreeNode(accessor, null)); - /*if (AnalyzedPropertyOverridesTreeNode.CanShow(analyzedProperty)) - this.Children.Add(new AnalyzedPropertyOverridesTreeNode(analyzedProperty)); - if (AnalyzedInterfacePropertyImplementedByTreeNode.CanShow(analyzedProperty)) - this.Children.Add(new AnalyzedInterfacePropertyImplementedByTreeNode(analyzedProperty));*/ - } - - /*public static AnalyzerTreeNode TryCreateAnalyzer(IMemberReference member) - { - if (CanShow(member)) - return new AnalyzedPropertyTreeNode((PropertyDefinition)member); - else - return null; + foreach (var lazy in App.ExportProvider.GetExports>()) { + var analyzer = lazy.Value; + if (analyzer.Show(analyzedProperty)) { + this.Children.Add(new AnalyzerSearchTreeNode(analyzedProperty, analyzer)); + } + } } - public static bool CanShow(IMemberReference member) - { - if (!(member is PropertyDefinition property)) - return false; - - return !MainWindow.Instance.CurrentLanguage.ShowMember(property.GetMethod.IsNil ? property.SetMethod : property.GetMethod) - || AnalyzedPropertyOverridesTreeNode.CanShow(property); - }*/ - - public override Decompiler.Metadata.IMetadataEntity Member => new Decompiler.Metadata.PropertyDefinition(module, analyzedProperty); + public override IEntity Member => analyzedProperty; } } diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs index 4edc187fe..21421e0db 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedTypeTreeNode.cs @@ -19,8 +19,9 @@ using System; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.ILSpy.Analyzers; +using ICSharpCode.ILSpy.TreeNodes; -namespace ICSharpCode.ILSpy.TreeNodes.Analyzer +namespace ICSharpCode.ILSpy.Analyzers.TreeNodes { internal class AnalyzedTypeTreeNode : AnalyzerEntityTreeNode {