From 726a1e085c57e33985e64ac2f691fb2fab98df06 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Jun 2016 10:14:34 +0900 Subject: [PATCH] fix naming of explicit interface implementations --- .../CSharp/CSharpDecompiler.cs | 17 +++++++++++++++-- .../CSharp/ExpressionBuilder.cs | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 563141b9e..7529cbb8e 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -352,7 +352,7 @@ namespace ICSharpCode.Decompiler.CSharp methodDecl.Body = new BlockStatement(); methodDecl.Body.AddChild(new Comment( "ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name), - Roles.Comment); + Roles.Comment); var forwardingCall = new ThisReferenceExpression().Invoke( memberDecl.Name, methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name)), @@ -530,6 +530,10 @@ namespace ICSharpCode.Decompiler.CSharp Debug.Assert(decompilationContext.CurrentMember == method); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); var methodDecl = typeSystemAstBuilder.ConvertEntity(method); + int lastDot = method.Name.LastIndexOf('.'); + if (method.IsExplicitInterfaceImplementation && lastDot >= 0) { + methodDecl.Name = method.Name.Substring(lastDot + 1); + } if (methodDefinition.HasBody) { DecompileBody(methodDefinition, method, methodDecl, decompilationContext, typeSystemAstBuilder); } else if (!method.IsAbstract && method.DeclaringType.Kind != TypeKind.Interface) { @@ -537,8 +541,9 @@ namespace ICSharpCode.Decompiler.CSharp } if (decompilationContext.CurrentTypeDefinition.Kind != TypeKind.Interface && method.SymbolKind == SymbolKind.Method - && methodDefinition.IsVirtual == methodDefinition.IsNewSlot) + && methodDefinition.IsVirtual == methodDefinition.IsNewSlot) { SetNewModifier(methodDecl); + } return methodDecl; } @@ -612,6 +617,10 @@ namespace ICSharpCode.Decompiler.CSharp Debug.Assert(decompilationContext.CurrentMember == property); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); EntityDeclaration propertyDecl = typeSystemAstBuilder.ConvertEntity(property); + int lastDot = property.Name.LastIndexOf('.'); + if (property.IsExplicitInterfaceImplementation && !property.IsIndexer) { + propertyDecl.Name = property.Name.Substring(lastDot + 1); + } Accessor getter, setter; if (propertyDecl is PropertyDeclaration) { getter = ((PropertyDeclaration)propertyDecl).Getter; @@ -638,6 +647,10 @@ namespace ICSharpCode.Decompiler.CSharp var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); typeSystemAstBuilder.UseCustomEvents = true; var eventDecl = (CustomEventDeclaration)typeSystemAstBuilder.ConvertEntity(ev); + int lastDot = ev.Name.LastIndexOf('.'); + if (ev.IsExplicitInterfaceImplementation) { + eventDecl.Name = ev.Name.Substring(lastDot + 1); + } if (eventDefinition.AddMethod != null && eventDefinition.AddMethod.HasBody) { DecompileBody(eventDefinition.AddMethod, ev.AddAccessor, eventDecl.AddAccessor, decompilationContext, typeSystemAstBuilder); } diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 395568912..bf38d65b2 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -658,11 +658,13 @@ namespace ICSharpCode.Decompiler.CSharp } } else { Expression targetExpr = target.Expression; + string methodName = inst.Method.Name; // HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method. if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) { targetExpr = targetExpr.CastTo(ConvertType(inst.Method.ImplementedInterfaceMembers[0].DeclaringType)); + methodName = inst.Method.ImplementedInterfaceMembers[0].Name; } - var mre = new MemberReferenceExpression(targetExpr, inst.Method.Name); + var mre = new MemberReferenceExpression(targetExpr, methodName); mre.TypeArguments.AddRange(inst.Method.TypeArguments.Select(a => ConvertType(a))); expr = new InvocationExpression(mre, argumentExpressions); }