Skip to content

Commit 1134313

Browse files
Merge pull request icsharpcode#3314 from tom-englert/dev/DependencyInjection
Replace singletons with DI patterns...
2 parents e96605c + a24e0f9 commit 1134313

File tree

100 files changed

+1082
-1036
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+1082
-1036
lines changed

ICSharpCode.ILSpyX/Analyzers/AnalyzerScope.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,14 @@ public class AnalyzerScope
4040
/// </summary>
4141
public bool IsLocal { get; }
4242

43-
public AssemblyList AssemblyList { get; }
44-
4543
public ISymbol AnalyzedSymbol { get; }
4644

4745
public ITypeDefinition TypeScope => typeScope;
4846

49-
Accessibility effectiveAccessibility;
47+
readonly Accessibility effectiveAccessibility;
5048

5149
public AnalyzerScope(AssemblyList assemblyList, IEntity entity)
5250
{
53-
AssemblyList = assemblyList;
5451
assemblyListSnapshot = assemblyList.GetSnapshot();
5552
AnalyzedSymbol = entity;
5653
DetermineEffectiveAccessibility(entity, out typeScope, out effectiveAccessibility);

ICSharpCode.ILSpyX/Analyzers/IAnalyzer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public interface IAnalyzer
4242
public interface IAnalyzerMetadata
4343
{
4444
string Header { get; }
45+
4546
int Order { get; }
4647
}
4748
}

ILSpy.ReadyToRun/ReadyToRunDisassembler.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,22 @@ internal class ReadyToRunDisassembler
3838
private readonly ITextOutput output;
3939
private readonly ReadyToRunReader reader;
4040
private readonly RuntimeFunction runtimeFunction;
41+
private readonly SettingsService settingsService;
4142

42-
public ReadyToRunDisassembler(ITextOutput output, ReadyToRunReader reader, RuntimeFunction runtimeFunction)
43+
public ReadyToRunDisassembler(ITextOutput output, ReadyToRunReader reader, RuntimeFunction runtimeFunction, SettingsService settingsService)
4344
{
4445
this.output = output;
4546
this.reader = reader;
4647
this.runtimeFunction = runtimeFunction;
48+
this.settingsService = settingsService;
4749
}
4850

