diff --git a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs index 6db603fcd..be7ed7dd8 100644 --- a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs +++ b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs @@ -337,10 +337,7 @@ namespace ICSharpCode.Decompiler.Disassembler VariableReference variableRef = operand as VariableReference; if (variableRef != null) { - if (string.IsNullOrEmpty(variableRef.Name)) - writer.WriteReference(variableRef.Index.ToString(), variableRef); - else - writer.WriteReference(Escape(variableRef.Name), variableRef); + writer.WriteReference(variableRef.Index.ToString(), variableRef); return; } diff --git a/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs b/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs index 534bfe9d1..a3f85c9a4 100644 --- a/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs +++ b/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs @@ -92,10 +92,6 @@ namespace ICSharpCode.Decompiler.Disassembler foreach (var v in body.Variables) { output.WriteDefinition("[" + v.Index + "] ", v); v.VariableType.WriteTo(output); - if (!string.IsNullOrEmpty(v.Name)) { - output.Write(' '); - output.Write(DisassemblerHelpers.Escape(v.Name)); - } if (v.Index + 1 < body.Variables.Count) output.Write(','); output.WriteLine(); diff --git a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs index d03bdfd51..70c60b334 100644 --- a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs +++ b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs @@ -851,7 +851,9 @@ namespace ICSharpCode.Decompiler.Disassembler output.Write("implements "); else output.Write(" "); - type.Interfaces[index].WriteTo(output, ILNameSyntax.TypeName); + var iface = type.Interfaces[index]; + WriteAttributes(iface.CustomAttributes); + iface.InterfaceType.WriteTo(output, ILNameSyntax.TypeName); } output.WriteLine(); output.Unindent(); diff --git a/ICSharpCode.Decompiler/IL/ILReader.cs b/ICSharpCode.Decompiler/IL/ILReader.cs index 7b632a8cc..90125829d 100644 --- a/ICSharpCode.Decompiler/IL/ILReader.cs +++ b/ICSharpCode.Decompiler/IL/ILReader.cs @@ -122,10 +122,7 @@ namespace ICSharpCode.Decompiler.IL { VariableKind kind = v.IsPinned ? VariableKind.PinnedLocal : VariableKind.Local; ILVariable ilVar = new ILVariable(kind, typeSystem.Resolve(v.VariableType), v.Index); - if (string.IsNullOrEmpty(v.Name)) - ilVar.Name = "V_" + v.Index; - else - ilVar.Name = v.Name; + ilVar.Name = "V_" + v.Index; return ilVar; } diff --git a/ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs b/ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs index 27b1875a5..623b2024f 100644 --- a/ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs +++ b/ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs @@ -78,7 +78,8 @@ namespace ICSharpCode.Decompiler.Tests } throw new Exception(b.ToString()); } - return AssemblyDefinition.ReadAssembly(results.PathToAssembly); + return AssemblyDefinition.ReadAssembly(results.PathToAssembly, + new ReaderParameters { InMemory = true }); } finally { diff --git a/ICSharpCode.Decompiler/Tests/Helpers/Tester.cs b/ICSharpCode.Decompiler/Tests/Helpers/Tester.cs index 452b20a84..ed1f3c31c 100644 --- a/ICSharpCode.Decompiler/Tests/Helpers/Tester.cs +++ b/ICSharpCode.Decompiler/Tests/Helpers/Tester.cs @@ -206,20 +206,22 @@ namespace ICSharpCode.Decompiler.Tests.Helpers public static string DecompileCSharp(string assemblyFileName) { - var typeSystem = new DecompilerTypeSystem(ModuleDefinition.ReadModule(assemblyFileName)); - CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, new DecompilerSettings()); - decompiler.AstTransforms.Insert(0, new RemoveCompilerAttribute()); - decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers()); - var syntaxTree = decompiler.DecompileWholeModuleAsSingleFile(); - - StringWriter output = new StringWriter(); - var visitor = new CSharpOutputVisitor(output, FormattingOptionsFactory.CreateSharpDevelop()); - syntaxTree.AcceptVisitor(visitor); + using (var module = ModuleDefinition.ReadModule(assemblyFileName)) { + var typeSystem = new DecompilerTypeSystem(module); + CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, new DecompilerSettings()); + decompiler.AstTransforms.Insert(0, new RemoveCompilerAttribute()); + decompiler.AstTransforms.Add(new EscapeInvalidIdentifiers()); + var syntaxTree = decompiler.DecompileWholeModuleAsSingleFile(); + + StringWriter output = new StringWriter(); + var visitor = new CSharpOutputVisitor(output, FormattingOptionsFactory.CreateSharpDevelop()); + syntaxTree.AcceptVisitor(visitor); - string fileName = Path.GetTempFileName(); - File.WriteAllText(fileName, output.ToString()); + string fileName = Path.GetTempFileName(); + File.WriteAllText(fileName, output.ToString()); - return fileName; + return fileName; + } } public static void RunAndCompareOutput(string testFileName, string outputFile, string decompiledOutputFile, string decompiledCodeFile = null) diff --git a/ICSharpCode.Decompiler/Tests/Helpers/TypeSystemHelper.cs b/ICSharpCode.Decompiler/Tests/Helpers/TypeSystemHelper.cs index e39ee4163..af7ff04a3 100644 --- a/ICSharpCode.Decompiler/Tests/Helpers/TypeSystemHelper.cs +++ b/ICSharpCode.Decompiler/Tests/Helpers/TypeSystemHelper.cs @@ -31,8 +31,9 @@ namespace ICSharpCode.Decompiler.Tests.Helpers { static readonly Lazy decompilerTypeSystem = new Lazy( delegate { - var module = ModuleDefinition.ReadModule(typeof(TypeSystem).Module.FullyQualifiedName); - return new DecompilerTypeSystem(module); + using (var module = ModuleDefinition.ReadModule(typeof(TypeSystem).Module.FullyQualifiedName)) { + return new DecompilerTypeSystem(module); + } }); public static DecompilerTypeSystem Instance { diff --git a/ICSharpCode.Decompiler/Tests/RoundtripAssembly.cs b/ICSharpCode.Decompiler/Tests/RoundtripAssembly.cs index 4193bebd9..737efba64 100644 --- a/ICSharpCode.Decompiler/Tests/RoundtripAssembly.cs +++ b/ICSharpCode.Decompiler/Tests/RoundtripAssembly.cs @@ -128,7 +128,10 @@ namespace ICSharpCode.Decompiler.Tests Stopwatch w = Stopwatch.StartNew(); DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(inputDir); - var module = ModuleDefinition.ReadModule(file, new ReaderParameters { AssemblyResolver = resolver }); + var module = ModuleDefinition.ReadModule(file, new ReaderParameters { + AssemblyResolver = resolver, + InMemory = true + }); var decompiler = new TestProjectDecompiler(inputDir); // use a fixed GUID so that we can diff the output between different ILSpy runs without spurious changes decompiler.ProjectGuid = Guid.Parse("{127C83E4-4587-4CF9-ADCA-799875F3DFE6}"); diff --git a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs index c25a8de96..322c7e5f7 100644 --- a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs +++ b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs @@ -272,8 +272,9 @@ namespace ICSharpCode.Decompiler.TypeSystem if (fileName == null) throw new ArgumentNullException("fileName"); var param = new ReaderParameters { AssemblyResolver = new DummyAssemblyResolver() }; - ModuleDefinition module = ModuleDefinition.ReadModule(fileName, param); - return LoadModule(module); + using (ModuleDefinition module = ModuleDefinition.ReadModule(fileName, param)) { + return LoadModule(module); + } } // used to prevent Cecil from loading referenced assemblies @@ -298,6 +299,10 @@ namespace ICSharpCode.Decompiler.TypeSystem { return null; } + + public void Dispose() + { + } } #endregion @@ -898,8 +903,8 @@ namespace ICSharpCode.Decompiler.TypeSystem baseTypes.Add(ReadTypeReference(typeDefinition.BaseType)); } if (typeDefinition.HasInterfaces) { - foreach (TypeReference iface in typeDefinition.Interfaces) { - baseTypes.Add(ReadTypeReference(iface)); + foreach (var iface in typeDefinition.Interfaces) { + baseTypes.Add(ReadTypeReference(iface.InterfaceType)); } } } diff --git a/ILSpy.BamlDecompiler/CecilType.cs b/ILSpy.BamlDecompiler/CecilType.cs index 69d7bbf8b..383e8da4a 100644 --- a/ILSpy.BamlDecompiler/CecilType.cs +++ b/ILSpy.BamlDecompiler/CecilType.cs @@ -43,7 +43,7 @@ namespace ILSpy.BamlDecompiler if (t == ct.type) return true; foreach (var @interface in t.Interfaces) { - var resolved = @interface.Resolve(); + var resolved = @interface.InterfaceType.Resolve(); if (resolved == ct.type) return true; } diff --git a/ILSpy/LoadedAssembly.cs b/ILSpy/LoadedAssembly.cs index 5ce3b83fb..9871bacab 100644 --- a/ILSpy/LoadedAssembly.cs +++ b/ILSpy/LoadedAssembly.cs @@ -113,6 +113,7 @@ namespace ICSharpCode.ILSpy // runs on background thread ReaderParameters p = new ReaderParameters(); p.AssemblyResolver = new MyAssemblyResolver(this); + p.InMemory = true; if (stream != null) { @@ -207,6 +208,10 @@ namespace ICSharpCode.ILSpy var node = parent.LookupReferencedAssembly(fullName); return node != null ? node.AssemblyDefinition : null; } + + public void Dispose() + { + } } public IAssemblyResolver GetAssemblyResolver() diff --git a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceEventImplementedByTreeNode.cs b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceEventImplementedByTreeNode.cs index c0021b5b4..254238c5f 100644 --- a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceEventImplementedByTreeNode.cs +++ b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceEventImplementedByTreeNode.cs @@ -56,7 +56,7 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer { if (!type.HasInterfaces) yield break; - TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.Resolve() == analyzedMethod.DeclaringType); + TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.InterfaceType.Resolve() == analyzedMethod.DeclaringType)?.InterfaceType; if (implementedInterfaceRef == null) yield break; diff --git a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceMethodImplementedByTreeNode.cs b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceMethodImplementedByTreeNode.cs index 7c82b7a76..64e14ca44 100644 --- a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceMethodImplementedByTreeNode.cs +++ b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfaceMethodImplementedByTreeNode.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer { if (!type.HasInterfaces) yield break; - TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.Resolve() == analyzedMethod.DeclaringType); + TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.InterfaceType.Resolve() == analyzedMethod.DeclaringType)?.InterfaceType; if (implementedInterfaceRef == null) yield break; diff --git a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfacePropertyImplementedByTreeNode.cs b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfacePropertyImplementedByTreeNode.cs index 8a7311e74..5ca10a805 100644 --- a/ILSpy/TreeNodes/Analyzer/AnalyzedInterfacePropertyImplementedByTreeNode.cs +++ b/ILSpy/TreeNodes/Analyzer/AnalyzedInterfacePropertyImplementedByTreeNode.cs @@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer { if (!type.HasInterfaces) yield break; - TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.Resolve() == analyzedMethod.DeclaringType); + TypeReference implementedInterfaceRef = type.Interfaces.FirstOrDefault(i => i.InterfaceType.Resolve() == analyzedMethod.DeclaringType)?.InterfaceType; if (implementedInterfaceRef == null) yield break; diff --git a/ILSpy/TreeNodes/Analyzer/AnalyzedTypeUsedByTreeNode.cs b/ILSpy/TreeNodes/Analyzer/AnalyzedTypeUsedByTreeNode.cs index 921aed65f..a3aca579a 100644 --- a/ILSpy/TreeNodes/Analyzer/AnalyzedTypeUsedByTreeNode.cs +++ b/ILSpy/TreeNodes/Analyzer/AnalyzedTypeUsedByTreeNode.cs @@ -93,7 +93,7 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer { return IsUsedInTypeReference(type) || TypeMatches(type.BaseType) - || IsUsedInTypeReferences(type.Interfaces); + || IsUsedInTypeReferences(type.Interfaces.Select(i => i.InterfaceType)); } private bool IsUsedInFieldReference(FieldReference field) diff --git a/ILSpy/TreeNodes/BaseTypesTreeNode.cs b/ILSpy/TreeNodes/BaseTypesTreeNode.cs index 610458cdf..7de1839a3 100644 --- a/ILSpy/TreeNodes/BaseTypesTreeNode.cs +++ b/ILSpy/TreeNodes/BaseTypesTreeNode.cs @@ -56,8 +56,8 @@ namespace ICSharpCode.ILSpy.TreeNodes { if (type.BaseType != null) children.Add(new BaseTypesEntryNode(type.BaseType, false)); - foreach (TypeReference i in type.Interfaces) { - children.Add(new BaseTypesEntryNode(i, true)); + foreach (var i in type.Interfaces) { + children.Add(new BaseTypesEntryNode(i.InterfaceType, true)); } } diff --git a/ILSpy/TreeNodes/DerivedTypesTreeNode.cs b/ILSpy/TreeNodes/DerivedTypesTreeNode.cs index 12e872842..440ab60bf 100644 --- a/ILSpy/TreeNodes/DerivedTypesTreeNode.cs +++ b/ILSpy/TreeNodes/DerivedTypesTreeNode.cs @@ -70,8 +70,8 @@ namespace ICSharpCode.ILSpy.TreeNodes foreach (TypeDefinition td in TreeTraversal.PreOrder(module.Types, t => t.NestedTypes)) { cancellationToken.ThrowIfCancellationRequested(); if (type.IsInterface && td.HasInterfaces) { - foreach (TypeReference typeRef in td.Interfaces) { - if (IsSameType(typeRef, type)) + foreach (var iface in td.Interfaces) { + if (IsSameType(iface.InterfaceType, type)) yield return new DerivedTypesEntryNode(td, assemblies); } } else if (!type.IsInterface && td.BaseType != null && IsSameType(td.BaseType, type)) { diff --git a/cecil b/cecil index 53df0bc39..8a3eedc7f 160000 --- a/cecil +++ b/cecil @@ -1 +1 @@ -Subproject commit 53df0bc39e48d8544020856e83f8d8a2e11c8a3a +Subproject commit 8a3eedc7ff08fd30484da5874d1e18db9f3ff7ab