diff --git a/ILSpy/LoadedAssembly.cs b/ILSpy/LoadedAssembly.cs index 0e3051126..479e67e86 100644 --- a/ILSpy/LoadedAssembly.cs +++ b/ILSpy/LoadedAssembly.cs @@ -115,6 +115,22 @@ namespace ICSharpCode.ILSpy MinimalCorlib.Instance); } + ICompilation typeSystemWithOptions; + TypeSystemOptions currentTypeSystemOptions; + + public ICompilation GetTypeSystemOrNull(TypeSystemOptions options) + { + if (typeSystemWithOptions != null && options == currentTypeSystemOptions) + return typeSystemWithOptions; + var module = GetPEFileOrNull(); + if (module == null) + return null; + currentTypeSystemOptions = options; + return typeSystemWithOptions = new SimpleCompilation( + module.WithOptions(options | TypeSystemOptions.Uncached | TypeSystemOptions.KeepModifiers), + MinimalCorlib.Instance); + } + public AssemblyList AssemblyList => assemblyList; public string FileName => fileName; diff --git a/ILSpy/LoadedAssemblyExtensions.cs b/ILSpy/LoadedAssemblyExtensions.cs index c3bceb62b..f2b9c15ed 100644 --- a/ILSpy/LoadedAssemblyExtensions.cs +++ b/ILSpy/LoadedAssemblyExtensions.cs @@ -45,6 +45,11 @@ namespace ICSharpCode.ILSpy return GetLoadedAssembly(file).GetTypeSystemOrNull(); } + public static ICompilation GetTypeSystemWithCurrentOptionsOrNull(this PEFile file) + { + return GetLoadedAssembly(file).GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(new DecompilationOptions().DecompilerSettings)); + } + public static LoadedAssembly GetLoadedAssembly(this PEFile file) { if (file == null) diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs index 6a144c7c4..ec23b1740 100644 --- a/ILSpy/MainWindow.xaml.cs +++ b/ILSpy/MainWindow.xaml.cs @@ -662,6 +662,7 @@ namespace ICSharpCode.ILSpy void filterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e) { + RefreshTreeView(); RefreshTreeViewFilter(); if (e.PropertyName == "Language" || e.PropertyName == "LanguageVersion") { DecompileSelectedNodes(recordHistory: false); @@ -944,6 +945,11 @@ namespace ICSharpCode.ILSpy } void RefreshCommandExecuted(object sender, ExecutedRoutedEventArgs e) + { + RefreshTreeView(); + } + + void RefreshTreeView() { try { refreshInProgress = true; diff --git a/ILSpy/Metadata/CorTables/EventTableTreeNode.cs b/ILSpy/Metadata/CorTables/EventTableTreeNode.cs index b327f0aa0..40504dccd 100644 --- a/ILSpy/Metadata/CorTables/EventTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/EventTableTreeNode.cs @@ -98,7 +98,7 @@ namespace ICSharpCode.ILSpy.Metadata public string Name => metadata.GetString(eventDef.Name); - IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle); + IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle); [StringFormat("X8")] public int Type => MetadataTokens.GetToken(eventDef.Type); diff --git a/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs b/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs index 96a9bf4b7..7e2b89de6 100644 --- a/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/FieldTableTreeNode.cs @@ -104,7 +104,7 @@ namespace ICSharpCode.ILSpy.Metadata public string NameTooltip => $"{MetadataTokens.GetHeapOffset(fieldDef.Name):X} \"{Name}\""; - IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle); + IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle); [StringFormat("X")] public int Signature => MetadataTokens.GetHeapOffset(fieldDef.Signature); diff --git a/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs index 013f67dd9..590662382 100644 --- a/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/MethodTableTreeNode.cs @@ -130,7 +130,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle); + IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle); public MethodDefEntry(PEFile module, MethodDefinitionHandle handle) { diff --git a/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs b/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs index 4b7062f50..1877b7ae7 100644 --- a/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs @@ -98,7 +98,7 @@ namespace ICSharpCode.ILSpy.Metadata public string NameTooltip => $"{MetadataTokens.GetHeapOffset(propertyDef.Name):X} \"{Name}\""; - IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle); + IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle); [StringFormat("X")] public int Signature => MetadataTokens.GetHeapOffset(propertyDef.Signature); diff --git a/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs b/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs index cfd02edfc..4d5e605c4 100644 --- a/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs +++ b/ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs @@ -165,7 +165,7 @@ namespace ICSharpCode.ILSpy.Metadata } } - IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle); + IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle); public TypeDefEntry(PEFile module, TypeDefinitionHandle handle) { diff --git a/ILSpy/Search/LiteralSearchStrategy.cs b/ILSpy/Search/LiteralSearchStrategy.cs index c369d8f6f..a20c5909c 100644 --- a/ILSpy/Search/LiteralSearchStrategy.cs +++ b/ILSpy/Search/LiteralSearchStrategy.cs @@ -56,7 +56,7 @@ namespace ICSharpCode.ILSpy.Search { cancellationToken.ThrowIfCancellationRequested(); var metadata = module.Metadata; - var typeSystem = module.GetTypeSystemOrNull(); + var typeSystem = module.GetTypeSystemWithCurrentOptionsOrNull(); if (typeSystem == null) return; foreach (var handle in metadata.MethodDefinitions) { diff --git a/ILSpy/Search/MemberSearchStrategy.cs b/ILSpy/Search/MemberSearchStrategy.cs index fa1a11662..cbeae69e4 100644 --- a/ILSpy/Search/MemberSearchStrategy.cs +++ b/ILSpy/Search/MemberSearchStrategy.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.ILSpy.Search { cancellationToken.ThrowIfCancellationRequested(); var metadata = module.Metadata; - var typeSystem = module.GetTypeSystemOrNull(); + var typeSystem = module.GetTypeSystemWithCurrentOptionsOrNull(); if (typeSystem == null) return; if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Type) { diff --git a/ILSpy/Search/MetadataTokenSearchStrategy.cs b/ILSpy/Search/MetadataTokenSearchStrategy.cs index b2eec37df..47f6fa070 100644 --- a/ILSpy/Search/MetadataTokenSearchStrategy.cs +++ b/ILSpy/Search/MetadataTokenSearchStrategy.cs @@ -26,7 +26,7 @@ namespace ICSharpCode.ILSpy.Search { cancellationToken.ThrowIfCancellationRequested(); if (searchTermToken.IsNil) return; - var typeSystem = module.GetTypeSystemOrNull(); + var typeSystem = module.GetTypeSystemWithCurrentOptionsOrNull(); if (typeSystem == null) return; var metadataModule = (MetadataModule)typeSystem.MainModule; int row = module.Metadata.GetRowNumber(searchTermToken); diff --git a/ILSpy/Search/NamespaceSearchStrategy.cs b/ILSpy/Search/NamespaceSearchStrategy.cs index 6aca2973a..ffd255139 100644 --- a/ILSpy/Search/NamespaceSearchStrategy.cs +++ b/ILSpy/Search/NamespaceSearchStrategy.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.ILSpy.Search public override void Search(PEFile module, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - var typeSystem = module.GetTypeSystemOrNull(); + var typeSystem = module.GetTypeSystemWithCurrentOptionsOrNull(); if (typeSystem == null) return; var root = ((MetadataModule)typeSystem.MainModule).RootNamespace; diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index 33a5ad24a..5f25530f9 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -139,7 +139,7 @@ namespace ICSharpCode.ILSpy.TreeNodes // if we crashed on loading, then we don't have any children return; } - typeSystem = LoadedAssembly.GetTypeSystemOrNull(); + typeSystem = LoadedAssembly.GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(new DecompilationOptions().DecompilerSettings)); var assembly = (MetadataModule)typeSystem.MainModule; var metadata = module.Metadata; this.Children.Add(new Metadata.MetadataTreeNode(module, this)); diff --git a/ILSpy/TreeNodes/BaseTypesEntryNode.cs b/ILSpy/TreeNodes/BaseTypesEntryNode.cs index df8121e84..ba63adf26 100644 --- a/ILSpy/TreeNodes/BaseTypesEntryNode.cs +++ b/ILSpy/TreeNodes/BaseTypesEntryNode.cs @@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy.TreeNodes var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition; if (t != null) { showExpander = t.DirectBaseTypes.Any(); - var other = t.ParentModule.PEFile.GetTypeSystemOrNull(); + var other = t.ParentModule.PEFile.GetTypeSystemWithCurrentOptionsOrNull(); Debug.Assert(other != null); t = other.FindType(t.FullTypeName).GetDefinition(); } else {