Skip to content

Commit 0af4564

Browse files
Add CompareView and FrozenContent flag
1 parent dad304d commit 0af4564

File tree

16 files changed

+825
-38
lines changed

16 files changed

+825
-38
lines changed

ICSharpCode.ILSpyX/AssemblyListSnapshot.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void AddDescendants(PackageFolder folder)
186186

187187
foreach (var entry in folder.Entries)
188188
{
189-
if (!entry.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
189+
if (!entry.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) && !entry.Name.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
190190
continue;
191191
var asm = folder.ResolveFileName(entry.Name);
192192
if (asm == null)

ILSpy/AssemblyTree/AssemblyTreeModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,11 @@ public void DecompileSelectedNodes(DecompilerTextViewState? newState = null)
794794
{
795795
var activeTabPage = DockWorkspace.ActiveTabPage;
796796

797+
if (activeTabPage.FrozenContent)
798+
{
799+
activeTabPage = DockWorkspace.AddTabPage();
800+
}
801+
797802
activeTabPage.SupportsLanguageSwitching = true;
798803

799804
if (SelectedItems.Length == 1)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) 2025 AlphaSierraPapa for the SharpDevelop Team
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4+
// software and associated documentation files (the "Software"), to deal in the Software
5+
// without restriction, including without limitation the rights to use, copy, modify, merge,
6+
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7+
// to whom the Software is furnished to do so, subject to the following conditions:
8+
//
9+
// The above copyright notice and this permission notice shall be included in all copies or
10+
// substantial portions of the Software.
11+
//
12+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13+
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14+
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15+
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17+
// DEALINGS IN THE SOFTWARE.
18+
19+
using System.Composition;
20+
using System.Threading.Tasks;
21+
22+
using ICSharpCode.ILSpy.AssemblyTree;
23+
using ICSharpCode.ILSpy.Docking;
24+
using ICSharpCode.ILSpy.TreeNodes;
25+
using ICSharpCode.ILSpy.ViewModels;
26+
using ICSharpCode.ILSpy.Views;
27+
28+
namespace ICSharpCode.ILSpy
29+
{
30+
[ExportContextMenuEntry(Header = "Compare...", Order = 9999)]
31+
[Shared]
32+
internal sealed class CompareContextMenuEntry(AssemblyTreeModel assemblyTreeModel, DockWorkspace dockWorkspace) : IContextMenuEntry
33+
{
34+
public void Execute(TextViewContext context)
35+
{
36+
var left = ((AssemblyTreeNode)context.SelectedTreeNodes[0]).LoadedAssembly;
37+
var right = ((AssemblyTreeNode)context.SelectedTreeNodes[1]).LoadedAssembly;
38+
39+
var tabPage = dockWorkspace.AddTabPage();
40+
CompareViewModel.Show(tabPage, left, right, assemblyTreeModel);
41+
}
42+
43+
public bool IsEnabled(TextViewContext context)
44+
{
45+
return true;
46+
}
47+
48+
public bool IsVisible(TextViewContext context)
49+
{
50+
return context.SelectedTreeNodes is [AssemblyTreeNode { LoadedAssembly.IsLoadedAsValidAssembly: true }, AssemblyTreeNode { LoadedAssembly.IsLoadedAsValidAssembly: true }];
51+
}
52+
}
53+
}

ILSpy/Commands/SearchMsdnContextMenuEntry.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
// DEALINGS IN THE SOFTWARE.
1818

1919
using System.Linq;
20-
using System.Threading;
2120

2221
using ICSharpCode.ILSpy.Properties;
2322
using ICSharpCode.ILSpy.TreeNodes;

ILSpy/Controls/TreeView/SharpTreeView.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@
246246
VerticalAlignment="Center" />
247247
</Border>
248248
<StackPanel Orientation="Horizontal"
249-
Background="Transparent"
249+
Background="{Binding Background}"
250250
ToolTip="{Binding ToolTip}">
251251
<ContentPresenter Name="icon"
252252
Content="{Binding Icon}"

ILSpy/Docking/DockWorkspace.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ private void TabPages_CollectionChanged(object sender, NotifyCollectionChangedEv
118118
}
119119
}
120120

121-
public void AddTabPage(TabPageModel tabPage = null)
121+
public TabPageModel AddTabPage(TabPageModel tabPage = null)
122122
{
123-
tabPages.Add(tabPage ?? exportProvider.GetExportedValue<TabPageModel>());
123+
TabPageModel item = tabPage ?? exportProvider.GetExportedValue<TabPageModel>();
124+
tabPages.Add(item);
125+
return item;
124126
}
125127

126128
public ReadOnlyObservableCollection<TabPageModel> TabPages { get; }

ILSpy/Images/Images.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
namespace ICSharpCode.ILSpy
2727
{
28+
using ICSharpCode.Decompiler.TypeSystem;
29+
2830
static class Images
2931
{
3032
private static readonly Rect iconRect = new Rect(0, 0, 16, 16);
@@ -212,6 +214,27 @@ public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bo
212214
return memberIconCache.GetIcon(icon, overlay, isStatic);
213215
}
214216

217+
public static AccessOverlayIcon GetOverlayIcon(Accessibility accessibility)
218+
{
219+
switch (accessibility)
220+
{
221+
case Accessibility.Public:
222+
return AccessOverlayIcon.Public;
223+
case Accessibility.Internal:
224+
return AccessOverlayIcon.Internal;
225+
case Accessibility.ProtectedAndInternal:
226+
return AccessOverlayIcon.PrivateProtected;
227+
case Accessibility.Protected:
228+
return AccessOverlayIcon.Protected;
229+
case Accessibility.ProtectedOrInternal:
230+
return AccessOverlayIcon.ProtectedInternal;
231+
case Accessibility.Private:
232+
return AccessOverlayIcon.Private;
233+
default:
234+
return AccessOverlayIcon.CompilerControlled;
235+
}
236+
}
237+
215238
private static ImageSource GetIcon(string baseImage, string overlay = null, bool isStatic = false)
216239
{
217240
ImageSource baseImageSource = Load(baseImage);

ILSpy/TreeNodes/EventTreeNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static object GetText(IEvent ev, Language language)
6565

6666
public static ImageSource GetIcon(IEvent @event)
6767
{
68-
return Images.GetIcon(MemberIcon.Event, MethodTreeNode.GetOverlayIcon(@event.Accessibility), @event.IsStatic);
68+
return Images.GetIcon(MemberIcon.Event, Images.GetOverlayIcon(@event.Accessibility), @event.IsStatic);
6969
}
7070

7171
public override FilterResult Filter(LanguageSettings settings)

ILSpy/TreeNodes/FieldTreeNode.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ public static object GetText(IField field, Language language)
5858
public static ImageSource GetIcon(IField field)
5959
{
6060
if (field.DeclaringType.Kind == TypeKind.Enum && field.ReturnType.Kind == TypeKind.Enum)
61-
return Images.GetIcon(MemberIcon.EnumValue, MethodTreeNode.GetOverlayIcon(field.Accessibility), false);
61+
return Images.GetIcon(MemberIcon.EnumValue, Images.GetOverlayIcon(field.Accessibility), false);
6262

6363
if (field.IsConst)
64-
return Images.GetIcon(MemberIcon.Literal, MethodTreeNode.GetOverlayIcon(field.Accessibility), false);
64+
return Images.GetIcon(MemberIcon.Literal, Images.GetOverlayIcon(field.Accessibility), false);
6565

6666
if (field.IsReadOnly)
67-
return Images.GetIcon(MemberIcon.FieldReadOnly, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic);
67+
return Images.GetIcon(MemberIcon.FieldReadOnly, Images.GetOverlayIcon(field.Accessibility), field.IsStatic);
6868

69-
return Images.GetIcon(MemberIcon.Field, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic);
69+
return Images.GetIcon(MemberIcon.Field, Images.GetOverlayIcon(field.Accessibility), field.IsStatic);
7070
}
7171

7272
public override FilterResult Filter(LanguageSettings settings)

ILSpy/TreeNodes/MethodTreeNode.cs

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,40 +58,19 @@ public static object GetText(IMethod method, Language language)
5858
public static ImageSource GetIcon(IMethod method)
5959
{
6060
if (method.IsOperator)
61-
return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method.Accessibility), false);
61+
return Images.GetIcon(MemberIcon.Operator, Images.GetOverlayIcon(method.Accessibility), false);
6262

6363
if (method.IsExtensionMethod)
64-
return Images.GetIcon(MemberIcon.ExtensionMethod, GetOverlayIcon(method.Accessibility), false);
64+
return Images.GetIcon(MemberIcon.ExtensionMethod, Images.GetOverlayIcon(method.Accessibility), false);
6565

6666
if (method.IsConstructor)
67-
return Images.GetIcon(MemberIcon.Constructor, GetOverlayIcon(method.Accessibility), method.IsStatic);
67+
return Images.GetIcon(MemberIcon.Constructor, Images.GetOverlayIcon(method.Accessibility), method.IsStatic);
6868

6969
if (!method.HasBody && method.HasAttribute(KnownAttribute.DllImport))
70-
return Images.GetIcon(MemberIcon.PInvokeMethod, GetOverlayIcon(method.Accessibility), true);
70+
return Images.GetIcon(MemberIcon.PInvokeMethod, Images.GetOverlayIcon(method.Accessibility), true);
7171

7272
return Images.GetIcon(method.IsVirtual ? MemberIcon.VirtualMethod : MemberIcon.Method,
73-
GetOverlayIcon(method.Accessibility), method.IsStatic);
74-
}
75-
76-
internal static AccessOverlayIcon GetOverlayIcon(Accessibility accessibility)
77-
{
78-
switch (accessibility)
79-
{
80-
case Accessibility.Public:
81-
return AccessOverlayIcon.Public;
82-
case Accessibility.Internal:
83-
return AccessOverlayIcon.Internal;
84-
case Accessibility.ProtectedAndInternal:
85-
return AccessOverlayIcon.PrivateProtected;
86-
case Accessibility.Protected:
87-
return AccessOverlayIcon.Protected;
88-
case Accessibility.ProtectedOrInternal:
89-
return AccessOverlayIcon.ProtectedInternal;
90-
case Accessibility.Private:
91-
return AccessOverlayIcon.Private;
92-
default:
93-
return AccessOverlayIcon.CompilerControlled;
94-
}
73+
Images.GetOverlayIcon(method.Accessibility), method.IsStatic);
9574
}
9675

9776
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

0 commit comments

Comments
 (0)