Browse Source

AssemblyReferenceTreeNode.ActivateItem selects the assembly

Assisted-by: Claude:claude-opus-4-7:Claude Code

Assisted-by: Claude:claude-opus-4-7:Claude Code
pull/3755/head
Siegfried Pammer 2 months ago
parent
commit
e7cef17a53
  1. 30
      ILSpy.Tests/MainWindow/MainWindowTests.cs
  2. 4
      ILSpy/TreeNodes/AssemblyListTreeNode.cs
  3. 18
      ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

30
ILSpy.Tests/MainWindow/MainWindowTests.cs

@ -137,6 +137,36 @@ public class MainWindowTests @@ -137,6 +137,36 @@ public class MainWindowTests
refFolder.Children.Should().AllBeAssignableTo<AssemblyReferenceTreeNode>();
}
[AvaloniaTest]
public async Task Activating_Assembly_Reference_Selects_Resolved_Assembly_Node()
{
var window = AppComposition.Current.GetExport<MainWindow>();
window.Show();
var vm = (MainWindowViewModel)window.DataContext!;
await vm.AssemblyTreeModel.WaitForAssembliesAsync(minimumCount: 3);
var assemblyNode = vm.AssemblyTreeModel.FindNode<AssemblyTreeNode>("System.Linq");
assemblyNode.EnsureLazyChildren();
var refFolder = assemblyNode.Children.OfType<ReferenceFolderTreeNode>().Single();
refFolder.EnsureLazyChildren();
var refNode = refFolder.Children.OfType<AssemblyReferenceTreeNode>()
.Single(n => n.AssemblyReference.Name == "System.Runtime");
var args = new StubRoutedEventArgs();
refNode.ActivateItem(args);
args.Handled.Should().BeTrue();
await Waiters.WaitForAsync(() =>
vm.AssemblyTreeModel.SelectedItem is AssemblyTreeNode selected
&& selected.LoadedAssembly.ShortName == "System.Runtime");
}
sealed class StubRoutedEventArgs : ICSharpCode.ILSpyX.TreeView.PlatformAbstractions.IPlatformRoutedEventArgs
{
public bool Handled { get; set; }
}
[AvaloniaTest]
public async Task Selecting_References_Folder_Decompiles_References_Listing()
{

4
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -20,6 +20,7 @@ using System; @@ -20,6 +20,7 @@ using System;
using System.Collections.Specialized;
using System.Linq;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpyX;
namespace ILSpy.TreeNodes
@ -58,5 +59,8 @@ namespace ILSpy.TreeNodes @@ -58,5 +59,8 @@ namespace ILSpy.TreeNodes
public AssemblyTreeNode? FindAssemblyNode(LoadedAssembly asm)
=> Children.OfType<AssemblyTreeNode>().FirstOrDefault(n => n.LoadedAssembly == asm);
public AssemblyTreeNode? FindAssemblyNode(MetadataFile? module)
=> module == null ? null : FindAssemblyNode(module.GetLoadedAssembly());
}
}

18
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

@ -23,7 +23,10 @@ using AvaloniaEdit.Highlighting; @@ -23,7 +23,10 @@ using AvaloniaEdit.Highlighting;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
using ILSpy.AppEnv;
using ILSpy.AssemblyTree;
using ILSpy.Languages;
using ILSpy.TextView;
@ -51,6 +54,21 @@ namespace ILSpy.TreeNodes @@ -51,6 +54,21 @@ namespace ILSpy.TreeNodes
public override object Icon => Images.Images.Assembly;
public override void ActivateItem(IPlatformRoutedEventArgs e)
{
if (parentAssembly.Parent is not AssemblyListTreeNode listNode)
return;
var resolver = parentAssembly.LoadedAssembly.GetAssemblyResolver();
var resolved = resolver.Resolve(reference);
if (resolved == null)
return;
var loaded = listNode.FindAssemblyNode(resolved);
if (loaded == null)
return;
AppComposition.Current.GetExport<AssemblyTreeModel>().SelectedItem = loaded;
e.Handled = true;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
var loaded = parentAssembly.LoadedAssembly.LoadedAssemblyReferencesInfo.TryGetInfo(reference.FullName, out var info);

Loading…
Cancel
Save