From 25bbca76aaafb4323aa31ccc7155ed0004a0b538 Mon Sep 17 00:00:00 2001 From: tom-englert Date: Tue, 20 Aug 2024 10:55:58 +0200 Subject: [PATCH] Remove redundant language settings related code --- .../Builtin/TypeExposedByAnalyzer.cs | 8 ++--- ILSpy/Analyzers/AnalyzerSearchTreeNode.cs | 24 ++++----------- ILSpy/Analyzers/AnalyzerTreeNode.cs | 29 ++----------------- ILSpy/Analyzers/AnalyzerTreeView.cs | 20 ++----------- ILSpy/App.xaml.cs | 1 - ILSpy/Commands/DecompileAllCommand.cs | 3 +- ILSpy/Commands/SaveCodeContextMenuEntry.cs | 4 ++- ILSpy/Controls/TreeView/SharpTreeView.cs | 12 ++++---- ILSpy/LanguageSettings.cs | 2 +- ILSpy/Languages/Languages.cs | 24 +++++---------- ILSpy/TextView/DecompilerTextView.cs | 7 +++-- ILSpy/TreeNodes/ILSpyTreeNode.cs | 4 +-- ILSpy/Views/DebugSteps.xaml.cs | 4 +-- 13 files changed, 40 insertions(+), 102 deletions(-) diff --git a/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs b/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs index bfb240bf15..3a2acc8a19 100644 --- a/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs +++ b/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs @@ -17,15 +17,13 @@ // DEALINGS IN THE SOFTWARE. using System.Collections.Generic; +using System.ComponentModel.Composition; using System.Diagnostics; +using ICSharpCode.Decompiler.TypeSystem; namespace ICSharpCode.ILSpyX.Analyzers.Builtin { - using System.ComponentModel.Composition; - - using ICSharpCode.Decompiler.TypeSystem; - /// /// Finds all entities that expose a type. /// @@ -146,4 +144,4 @@ bool TypeIsExposedBy(TypeDefinitionUsedVisitor visitor, IMethod method) return visitor.Found; } } -} +} \ No newline at end of file diff --git a/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs b/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs index 490bf5ec2a..0a7bbb95cb 100644 --- a/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs +++ b/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs @@ -86,29 +86,17 @@ AnalyzerTreeNode SymbolTreeNodeFactory(ISymbol symbol) switch (symbol) { case IModule module: - return new AnalyzedModuleTreeNode(module) { - Language = this.Language - }; + return new AnalyzedModuleTreeNode(module) { }; case ITypeDefinition td: - return new AnalyzedTypeTreeNode(td) { - Language = this.Language - }; + return new AnalyzedTypeTreeNode(td) { }; case IField fd: - return new AnalyzedFieldTreeNode(fd) { - Language = this.Language - }; + return new AnalyzedFieldTreeNode(fd) { }; case IMethod md: - return new AnalyzedMethodTreeNode(md) { - Language = this.Language - }; + return new AnalyzedMethodTreeNode(md) { }; case IProperty pd: - return new AnalyzedPropertyTreeNode(pd) { - Language = this.Language - }; + return new AnalyzedPropertyTreeNode(pd) { }; case IEvent ed: - return new AnalyzedEventTreeNode(ed) { - Language = this.Language - }; + return new AnalyzedEventTreeNode(ed) { }; default: throw new ArgumentOutOfRangeException(nameof(symbol), $"Symbol {symbol.GetType().FullName} is not supported."); } diff --git a/ILSpy/Analyzers/AnalyzerTreeNode.cs b/ILSpy/Analyzers/AnalyzerTreeNode.cs index e2946c3e06..8972926a73 100644 --- a/ILSpy/Analyzers/AnalyzerTreeNode.cs +++ b/ILSpy/Analyzers/AnalyzerTreeNode.cs @@ -17,9 +17,8 @@ // DEALINGS IN THE SOFTWARE. using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX.TreeView; @@ -27,23 +26,11 @@ namespace ICSharpCode.ILSpy.Analyzers { public abstract class AnalyzerTreeNode : SharpTreeNode { - private Language language; - - public Language Language { - get { return language; } - set { - if (language != value) - { - language = value; - foreach (var child in this.Children.OfType()) - child.Language = value; - } - } - } + public Language Language => SettingsService.Instance.SessionSettings.LanguageSettings.Language; public override bool CanDelete() { - return Parent != null && Parent.IsRoot; + return Parent is { IsRoot: true }; } public override void DeleteCore() @@ -56,16 +43,6 @@ public override void Delete() DeleteCore(); } - internal protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e) - { - if (e.NewItems != null) - { - foreach (AnalyzerTreeNode a in e.NewItems.OfType()) - a.Language = this.Language; - } - base.OnChildrenChanged(e); - } - /// /// Handles changes to the assembly list. /// diff --git a/ILSpy/Analyzers/AnalyzerTreeView.cs b/ILSpy/Analyzers/AnalyzerTreeView.cs index 945d62fccf..5f53e99064 100644 --- a/ILSpy/Analyzers/AnalyzerTreeView.cs +++ b/ILSpy/Analyzers/AnalyzerTreeView.cs @@ -47,28 +47,12 @@ public class AnalyzerTreeView : SharpTreeView public AnalyzerTreeView() { this.ShowRoot = false; - this.BorderThickness = new Thickness(0); + this.BorderThickness = new(); + this.Root = new AnalyzerRootNode(); ContextMenuProvider.Add(this); MessageBus.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e); - MessageBus.Subscribers += DockWorkspace_ActiveTabPageChanged; - MessageBus.Subscribers += (sender, e) => LanguageSettings_PropertyChanged(sender, e); } - private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e) - { - this.Root ??= new AnalyzerRootNode { Language = MainWindow.Instance.CurrentLanguage }; - } - - private void LanguageSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case "Language": - case "LanguageVersion": - ((AnalyzerRootNode)this.Root).Language = MainWindow.Instance.CurrentLanguage; - break; - } - } void CurrentAssemblyList_Changed(object sender, NotifyCollectionChangedEventArgs e) { diff --git a/ILSpy/App.xaml.cs b/ILSpy/App.xaml.cs index fc74c786d3..d0b08f0f59 100644 --- a/ILSpy/App.xaml.cs +++ b/ILSpy/App.xaml.cs @@ -98,7 +98,6 @@ public App() // Add data templates registered via MEF. Resources.MergedDictionaries.Add(DataTemplateManager.CreateDynamicDataTemplates(ExportProvider)); - Languages.Initialize(ExportProvider); EventManager.RegisterClassHandler(typeof(Window), Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(Window_RequestNavigate)); diff --git a/ILSpy/Commands/DecompileAllCommand.cs b/ILSpy/Commands/DecompileAllCommand.cs index b6ccb0bd67..c905c9a87b 100644 --- a/ILSpy/Commands/DecompileAllCommand.cs +++ b/ILSpy/Commands/DecompileAllCommand.cs @@ -28,6 +28,7 @@ using ICSharpCode.Decompiler; using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpy.TextView; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpyX; using TomsToolbox.Essentials; @@ -94,7 +95,7 @@ sealed class Decompile100TimesCommand : SimpleCommand public override void Execute(object parameter) { const int numRuns = 100; - var language = MainWindow.Instance.CurrentLanguage; + var language = SettingsService.Instance.SessionSettings.LanguageSettings.Language; var nodes = MainWindow.Instance.SelectedNodes.ToArray(); var options = MainWindow.Instance.CreateDecompilationOptions(); Docking.DockWorkspace.Instance.RunWithCancellation(ct => Task.Factory.StartNew(() => { diff --git a/ILSpy/Commands/SaveCodeContextMenuEntry.cs b/ILSpy/Commands/SaveCodeContextMenuEntry.cs index 897e6f12c0..d7e38ada3d 100644 --- a/ILSpy/Commands/SaveCodeContextMenuEntry.cs +++ b/ILSpy/Commands/SaveCodeContextMenuEntry.cs @@ -32,6 +32,8 @@ using ICSharpCode.ILSpyX.TreeView; using System.ComponentModel.Composition; +using ICSharpCode.ILSpy.Util; + namespace ICSharpCode.ILSpy.TextView { [ExportContextMenuEntry(Header = nameof(Resources._SaveCode), Category = nameof(Resources.Save), Icon = "Images/Save")] @@ -60,7 +62,7 @@ public static bool CanExecute(IReadOnlyList selectedNodes) public static void Execute(IReadOnlyList selectedNodes) { - var currentLanguage = MainWindow.Instance.CurrentLanguage; + var currentLanguage = SettingsService.Instance.SessionSettings.LanguageSettings.Language; var tabPage = Docking.DockWorkspace.Instance.ActiveTabPage; tabPage.ShowTextView(textView => { if (selectedNodes.Count == 1 && selectedNodes[0] is ILSpyTreeNode singleSelection) diff --git a/ILSpy/Controls/TreeView/SharpTreeView.cs b/ILSpy/Controls/TreeView/SharpTreeView.cs index 3d4e3e7e60..faa7cb2f05 100644 --- a/ILSpy/Controls/TreeView/SharpTreeView.cs +++ b/ILSpy/Controls/TreeView/SharpTreeView.cs @@ -54,7 +54,7 @@ static SharpTreeView() RegisterCommands(); } - public static ResourceKey DefaultItemContainerStyleKey { get; private set; } + public static ResourceKey DefaultItemContainerStyleKey { get; } public SharpTreeView() { @@ -62,7 +62,7 @@ public SharpTreeView() } public static readonly DependencyProperty RootProperty = - DependencyProperty.Register("Root", typeof(SharpTreeNode), typeof(SharpTreeView)); + DependencyProperty.Register(nameof(Root), typeof(SharpTreeNode), typeof(SharpTreeView)); public SharpTreeNode Root { get { return (SharpTreeNode)GetValue(RootProperty); } @@ -70,7 +70,7 @@ public SharpTreeNode Root { } public static readonly DependencyProperty ShowRootProperty = - DependencyProperty.Register("ShowRoot", typeof(bool), typeof(SharpTreeView), + DependencyProperty.Register(nameof(ShowRoot), typeof(bool), typeof(SharpTreeView), new FrameworkPropertyMetadata(true)); public bool ShowRoot { @@ -79,7 +79,7 @@ public bool ShowRoot { } public static readonly DependencyProperty ShowRootExpanderProperty = - DependencyProperty.Register("ShowRootExpander", typeof(bool), typeof(SharpTreeView), + DependencyProperty.Register(nameof(ShowRootExpander), typeof(bool), typeof(SharpTreeView), new FrameworkPropertyMetadata(false)); public bool ShowRootExpander { @@ -88,7 +88,7 @@ public bool ShowRootExpander { } public static readonly DependencyProperty AllowDropOrderProperty = - DependencyProperty.Register("AllowDropOrder", typeof(bool), typeof(SharpTreeView)); + DependencyProperty.Register(nameof(AllowDropOrder), typeof(bool), typeof(SharpTreeView)); public bool AllowDropOrder { get { return (bool)GetValue(AllowDropOrderProperty); } @@ -96,7 +96,7 @@ public bool AllowDropOrder { } public static readonly DependencyProperty ShowLinesProperty = - DependencyProperty.Register("ShowLines", typeof(bool), typeof(SharpTreeView), + DependencyProperty.Register(nameof(ShowLines), typeof(bool), typeof(SharpTreeView), new FrameworkPropertyMetadata(true)); public bool ShowLines { diff --git a/ILSpy/LanguageSettings.cs b/ILSpy/LanguageSettings.cs index a9a00fade6..ef7613ccfc 100644 --- a/ILSpy/LanguageSettings.cs +++ b/ILSpy/LanguageSettings.cs @@ -43,7 +43,7 @@ public class LanguageSettings : INotifyPropertyChanged public LanguageSettings(XElement element) { this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal; - this.Language = Languages.GetLanguage((string)element.Element("Language")); + this.Language = Languages.GetLanguage((string)element.Element("Language")) ?? Languages.AllLanguages.First(); this.LanguageVersion = Language.LanguageVersions.FirstOrDefault(v => v.Version == (string)element.Element("LanguageVersion")) ?? Language.LanguageVersions.LastOrDefault(); } diff --git a/ILSpy/Languages/Languages.cs b/ILSpy/Languages/Languages.cs index cbce690b8b..a58df78da1 100644 --- a/ILSpy/Languages/Languages.cs +++ b/ILSpy/Languages/Languages.cs @@ -16,41 +16,31 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System.Collections.Generic; +using System; using System.Collections.ObjectModel; using System.Linq; -using Microsoft.VisualStudio.Composition; - using TomsToolbox.Composition; namespace ICSharpCode.ILSpy { public static class Languages { - // Start with a dummy list with an IL entry so that crashes - // in Initialize() (e.g. due to invalid plugins) don't lead to - // confusing follow-up errors in GetLanguage(). - private static ReadOnlyCollection allLanguages = new ReadOnlyCollection( - new Language[] { new ILLanguage() }); - /// /// A list of all languages. /// - public static ReadOnlyCollection AllLanguages { - get { return allLanguages; } - } + public static ReadOnlyCollection AllLanguages { get; } = Initialize(App.ExportProvider); - internal static void Initialize(IExportProvider ep) + static ReadOnlyCollection Initialize(IExportProvider ep) { - List languages = new List(); - languages.AddRange(ep.GetExportedValues()); - languages.Sort((a, b) => a.Name.CompareTo(b.Name)); + var languages = ep.GetExportedValues().ToList(); + + languages.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal)); #if DEBUG languages.AddRange(ILAstLanguage.GetDebugLanguages()); languages.AddRange(CSharpLanguage.GetDebugLanguages()); #endif - allLanguages = languages.AsReadOnly(); + return languages.AsReadOnly(); } /// diff --git a/ILSpy/TextView/DecompilerTextView.cs b/ILSpy/TextView/DecompilerTextView.cs index 4c53e6c181..5d7eb069e9 100644 --- a/ILSpy/TextView/DecompilerTextView.cs +++ b/ILSpy/TextView/DecompilerTextView.cs @@ -56,6 +56,7 @@ using ICSharpCode.ILSpy.Options; using ICSharpCode.ILSpy.Themes; using ICSharpCode.ILSpy.TreeNodes; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpyX; @@ -392,7 +393,7 @@ void ToolTipClosed(object? sender, EventArgs e) if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code) { XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation; - DocumentationUIBuilder renderer = new DocumentationUIBuilder(new CSharpAmbience(), MainWindow.Instance.CurrentLanguage.SyntaxHighlighting); + DocumentationUIBuilder renderer = new DocumentationUIBuilder(new CSharpAmbience(), SettingsService.Instance.SessionSettings.LanguageSettings.Language.SyntaxHighlighting); renderer.AddSignatureBlock($"{code.Name} (0x{code.Code:x})"); if (docProvider != null) { @@ -442,7 +443,7 @@ void ToolTipClosed(object? sender, EventArgs e) static FlowDocument? CreateTooltipForEntity(IEntity resolved) { - Language currentLanguage = MainWindow.Instance.CurrentLanguage; + Language currentLanguage = SettingsService.Instance.SessionSettings.LanguageSettings.Language; DocumentationUIBuilder renderer = new DocumentationUIBuilder(new CSharpAmbience(), currentLanguage.SyntaxHighlighting); RichText richText = currentLanguage.GetRichTextTooltip(resolved); if (richText == null) @@ -533,7 +534,7 @@ void HighlightBrackets(object? sender, EventArgs e) { if (MainWindow.Instance.CurrentDisplaySettings.HighlightMatchingBraces) { - var result = MainWindow.Instance.CurrentLanguage.BracketSearcher.SearchBracket(textEditor.Document, textEditor.CaretOffset); + var result = SettingsService.Instance.SessionSettings.LanguageSettings.Language.BracketSearcher.SearchBracket(textEditor.Document, textEditor.CaretOffset); bracketHighlightRenderer.SetHighlight(result); } else diff --git a/ILSpy/TreeNodes/ILSpyTreeNode.cs b/ILSpy/TreeNodes/ILSpyTreeNode.cs index f5c2aa2cdd..d2a3c93dc9 100644 --- a/ILSpy/TreeNodes/ILSpyTreeNode.cs +++ b/ILSpy/TreeNodes/ILSpyTreeNode.cs @@ -48,9 +48,7 @@ public ILSpyTreeNode() LanguageSettings LanguageSettings => SettingsService.Instance.SessionSettings.LanguageSettings; - public Language Language { - get { return LanguageSettings.Language ?? Languages.AllLanguages[0]; } - } + public Language Language => LanguageSettings.Language; public virtual FilterResult Filter(LanguageSettings settings) { diff --git a/ILSpy/Views/DebugSteps.xaml.cs b/ILSpy/Views/DebugSteps.xaml.cs index 29aa4261b5..c4177e3aa4 100644 --- a/ILSpy/Views/DebugSteps.xaml.cs +++ b/ILSpy/Views/DebugSteps.xaml.cs @@ -39,7 +39,7 @@ public DebugSteps() MainWindow.Instance.SelectionChanged += SelectionChanged; writingOptions.PropertyChanged += WritingOptions_PropertyChanged; - if (MainWindow.Instance.CurrentLanguage is ILAstLanguage l) + if (SettingsService.Instance.SessionSettings.LanguageSettings.Language is ILAstLanguage l) { l.StepperUpdated += ILAstStepperUpdated; language = l; @@ -70,7 +70,7 @@ private void LanguageSettings_PropertyChanged(object sender, System.ComponentMod { language.StepperUpdated -= ILAstStepperUpdated; } - if (MainWindow.Instance.CurrentLanguage is ILAstLanguage l) + if (SettingsService.Instance.SessionSettings.LanguageSettings.Language is ILAstLanguage l) { l.StepperUpdated += ILAstStepperUpdated; language = l;