Browse Source

Hoist the analyzer-children loop into AnalyzerEntityTreeNode

All six entity nodes repeated the same registry walk in LoadChildren;
AddAnalyzerChildren gives analyzer registration a single home, with
subclasses adding their entity-specific rows (accessors, backing
fields) before calling it.

Assisted-by: Claude:claude-fable-5[1m]:Claude Code
pull/3759/head
Siegfried Pammer 4 weeks ago
parent
commit
1378b08342
  1. 10
      ILSpy/Analyzers/AnalyzedEventTreeNode.cs
  2. 13
      ILSpy/Analyzers/AnalyzedFieldTreeNode.cs
  3. 13
      ILSpy/Analyzers/AnalyzedMethodTreeNode.cs
  4. 13
      ILSpy/Analyzers/AnalyzedModuleTreeNode.cs
  5. 10
      ILSpy/Analyzers/AnalyzedPropertyTreeNode.cs
  6. 13
      ILSpy/Analyzers/AnalyzedTypeTreeNode.cs
  7. 18
      ILSpy/Analyzers/AnalyzerEntityTreeNode.cs

10
ILSpy/Analyzers/AnalyzedEventTreeNode.cs

@ -54,15 +54,7 @@ namespace ILSpy.Analyzers.TreeNodes @@ -54,15 +54,7 @@ namespace ILSpy.Analyzers.TreeNodes
if (TryFindBackingField(analyzedEvent, out var backingField))
this.Children.Add(new AnalyzedFieldTreeNode(backingField, this.SourceMember));
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedEvent))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedEvent, analyzer, factory.Metadata?.Header));
}
}
AddAnalyzerChildren(analyzedEvent);
}
static bool TryFindBackingField(IEvent analyzedEvent, [NotNullWhen(true)] out IField? backingField)

13
ILSpy/Analyzers/AnalyzedFieldTreeNode.cs

@ -42,17 +42,6 @@ namespace ILSpy.Analyzers.TreeNodes @@ -42,17 +42,6 @@ namespace ILSpy.Analyzers.TreeNodes
public override object Icon => Images.Images.GetIcon(Images.Images.Field,
Images.Images.GetOverlay(analyzedField.Accessibility), analyzedField.IsStatic);
protected override void LoadChildren()
{
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedField))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedField, analyzer, factory.Metadata?.Header));
}
}
}
protected override void LoadChildren() => AddAnalyzerChildren(analyzedField);
}
}

13
ILSpy/Analyzers/AnalyzedMethodTreeNode.cs

@ -57,17 +57,6 @@ namespace ILSpy.Analyzers.TreeNodes @@ -57,17 +57,6 @@ namespace ILSpy.Analyzers.TreeNodes
method.IsExtensionMethod);
}
protected override void LoadChildren()
{
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedMethod))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedMethod, analyzer, factory.Metadata?.Header));
}
}
}
protected override void LoadChildren() => AddAnalyzerChildren(analyzedMethod);
}
}

13
ILSpy/Analyzers/AnalyzedModuleTreeNode.cs

@ -82,18 +82,7 @@ namespace ILSpy.Analyzers.TreeNodes @@ -82,18 +82,7 @@ namespace ILSpy.Analyzers.TreeNodes
}
}
protected override void LoadChildren()
{
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedModule))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedModule, analyzer, factory.Metadata?.Header));
}
}
}
protected override void LoadChildren() => AddAnalyzerChildren(analyzedModule);
public override bool HandleAssemblyListChanged(
ICollection<LoadedAssembly> removedAssemblies,

10
ILSpy/Analyzers/AnalyzedPropertyTreeNode.cs

@ -51,15 +51,7 @@ namespace ILSpy.Analyzers.TreeNodes @@ -51,15 +51,7 @@ namespace ILSpy.Analyzers.TreeNodes
if (analyzedProperty.CanSet)
this.Children.Add(new AnalyzedAccessorTreeNode(analyzedProperty.Setter!, this.SourceMember, "set"));
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedProperty))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedProperty, analyzer, factory.Metadata?.Header));
}
}
AddAnalyzerChildren(analyzedProperty);
}
}
}

13
ILSpy/Analyzers/AnalyzedTypeTreeNode.cs

@ -52,17 +52,6 @@ namespace ILSpy.Analyzers.TreeNodes @@ -52,17 +52,6 @@ namespace ILSpy.Analyzers.TreeNodes
Images.Images.GetOverlay(type.Accessibility), type.IsStatic);
}
protected override void LoadChildren()
{
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedType))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedType, analyzer, factory.Metadata?.Header));
}
}
}
protected override void LoadChildren() => AddAnalyzerChildren(analyzedType);
}
}

18
ILSpy/Analyzers/AnalyzerEntityTreeNode.cs

@ -67,6 +67,24 @@ namespace ILSpy.Analyzers @@ -67,6 +67,24 @@ namespace ILSpy.Analyzers
public override object? ToolTip => Member?.ParentModule?.MetadataFile?.FileName;
/// <summary>
/// Appends one <see cref="AnalyzerSearchTreeNode"/> per registered analyzer that
/// applies to <paramref name="analyzedSymbol"/>. Subclasses with extra rows
/// (accessors, backing fields) add those first, then call this.
/// </summary>
protected void AddAnalyzerChildren(ISymbol analyzedSymbol)
{
foreach (var factory in Analyzers)
{
var analyzer = factory.CreateExport().Value;
if (analyzer.Show(analyzedSymbol))
{
this.Children.Add(
new AnalyzerSearchTreeNode(analyzedSymbol, analyzer, factory.Metadata?.Header));
}
}
}
public override bool HandleAssemblyListChanged(
ICollection<LoadedAssembly> removedAssemblies,
ICollection<LoadedAssembly> addedAssemblies)

Loading…
Cancel
Save