4951
public void Disassemble(PEFile currentFile, int bitness, ulong address, bool showMetadataTokens, bool showMetadataTokensInBase10)
5052
{
5153
ReadyToRunMethod readyToRunMethod = runtimeFunction.Method;
5254
WriteCommentLine(readyToRunMethod.SignatureString);
5355

54-
var options = SettingsService.Instance.GetSettings<ReadyToRunOptions>();
56+
var options = settingsService.GetSettings<ReadyToRunOptions>();
5557

5658
if (options.IsShowGCInfo)
5759
{

ILSpy.ReadyToRun/ReadyToRunLanguage.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838

3939
using ILCompiler.Reflection.ReadyToRun;
4040

41+
using TomsToolbox.Composition;
42+
43+
using MetadataReader = System.Reflection.Metadata.MetadataReader;
44+
4145
namespace ICSharpCode.ILSpy.ReadyToRun
4246
{
4347
#if STRESS
@@ -97,7 +101,7 @@ public void WriteReference(IMember member, string text, bool isDefinition = fals
97101

98102
[Export(typeof(Language))]
99103
[Shared]
100-
internal class ReadyToRunLanguage : Language
104+
internal class ReadyToRunLanguage(SettingsService settingsService, IExportProvider exportProvider) : Language
101105
{
102106
private static readonly ConditionalWeakTable<MetadataFile, ReadyToRunReaderCacheEntry> readyToRunReaders = new ConditionalWeakTable<MetadataFile, ReadyToRunReaderCacheEntry>();
103107

@@ -175,7 +179,7 @@ public override void DecompileMethod(IMethod method, ITextOutput output, Decompi
175179
.GroupBy(m => m.MethodHandle)
176180
.ToDictionary(g => g.Key, g => g.ToArray());
177181
}
178-
var displaySettings = SettingsService.Instance.DisplaySettings;
182+
var displaySettings = settingsService.DisplaySettings;
179183
bool showMetadataTokens = displaySettings.ShowMetadataTokens;
180184
bool showMetadataTokensInBase10 = displaySettings.ShowMetadataTokensInBase10;
181185
#if STRESS
@@ -205,7 +209,7 @@ public override void DecompileMethod(IMethod method, ITextOutput output, Decompi
205209
file = ((IlSpyAssemblyMetadata)readyToRunMethod.ComponentReader).Module;
206210
}
207211

208-
new ReadyToRunDisassembler(output, disassemblingReader, runtimeFunction).Disassemble(file, bitness, (ulong)runtimeFunction.StartAddress, showMetadataTokens, showMetadataTokensInBase10);
212+
new ReadyToRunDisassembler(output, disassemblingReader, runtimeFunction, settingsService).Disassemble(file, bitness, (ulong)runtimeFunction.StartAddress, showMetadataTokens, showMetadataTokensInBase10);
209213
}
210214
}
211215
}
@@ -218,7 +222,7 @@ public override void DecompileMethod(IMethod method, ITextOutput output, Decompi
218222

219223
public override RichText GetRichTextTooltip(IEntity entity)
220224
{
221-
return LanguageService.Instance.ILLanguage.GetRichTextTooltip(entity);
225+
return exportProvider.GetExportedValue<LanguageService>().ILLanguage.GetRichTextTooltip(entity);
222226
}
223227

224228
private ReadyToRunReaderCacheEntry GetReader(LoadedAssembly assembly, MetadataFile file)

ILSpy.Tests/Analyzers/MemberImplementsInterfaceAnalyzerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public void VerifyReturnsOnlyInterfaceMembers()
145145
var analyzer = new MemberImplementsInterfaceAnalyzer();
146146

147147
// Act
148-
var results = analyzer.Analyze(symbol, new AnalyzerContext() { AssemblyList = new ILSpyX.AssemblyList(), Language = new CSharpLanguage([]) });
148+
var results = analyzer.Analyze(symbol, new AnalyzerContext() { AssemblyList = new ILSpyX.AssemblyList(), Language = new CSharpLanguage() });
149149

150150
// Assert
151151
Assert.That(results, Is.Not.Null);

ILSpy.Tests/Analyzers/MethodUsesAnalyzerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void Setup()
3030
testAssembly = assemblyList.OpenAssembly(typeof(MethodUsesAnalyzerTests).Assembly.Location);
3131
assemblyList.OpenAssembly(typeof(void).Assembly.Location);
3232
testAssemblyTypeSystem = testAssembly.GetTypeSystemOrNull();
33-
language = new CSharpLanguage([]);
33+
language = new CSharpLanguage();
3434
typeDefinition = testAssemblyTypeSystem.FindType(typeof(TestCases.Main.MainAssembly)).GetDefinition();
3535
}
3636

ILSpy.Tests/Analyzers/TypeUsedByAnalyzerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void Setup()
4141
assemblyList = new AssemblyList();
4242
testAssembly = assemblyList.OpenAssembly(typeof(MethodUsesAnalyzerTests).Assembly.Location);
4343
testAssemblyTypeSystem = new DecompilerTypeSystem(testAssembly.GetMetadataFileOrNull(), testAssembly.GetAssemblyResolver());
44-
language = new CSharpLanguage([]);
44+
language = new CSharpLanguage();
4545
}
4646

4747
[Test]

ILSpy/AboutPage.cs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,51 @@
1717
// DEALINGS IN THE SOFTWARE.
1818

1919
using System;
20+
using System.Collections.Generic;
2021
using System.Composition;
2122
using System.IO;
2223
using System.Text.RegularExpressions;
2324
using System.Windows;
2425
using System.Windows.Controls;
26+
using System.Windows.Controls.Primitives;
2527
using System.Windows.Data;
2628
using System.Windows.Input;
27-
using System.Windows.Navigation;
2829

2930
using ICSharpCode.AvalonEdit.Rendering;
3031
using ICSharpCode.Decompiler;
3132
using ICSharpCode.ILSpy.Properties;
3233
using ICSharpCode.ILSpy.TextView;
3334
using ICSharpCode.ILSpy.Themes;
3435
using ICSharpCode.ILSpy.Updates;
35-
using ICSharpCode.ILSpyX.Settings;
36+
using ICSharpCode.ILSpy.ViewModels;
3637

3738
namespace ICSharpCode.ILSpy
3839
{
3940
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._Help), Header = nameof(Resources._About), MenuOrder = 99999)]
4041
[Shared]
41-
sealed class AboutPage : SimpleCommand
42+
public sealed class AboutPage : SimpleCommand
4243
{
44+
readonly SettingsService settingsService;
45+
readonly IEnumerable<IAboutPageAddition> aboutPageAdditions;
46+
47+
public AboutPage(SettingsService settingsService, IEnumerable<IAboutPageAddition> aboutPageAdditions)
48+
{
49+
this.settingsService = settingsService;
50+
this.aboutPageAdditions = aboutPageAdditions;
51+
MessageBus<ShowAboutPageEventArgs>.Subscribers += (_, e) => ShowAboutPage(e.TabPage);
52+
}
53+
4354
public override void Execute(object parameter)
4455
{
45-
MainWindow.Instance.AssemblyTreeModel.NavigateTo(
46-
new RequestNavigateEventArgs(new Uri("resource://aboutpage"), null),
47-
inNewTabPage: true
48-
);
56+
MessageBus.Send(this, new NavigateToEventArgs(new(new("resource://aboutpage"), null), inNewTabPage: true));
57+
}
58+
59+
private void ShowAboutPage(TabPageModel tabPage)
60+
{
61+
tabPage.ShowTextView(Display);
4962
}
5063

51-
public static void Display(DecompilerTextView textView)
64+
private void Display(DecompilerTextView textView)
5265
{
5366
AvalonEditTextOutput output = new AvalonEditTextOutput() {
5467
Title = Resources.About,
@@ -61,23 +74,26 @@ public static void Display(DecompilerTextView textView)
6174

6275
output.AddUIElement(
6376
delegate {
64-
StackPanel stackPanel = new StackPanel();
65-
stackPanel.HorizontalAlignment = HorizontalAlignment.Center;
66-
stackPanel.Orientation = Orientation.Horizontal;
67-
if (NotifyOfUpdatesStrategy.LatestAvailableVersion == null)
77+
StackPanel stackPanel = new() {
78+
HorizontalAlignment = HorizontalAlignment.Center,
79+
Orientation = Orientation.Horizontal
80+
};
81+
if (UpdateService.LatestAvailableVersion == null)
6882
{
6983
AddUpdateCheckButton(stackPanel, textView);
7084
}
7185
else
7286
{
7387
// we already retrieved the latest version sometime earlier
74-
ShowAvailableVersion(NotifyOfUpdatesStrategy.LatestAvailableVersion, stackPanel);
88+
ShowAvailableVersion(UpdateService.LatestAvailableVersion, stackPanel);
7589
}
76-
CheckBox checkBox = new CheckBox();
77-
checkBox.Margin = new Thickness(4);
78-
checkBox.Content = Resources.AutomaticallyCheckUpdatesEveryWeek;
79-
UpdateSettings settings = new UpdateSettings(SettingsService.Instance.SpySettings);
80-
checkBox.SetBinding(CheckBox.IsCheckedProperty, new Binding("AutomaticUpdateCheckEnabled") { Source = settings });
90+
CheckBox checkBox = new() {
91+
Margin = new Thickness(4),
92+
Content = Resources.AutomaticallyCheckUpdatesEveryWeek
93+
};
94+
95+
var settings = settingsService.GetSettings<UpdateSettings>();
96+
checkBox.SetBinding(ToggleButton.IsCheckedProperty, new Binding("AutomaticUpdateCheckEnabled") { Source = settings });
8197
return new StackPanel {
8298
Margin = new Thickness(0, 4, 0, 0),
8399
Cursor = Cursors.Arrow,
@@ -86,16 +102,15 @@ public static void Display(DecompilerTextView textView)
86102
});
87103
output.WriteLine();
88104

89-
foreach (var plugin in App.ExportProvider.GetExportedValues<IAboutPageAddition>())
105+
foreach (var plugin in aboutPageAdditions)
90106
plugin.Write(output);
91107
output.WriteLine();
92108
output.Address = new Uri("resource://AboutPage");
93109
using (Stream s = typeof(AboutPage).Assembly.GetManifestResourceStream(typeof(AboutPage), Resources.ILSpyAboutPageTxt))
94110
{
95111
using (StreamReader r = new StreamReader(s))
96112
{
97-
string line;
98-
while ((line = r.ReadLine()) != null)
113+
while (r.ReadLine() is { } line)
99114
{
100115
output.WriteLine(line);
101116
}
@@ -156,7 +171,7 @@ static void AddUpdateCheckButton(StackPanel stackPanel, DecompilerTextView textV
156171

157172
try
158173
{
159-
AvailableVersionInfo vInfo = await NotifyOfUpdatesStrategy.GetLatestVersionAsync();
174+
AvailableVersionInfo vInfo = await UpdateService.GetLatestVersionAsync();
160175
stackPanel.Children.Clear();
161176
ShowAvailableVersion(vInfo, stackPanel);
162177
}
@@ -199,7 +214,7 @@ static void ShowAvailableVersion(AvailableVersionInfo availableVersion, StackPan
199214
button.Content = Resources.Download;
200215
button.Cursor = Cursors.Arrow;
201216
button.Click += delegate {
202-
MainWindow.OpenLink(availableVersion.DownloadUrl);
217+
GlobalUtils.OpenLink(availableVersion.DownloadUrl);
203218
};
204219
stackPanel.Children.Add(button);
205220
}

ILSpy/Analyzers/AnalyzeCommand.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,18 @@
2020
using System.Linq;
2121

2222
using ICSharpCode.Decompiler.TypeSystem;
23+
using ICSharpCode.ILSpy.AssemblyTree;
2324
using ICSharpCode.ILSpy.Properties;
2425
using ICSharpCode.ILSpy.TreeNodes;
2526

27+
using TomsToolbox.Composition;
28+
2629
namespace ICSharpCode.ILSpy.Analyzers
2730
{
2831
[ExportContextMenuEntry(Header = nameof(Resources.Analyze), Icon = "Images/Search", Category = nameof(Resources.Analyze), InputGestureText = "Ctrl+R", Order = 100)]
2932
[Shared]
30-
internal sealed class AnalyzeContextMenuCommand : IContextMenuEntry
33+
internal sealed class AnalyzeContextMenuCommand(AnalyzerTreeViewModel analyzerTreeView) : IContextMenuEntry
3134
{
32-
private static readonly AnalyzerTreeViewModel AnalyzerTreeView = App.ExportProvider.GetExportedValue<AnalyzerTreeViewModel>();
33-
3435
public bool IsVisible(TextViewContext context)
3536
{
3637
if (context.TreeView is AnalyzerTreeView && context.SelectedTreeNodes != null && context.SelectedTreeNodes.All(n => n.Parent.IsRoot))
@@ -62,30 +63,30 @@ public void Execute(TextViewContext context)
6263
{
6364
foreach (var node in context.SelectedTreeNodes.OfType<IMemberTreeNode>().ToArray())
6465
{
65-
AnalyzerTreeView.Analyze(node.Member);
66+
analyzerTreeView.Analyze(node.Member);
6667
}
6768
}
6869
else if (context.Reference is { Reference: IEntity entity })
6970
{
70-
AnalyzerTreeView.Analyze(entity);
71+
analyzerTreeView.Analyze(entity);
7172
}
7273
}
7374
}
7475

75-
internal sealed class AnalyzeCommand : SimpleCommand
76+
[Export]
77+
[Shared]
78+
public sealed class AnalyzeCommand(AssemblyTreeModel assemblyTreeModel, AnalyzerTreeViewModel analyzerTreeViewModel) : SimpleCommand
7679
{
77-
private static readonly AnalyzerTreeViewModel AnalyzerTreeView = App.ExportProvider.GetExportedValue<AnalyzerTreeViewModel>();
78-
7980
public override bool CanExecute(object parameter)
8081
{
81-
return MainWindow.Instance.AssemblyTreeModel.SelectedNodes.All(n => n is IMemberTreeNode);
82+
return assemblyTreeModel.SelectedNodes.All(n => n is IMemberTreeNode);
8283
}
8384

8485
public override void Execute(object parameter)
8586
{
86-
foreach (var node in MainWindow.Instance.AssemblyTreeModel.SelectedNodes.OfType<IMemberTreeNode>())
87+
foreach (var node in assemblyTreeModel.SelectedNodes.OfType<IMemberTreeNode>())
8788
{
88-
AnalyzerTreeView.Analyze(node.Member);
89+
analyzerTreeViewModel.Analyze(node.Member);
8990
}
9091
}
9192
}

ILSpy/Analyzers/AnalyzerSearchTreeNode.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ protected IEnumerable<AnalyzerTreeNode> FetchChildren(CancellationToken ct)
5858
{
5959
if (symbol is IEntity)
6060
{
61-
var context = new AnalyzerContext() {
61+
var context = new AnalyzerContext {
6262
CancellationToken = ct,
6363
Language = Language,
64-
AssemblyList = MainWindow.Instance.AssemblyTreeModel.AssemblyList
64+
AssemblyList = AssemblyList
6565
};
6666
var results = analyzer.Analyze(symbol, context).Select(SymbolTreeNodeFactory);
6767
if (context.SortResults)

0 commit comments

Comments
 (0)