Browse Source

fix naming of explicit interface implementations

pull/728/head
Siegfried Pammer 9 years ago
parent
commit
726a1e085c
  1. 17
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 4
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

17
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -352,7 +352,7 @@ namespace ICSharpCode.Decompiler.CSharp
methodDecl.Body = new BlockStatement(); methodDecl.Body = new BlockStatement();
methodDecl.Body.AddChild(new Comment( methodDecl.Body.AddChild(new Comment(
"ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name), "ILSpy generated this explicit interface implementation from .override directive in " + memberDecl.Name),
Roles.Comment); Roles.Comment);
var forwardingCall = new ThisReferenceExpression().Invoke( var forwardingCall = new ThisReferenceExpression().Invoke(
memberDecl.Name, memberDecl.Name,
methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name)), methodDecl.TypeParameters.Select(tp => new SimpleType(tp.Name)),
@ -530,6 +530,10 @@ namespace ICSharpCode.Decompiler.CSharp
Debug.Assert(decompilationContext.CurrentMember == method); Debug.Assert(decompilationContext.CurrentMember == method);
var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext);
var methodDecl = typeSystemAstBuilder.ConvertEntity(method); 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) { if (methodDefinition.HasBody) {
DecompileBody(methodDefinition, method, methodDecl, decompilationContext, typeSystemAstBuilder); DecompileBody(methodDefinition, method, methodDecl, decompilationContext, typeSystemAstBuilder);
} else if (!method.IsAbstract && method.DeclaringType.Kind != TypeKind.Interface) { } else if (!method.IsAbstract && method.DeclaringType.Kind != TypeKind.Interface) {
@ -537,8 +541,9 @@ namespace ICSharpCode.Decompiler.CSharp
} }
if (decompilationContext.CurrentTypeDefinition.Kind != TypeKind.Interface if (decompilationContext.CurrentTypeDefinition.Kind != TypeKind.Interface
&& method.SymbolKind == SymbolKind.Method && method.SymbolKind == SymbolKind.Method
&& methodDefinition.IsVirtual == methodDefinition.IsNewSlot) && methodDefinition.IsVirtual == methodDefinition.IsNewSlot) {
SetNewModifier(methodDecl); SetNewModifier(methodDecl);
}
return methodDecl; return methodDecl;
} }
@ -612,6 +617,10 @@ namespace ICSharpCode.Decompiler.CSharp
Debug.Assert(decompilationContext.CurrentMember == property); Debug.Assert(decompilationContext.CurrentMember == property);
var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext);
EntityDeclaration propertyDecl = typeSystemAstBuilder.ConvertEntity(property); 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; Accessor getter, setter;
if (propertyDecl is PropertyDeclaration) { if (propertyDecl is PropertyDeclaration) {
getter = ((PropertyDeclaration)propertyDecl).Getter; getter = ((PropertyDeclaration)propertyDecl).Getter;
@ -638,6 +647,10 @@ namespace ICSharpCode.Decompiler.CSharp
var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext);
typeSystemAstBuilder.UseCustomEvents = true; typeSystemAstBuilder.UseCustomEvents = true;
var eventDecl = (CustomEventDeclaration)typeSystemAstBuilder.ConvertEntity(ev); 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) { if (eventDefinition.AddMethod != null && eventDefinition.AddMethod.HasBody) {
DecompileBody(eventDefinition.AddMethod, ev.AddAccessor, eventDecl.AddAccessor, decompilationContext, typeSystemAstBuilder); DecompileBody(eventDefinition.AddMethod, ev.AddAccessor, eventDecl.AddAccessor, decompilationContext, typeSystemAstBuilder);
} }

4
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -658,11 +658,13 @@ namespace ICSharpCode.Decompiler.CSharp
} }
} else { } else {
Expression targetExpr = target.Expression; 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. // HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method.
if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) { if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) {
targetExpr = targetExpr.CastTo(ConvertType(inst.Method.ImplementedInterfaceMembers[0].DeclaringType)); 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))); mre.TypeArguments.AddRange(inst.Method.TypeArguments.Select(a => ConvertType(a)));
expr = new InvocationExpression(mre, argumentExpressions); expr = new InvocationExpression(mre, argumentExpressions);
} }

Loading…
Cancel
Save