Browse Source

Remove redundant language settings related code

pull/3257/head
tom-englert 9 months ago
parent
commit
25bbca76aa
  1. 8
      ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs
  2. 24
      ILSpy/Analyzers/AnalyzerSearchTreeNode.cs
  3. 29
      ILSpy/Analyzers/AnalyzerTreeNode.cs
  4. 20
      ILSpy/Analyzers/AnalyzerTreeView.cs
  5. 1
      ILSpy/App.xaml.cs
  6. 3
      ILSpy/Commands/DecompileAllCommand.cs
  7. 4
      ILSpy/Commands/SaveCodeContextMenuEntry.cs
  8. 12
      ILSpy/Controls/TreeView/SharpTreeView.cs
  9. 2
      ILSpy/LanguageSettings.cs
  10. 24
      ILSpy/Languages/Languages.cs
  11. 7
      ILSpy/TextView/DecompilerTextView.cs
  12. 4
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  13. 4
      ILSpy/Views/DebugSteps.xaml.cs

8
ICSharpCode.ILSpyX/Analyzers/Builtin/TypeExposedByAnalyzer.cs

@ -17,15 +17,13 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.Decompiler.TypeSystem;
namespace ICSharpCode.ILSpyX.Analyzers.Builtin namespace ICSharpCode.ILSpyX.Analyzers.Builtin
{ {
using System.ComponentModel.Composition;
using ICSharpCode.Decompiler.TypeSystem;
/// <summary> /// <summary>
/// Finds all entities that expose a type. /// Finds all entities that expose a type.
/// </summary> /// </summary>
@ -146,4 +144,4 @@ namespace ICSharpCode.ILSpyX.Analyzers.Builtin
return visitor.Found; return visitor.Found;
} }
} }
} }

24
ILSpy/Analyzers/AnalyzerSearchTreeNode.cs

@ -86,29 +86,17 @@ namespace ICSharpCode.ILSpy.Analyzers
switch (symbol) switch (symbol)
{ {
case IModule module: case IModule module:
return new AnalyzedModuleTreeNode(module) { return new AnalyzedModuleTreeNode(module) { };
Language = this.Language
};
case ITypeDefinition td: case ITypeDefinition td:
return new AnalyzedTypeTreeNode(td) { return new AnalyzedTypeTreeNode(td) { };
Language = this.Language
};
case IField fd: case IField fd:
return new AnalyzedFieldTreeNode(fd) { return new AnalyzedFieldTreeNode(fd) { };
Language = this.Language
};
case IMethod md: case IMethod md:
return new AnalyzedMethodTreeNode(md) { return new AnalyzedMethodTreeNode(md) { };
Language = this.Language
};
case IProperty pd: case IProperty pd:
return new AnalyzedPropertyTreeNode(pd) { return new AnalyzedPropertyTreeNode(pd) { };
Language = this.Language
};
case IEvent ed: case IEvent ed:
return new AnalyzedEventTreeNode(ed) { return new AnalyzedEventTreeNode(ed) { };
Language = this.Language
};
default: default:
throw new ArgumentOutOfRangeException(nameof(symbol), $"Symbol {symbol.GetType().FullName} is not supported."); throw new ArgumentOutOfRangeException(nameof(symbol), $"Symbol {symbol.GetType().FullName} is not supported.");
} }

29
ILSpy/Analyzers/AnalyzerTreeNode.cs

@ -17,9 +17,8 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
@ -27,23 +26,11 @@ namespace ICSharpCode.ILSpy.Analyzers
{ {
public abstract class AnalyzerTreeNode : SharpTreeNode public abstract class AnalyzerTreeNode : SharpTreeNode
{ {
private Language language; public Language Language => SettingsService.Instance.SessionSettings.LanguageSettings.Language;
public Language Language {
get { return language; }
set {
if (language != value)
{
language = value;
foreach (var child in this.Children.OfType<AnalyzerTreeNode>())
child.Language = value;
}
}
}
public override bool CanDelete() public override bool CanDelete()
{ {
return Parent != null && Parent.IsRoot; return Parent is { IsRoot: true };
} }
public override void DeleteCore() public override void DeleteCore()
@ -56,16 +43,6 @@ namespace ICSharpCode.ILSpy.Analyzers
DeleteCore(); DeleteCore();
} }
internal protected override void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (AnalyzerTreeNode a in e.NewItems.OfType<AnalyzerTreeNode>())
a.Language = this.Language;
}
base.OnChildrenChanged(e);
}
/// <summary> /// <summary>
/// Handles changes to the assembly list. /// Handles changes to the assembly list.
/// </summary> /// </summary>

