From ff28004e5a2cdb1d35053a6e897b423187a4ae72 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 10 Apr 2011 21:30:29 +0200 Subject: [PATCH] Don't introduce usings when only a single method is being decompiled. --- .../Ast/Transforms/IntroduceExtensionMethods.cs | 5 ++++- ICSharpCode.Decompiler/DecompilerSettings.cs | 7 +++++++ ILSpy/CSharpLanguage.cs | 17 +++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ICSharpCode.Decompiler/Ast/Transforms/IntroduceExtensionMethods.cs b/ICSharpCode.Decompiler/Ast/Transforms/IntroduceExtensionMethods.cs index a1bdb0807..919731b6a 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/IntroduceExtensionMethods.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/IntroduceExtensionMethods.cs @@ -31,8 +31,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms foreach (var ca in d.CustomAttributes) { if (ca.AttributeType.Name == "ExtensionAttribute" && ca.AttributeType.Namespace == "System.Runtime.CompilerServices") { mre.Target = invocation.Arguments.First().Detach(); - if (invocation.Arguments.Any()) + if (invocation.Arguments.Any()) { + // HACK: removing type arguments should be done indepently from whether a method is an extension method, + // just by testing whether the arguments can be inferred mre.TypeArguments.Clear(); + } break; } } diff --git a/ICSharpCode.Decompiler/DecompilerSettings.cs b/ICSharpCode.Decompiler/DecompilerSettings.cs index 17a0f7d90..6c93f1d44 100644 --- a/ICSharpCode.Decompiler/DecompilerSettings.cs +++ b/ICSharpCode.Decompiler/DecompilerSettings.cs @@ -172,5 +172,12 @@ namespace ICSharpCode.Decompiler PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } + + public DecompilerSettings Clone() + { + DecompilerSettings settings = (DecompilerSettings)MemberwiseClone(); + settings.PropertyChanged = null; + return settings; + } } } diff --git a/ILSpy/CSharpLanguage.cs b/ILSpy/CSharpLanguage.cs index f98c4b41e..778cbf3c4 100644 --- a/ILSpy/CSharpLanguage.cs +++ b/ILSpy/CSharpLanguage.cs @@ -84,7 +84,7 @@ namespace ICSharpCode.ILSpy public override void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options) { WriteCommentLine(output, TypeToString(method.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: method.DeclaringType); + AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: method.DeclaringType, isSingleMember: true); codeDomBuilder.AddMethod(method); codeDomBuilder.RunTransformations(transformAbortCondition); codeDomBuilder.GenerateCode(output); @@ -93,7 +93,7 @@ namespace ICSharpCode.ILSpy public override void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options) { WriteCommentLine(output, TypeToString(property.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: property.DeclaringType); + AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: property.DeclaringType, isSingleMember: true); codeDomBuilder.AddProperty(property); codeDomBuilder.RunTransformations(transformAbortCondition); codeDomBuilder.GenerateCode(output); @@ -102,7 +102,7 @@ namespace ICSharpCode.ILSpy public override void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options) { WriteCommentLine(output, TypeToString(field.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: field.DeclaringType); + AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: field.DeclaringType, isSingleMember: true); codeDomBuilder.AddField(field); codeDomBuilder.RunTransformations(transformAbortCondition); codeDomBuilder.GenerateCode(output); @@ -111,7 +111,7 @@ namespace ICSharpCode.ILSpy public override void DecompileEvent(EventDefinition ev, ITextOutput output, DecompilationOptions options) { WriteCommentLine(output, TypeToString(ev.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: ev.DeclaringType); + AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: ev.DeclaringType, isSingleMember: true); codeDomBuilder.AddEvent(ev); codeDomBuilder.RunTransformations(transformAbortCondition); codeDomBuilder.GenerateCode(output); @@ -387,15 +387,20 @@ namespace ICSharpCode.ILSpy } #endregion - AstBuilder CreateAstBuilder(DecompilationOptions options, ModuleDefinition currentModule = null, TypeDefinition currentType = null) + AstBuilder CreateAstBuilder(DecompilationOptions options, ModuleDefinition currentModule = null, TypeDefinition currentType = null, bool isSingleMember = false) { if (currentModule == null) currentModule = currentType.Module; + DecompilerSettings settings = options.DecompilerSettings; + if (isSingleMember) { + settings = settings.Clone(); + settings.UsingDeclarations = false; + } return new AstBuilder( new DecompilerContext(currentModule) { CancellationToken = options.CancellationToken, CurrentType = currentType, - Settings = options.DecompilerSettings + Settings = settings }); }