diff --git a/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs b/ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs
index bfb240bf1..3a2acc8a1 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 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
return visitor.Found;
}
}
-}
+}
\ No newline at end of file
diff --git a/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs b/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs
index 490bf5ec2..0a7bbb95c 100644
--- a/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs
+++ b/ILSpy/Analyzers/AnalyzerSearchTreeNode.cs
@@ -86,29 +86,17 @@ namespace ICSharpCode.ILSpy.Analyzers
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 e2946c3e0..8972926a7 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 @@ namespace ICSharpCode.ILSpy.Analyzers
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 945d62fcc..5f53e9906 100644
--- a/ILSpy/Analyzers/AnalyzerTreeView.cs
+++ b/ILSpy/Analyzers/AnalyzerTreeView.cs
@@ -47,28 +47,12 @@ namespace ICSharpCode.ILSpy.Analyzers
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 fc74c786d..d0b08f0f5 100644
--- a/ILSpy/App.xaml.cs
+++ b/ILSpy/App.xaml.cs
@@ -98,7 +98,6 @@ namespace ICSharpCode.ILSpy
// 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 b6ccb0bd6..c905c9a87 100644
--- a/ILSpy/Commands/DecompileAllCommand.cs
+++ b/ILSpy/Commands/DecompileAllCommand.cs
@@ -28,6 +28,7 @@ using System.Threading.Tasks;
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 @@ namespace ICSharpCode.ILSpy
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 897e6f12c..d7e38ada3 100644
--- a/ILSpy/Commands/SaveCodeContextMenuEntry.cs
+++ b/ILSpy/Commands/SaveCodeContextMenuEntry.cs
@@ -32,6 +32,8 @@ using Microsoft.Win32;
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 @@ namespace ICSharpCode.ILSpy.TextView
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 3d4e3e7e6..faa7cb2f0 100644
--- a/ILSpy/Controls/TreeView/SharpTreeView.cs
+++ b/ILSpy/Controls/TreeView/SharpTreeView.cs
@@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
RegisterCommands();
}
- public static ResourceKey DefaultItemContainerStyleKey { get; private set; }
+ public static ResourceKey DefaultItemContainerStyleKey { get; }
public SharpTreeView()
{
@@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
}
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 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
}
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 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
}
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 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
}
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 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
}
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 a9a00fade..ef7613ccf 100644
--- a/ILSpy/LanguageSettings.cs
+++ b/ILSpy/LanguageSettings.cs
@@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy
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 cbce690b8..a58df78da 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 4c53e6c18..5d7eb069e 100644
--- a/ILSpy/TextView/DecompilerTextView.cs
+++ b/ILSpy/TextView/DecompilerTextView.cs
@@ -56,6 +56,7 @@ using ICSharpCode.ILSpy.AvalonEdit;
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 @@ namespace ICSharpCode.ILSpy.TextView
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 @@ namespace ICSharpCode.ILSpy.TextView
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 @@ namespace ICSharpCode.ILSpy.TextView
{
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 f5c2aa2cd..d2a3c93dc 100644
--- a/ILSpy/TreeNodes/ILSpyTreeNode.cs
+++ b/ILSpy/TreeNodes/ILSpyTreeNode.cs
@@ -48,9 +48,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
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 29aa4261b..c4177e3aa 100644
--- a/ILSpy/Views/DebugSteps.xaml.cs
+++ b/ILSpy/Views/DebugSteps.xaml.cs
@@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpy
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 @@ namespace ICSharpCode.ILSpy
{
language.StepperUpdated -= ILAstStepperUpdated;
}
- if (MainWindow.Instance.CurrentLanguage is ILAstLanguage l)
+ if (SettingsService.Instance.SessionSettings.LanguageSettings.Language is ILAstLanguage l)
{
l.StepperUpdated += ILAstStepperUpdated;
language = l;