20
ILSpy/Analyzers/AnalyzerTreeView.cs

@ -47,28 +47,12 @@ namespace ICSharpCode.ILSpy.Analyzers
public AnalyzerTreeView() public AnalyzerTreeView()
{ {
this.ShowRoot = false; this.ShowRoot = false;
this.BorderThickness = new Thickness(0); this.BorderThickness = new();
this.Root = new AnalyzerRootNode();
ContextMenuProvider.Add(this); ContextMenuProvider.Add(this);
MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e); MessageBus<CurrentAssemblyListChangedEventArgs>.Subscribers += (sender, e) => CurrentAssemblyList_Changed(sender, e);
MessageBus<DockWorkspaceActiveTabPageChangedEventArgs>.Subscribers += DockWorkspace_ActiveTabPageChanged;
MessageBus<LanguageSettingsChangedEventArgs>.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) void CurrentAssemblyList_Changed(object sender, NotifyCollectionChangedEventArgs e)
{ {

1
ILSpy/App.xaml.cs

@ -98,7 +98,6 @@ namespace ICSharpCode.ILSpy
// Add data templates registered via MEF. // Add data templates registered via MEF.
Resources.MergedDictionaries.Add(DataTemplateManager.CreateDynamicDataTemplates(ExportProvider)); Resources.MergedDictionaries.Add(DataTemplateManager.CreateDynamicDataTemplates(ExportProvider));
Languages.Initialize(ExportProvider);
EventManager.RegisterClassHandler(typeof(Window), EventManager.RegisterClassHandler(typeof(Window),
Hyperlink.RequestNavigateEvent, Hyperlink.RequestNavigateEvent,
new RequestNavigateEventHandler(Window_RequestNavigate)); new RequestNavigateEventHandler(Window_RequestNavigate));

3
ILSpy/Commands/DecompileAllCommand.cs

@ -28,6 +28,7 @@ using System.Threading.Tasks;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX;
using TomsToolbox.Essentials; using TomsToolbox.Essentials;
@ -94,7 +95,7 @@ namespace ICSharpCode.ILSpy
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
const int numRuns = 100; const int numRuns = 100;
var language = MainWindow.Instance.CurrentLanguage; var language = SettingsService.Instance.SessionSettings.LanguageSettings.Language;
var nodes = MainWindow.Instance.SelectedNodes.ToArray(); var nodes = MainWindow.Instance.SelectedNodes.ToArray();
var options = MainWindow.Instance.CreateDecompilationOptions(); var options = MainWindow.Instance.CreateDecompilationOptions();
Docking.DockWorkspace.Instance.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => { Docking.DockWorkspace.Instance.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {

4
ILSpy/Commands/SaveCodeContextMenuEntry.cs

@ -32,6 +32,8 @@ using Microsoft.Win32;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using System.ComponentModel.Composition; using System.ComponentModel.Composition;
using ICSharpCode.ILSpy.Util;
namespace ICSharpCode.ILSpy.TextView namespace ICSharpCode.ILSpy.TextView
{ {
[ExportContextMenuEntry(Header = nameof(Resources._SaveCode), Category = nameof(Resources.Save), Icon = "Images/Save")] [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<SharpTreeNode> selectedNodes) public static void Execute(IReadOnlyList<SharpTreeNode> selectedNodes)
{ {
var currentLanguage = MainWindow.Instance.CurrentLanguage; var currentLanguage = SettingsService.Instance.SessionSettings.LanguageSettings.Language;
var tabPage = Docking.DockWorkspace.Instance.ActiveTabPage; var tabPage = Docking.DockWorkspace.Instance.ActiveTabPage;
tabPage.ShowTextView(textView => { tabPage.ShowTextView(textView => {
if (selectedNodes.Count == 1 && selectedNodes[0] is ILSpyTreeNode singleSelection) if (selectedNodes.Count == 1 && selectedNodes[0] is ILSpyTreeNode singleSelection)

12
ILSpy/Controls/TreeView/SharpTreeView.cs

@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
RegisterCommands(); RegisterCommands();
} }
public static ResourceKey DefaultItemContainerStyleKey { get; private set; } public static ResourceKey DefaultItemContainerStyleKey { get; }
public SharpTreeView() public SharpTreeView()
{ {
@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
public static readonly DependencyProperty RootProperty = public static readonly DependencyProperty RootProperty =
DependencyProperty.Register("Root", typeof(SharpTreeNode), typeof(SharpTreeView)); DependencyProperty.Register(nameof(Root), typeof(SharpTreeNode), typeof(SharpTreeView));
public SharpTreeNode Root { public SharpTreeNode Root {
get { return (SharpTreeNode)GetValue(RootProperty); } get { return (SharpTreeNode)GetValue(RootProperty); }
@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
public static readonly DependencyProperty ShowRootProperty = public static readonly DependencyProperty ShowRootProperty =
DependencyProperty.Register("ShowRoot", typeof(bool), typeof(SharpTreeView), DependencyProperty.Register(nameof(ShowRoot), typeof(bool), typeof(SharpTreeView),
new FrameworkPropertyMetadata(true)); new FrameworkPropertyMetadata(true));
public bool ShowRoot { public bool ShowRoot {
@ -79,7 +79,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
public static readonly DependencyProperty ShowRootExpanderProperty = public static readonly DependencyProperty ShowRootExpanderProperty =
DependencyProperty.Register("ShowRootExpander", typeof(bool), typeof(SharpTreeView), DependencyProperty.Register(nameof(ShowRootExpander), typeof(bool), typeof(SharpTreeView),
new FrameworkPropertyMetadata(false)); new FrameworkPropertyMetadata(false));
public bool ShowRootExpander { public bool ShowRootExpander {
@ -88,7 +88,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
public static readonly DependencyProperty AllowDropOrderProperty = public static readonly DependencyProperty AllowDropOrderProperty =
DependencyProperty.Register("AllowDropOrder", typeof(bool), typeof(SharpTreeView)); DependencyProperty.Register(nameof(AllowDropOrder), typeof(bool), typeof(SharpTreeView));
public bool AllowDropOrder { public bool AllowDropOrder {
get { return (bool)GetValue(AllowDropOrderProperty); } get { return (bool)GetValue(AllowDropOrderProperty); }
@ -96,7 +96,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
public static readonly DependencyProperty ShowLinesProperty = public static readonly DependencyProperty ShowLinesProperty =
DependencyProperty.Register("ShowLines", typeof(bool), typeof(SharpTreeView), DependencyProperty.Register(nameof(ShowLines), typeof(bool), typeof(SharpTreeView),
new FrameworkPropertyMetadata(true)); new FrameworkPropertyMetadata(true));
public bool ShowLines { public bool ShowLines {

2
ILSpy/LanguageSettings.cs

@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy
public LanguageSettings(XElement element) public LanguageSettings(XElement element)
{ {
this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal; 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")) this.LanguageVersion = Language.LanguageVersions.FirstOrDefault(v => v.Version == (string)element.Element("LanguageVersion"))
?? Language.LanguageVersions.LastOrDefault(); ?? Language.LanguageVersions.LastOrDefault();
} }

24
ILSpy/Languages/Languages.cs

@ -16,41 +16,31 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections.Generic; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using Microsoft.VisualStudio.Composition;
using TomsToolbox.Composition; using TomsToolbox.Composition;
namespace ICSharpCode.ILSpy namespace ICSharpCode.ILSpy
{ {
public static class Languages 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<Language> allLanguages = new ReadOnlyCollection<Language>(
new Language[] { new ILLanguage() });
/// <summary> /// <summary>
/// A list of all languages. /// A list of all languages.
/// </summary> /// </summary>
public static ReadOnlyCollection<Language> AllLanguages { public static ReadOnlyCollection<Language> AllLanguages { get; } = Initialize(App.ExportProvider);
get { return allLanguages; }
}
internal static void Initialize(IExportProvider ep) static ReadOnlyCollection<Language> Initialize(IExportProvider ep)
{ {
List<Language> languages = new List<Language>(); var languages = ep.GetExportedValues<Language>().ToList();
languages.AddRange(ep.GetExportedValues<Language>());
languages.Sort((a, b) => a.Name.CompareTo(b.Name)); languages.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));
#if DEBUG #if DEBUG
languages.AddRange(ILAstLanguage.GetDebugLanguages()); languages.AddRange(ILAstLanguage.GetDebugLanguages());
languages.AddRange(CSharpLanguage.GetDebugLanguages()); languages.AddRange(CSharpLanguage.GetDebugLanguages());
#endif #endif
allLanguages = languages.AsReadOnly(); return languages.AsReadOnly();
} }
/// <summary> /// <summary>

7
ILSpy/TextView/DecompilerTextView.cs

@ -56,6 +56,7 @@ using ICSharpCode.ILSpy.AvalonEdit;
using ICSharpCode.ILSpy.Options; using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.Themes; using ICSharpCode.ILSpy.Themes;
using ICSharpCode.ILSpy.TreeNodes; using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.Util;
using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpy.ViewModels;
using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX;
@ -392,7 +393,7 @@ namespace ICSharpCode.ILSpy.TextView
if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code) if (segment.Reference is ICSharpCode.Decompiler.Disassembler.OpCodeInfo code)
{ {
XmlDocumentationProvider docProvider = XmlDocLoader.MscorlibDocumentation; 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})"); renderer.AddSignatureBlock($"{code.Name} (0x{code.Code:x})");
if (docProvider != null) if (docProvider != null)
{ {
@ -442,7 +443,7 @@ namespace ICSharpCode.ILSpy.TextView
static FlowDocument? CreateTooltipForEntity(IEntity resolved) 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); DocumentationUIBuilder renderer = new DocumentationUIBuilder(new CSharpAmbience(), currentLanguage.SyntaxHighlighting);
RichText richText = currentLanguage.GetRichTextTooltip(resolved); RichText richText = currentLanguage.GetRichTextTooltip(resolved);
if (richText == null) if (richText == null)
@ -533,7 +534,7 @@ namespace ICSharpCode.ILSpy.TextView
{ {
if (MainWindow.Instance.CurrentDisplaySettings.HighlightMatchingBraces) 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); bracketHighlightRenderer.SetHighlight(result);
} }
else else

4
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -48,9 +48,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
LanguageSettings LanguageSettings => SettingsService.Instance.SessionSettings.LanguageSettings; LanguageSettings LanguageSettings => SettingsService.Instance.SessionSettings.LanguageSettings;
public Language Language { public Language Language => LanguageSettings.Language;
get { return LanguageSettings.Language ?? Languages.AllLanguages[0]; }
}
public virtual FilterResult Filter(LanguageSettings settings) public virtual FilterResult Filter(LanguageSettings settings)
{ {

4
ILSpy/Views/DebugSteps.xaml.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpy
MainWindow.Instance.SelectionChanged += SelectionChanged; MainWindow.Instance.SelectionChanged += SelectionChanged;
writingOptions.PropertyChanged += WritingOptions_PropertyChanged; writingOptions.PropertyChanged += WritingOptions_PropertyChanged;
if (MainWindow.Instance.CurrentLanguage is ILAstLanguage l) if (SettingsService.Instance.SessionSettings.LanguageSettings.Language is ILAstLanguage l)
{ {
l.StepperUpdated += ILAstStepperUpdated; l.StepperUpdated += ILAstStepperUpdated;
language = l; language = l;
@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy
{ {
language.StepperUpdated -= ILAstStepperUpdated; language.StepperUpdated -= ILAstStepperUpdated;
} }
if (MainWindow.Instance.CurrentLanguage is ILAstLanguage l) if (SettingsService.Instance.SessionSettings.LanguageSettings.Language is ILAstLanguage l)
{ {
l.StepperUpdated += ILAstStepperUpdated; l.StepperUpdated += ILAstStepperUpdated;
language = l; language = l;

Loading…
Cancel
Save