Browse Source

Fixed decompilation of WinRT classes (methods implementing interfaces were misdetected as explicit interface implementations)

pull/205/merge
Daniel Grunwald 14 years ago
parent
commit
fc58b40400
  1. 15
      ICSharpCode.Decompiler/Ast/AstBuilder.cs

15
ICSharpCode.Decompiler/Ast/AstBuilder.cs

@ -743,12 +743,12 @@ namespace ICSharpCode.Decompiler.Ast
// constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly // constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly
if (!methodDef.IsVirtual || (methodDef.IsNewSlot && !methodDef.IsPrivate)) astMethod.Constraints.AddRange(MakeConstraints(methodDef.GenericParameters)); if (!methodDef.IsVirtual || (methodDef.IsNewSlot && !methodDef.IsPrivate)) astMethod.Constraints.AddRange(MakeConstraints(methodDef.GenericParameters));
if (!methodDef.DeclaringType.IsInterface) { if (!methodDef.DeclaringType.IsInterface) {
if (!methodDef.HasOverrides) { if (IsExplicitInterfaceImplementation(methodDef)) {
astMethod.PrivateImplementationType = ConvertType(methodDef.Overrides.First().DeclaringType);
} else {
astMethod.Modifiers = ConvertModifiers(methodDef); astMethod.Modifiers = ConvertModifiers(methodDef);
if (methodDef.IsVirtual == methodDef.IsNewSlot) if (methodDef.IsVirtual == methodDef.IsNewSlot)
SetNewModifier(astMethod); SetNewModifier(astMethod);
} else {
astMethod.PrivateImplementationType = ConvertType(methodDef.Overrides.First().DeclaringType);
} }
astMethod.Body = CreateMethodBody(methodDef, astMethod.Parameters); astMethod.Body = CreateMethodBody(methodDef, astMethod.Parameters);
} }
@ -778,6 +778,11 @@ namespace ICSharpCode.Decompiler.Ast
} }
return astMethod; return astMethod;
} }
bool IsExplicitInterfaceImplementation(MethodDefinition methodDef)
{
return methodDef.HasOverrides && methodDef.IsPrivate;
}
IEnumerable<TypeParameterDeclaration> MakeTypeParameters(IEnumerable<GenericParameter> genericParameters) IEnumerable<TypeParameterDeclaration> MakeTypeParameters(IEnumerable<GenericParameter> genericParameters)
{ {
@ -861,7 +866,7 @@ namespace ICSharpCode.Decompiler.Ast
var accessor = propDef.GetMethod ?? propDef.SetMethod; var accessor = propDef.GetMethod ?? propDef.SetMethod;
Modifiers getterModifiers = Modifiers.None; Modifiers getterModifiers = Modifiers.None;
Modifiers setterModifiers = Modifiers.None; Modifiers setterModifiers = Modifiers.None;
if (accessor.HasOverrides) { if (IsExplicitInterfaceImplementation(accessor)) {
astProp.PrivateImplementationType = ConvertType(accessor.Overrides.First().DeclaringType); astProp.PrivateImplementationType = ConvertType(accessor.Overrides.First().DeclaringType);
} else if (!propDef.DeclaringType.IsInterface) { } else if (!propDef.DeclaringType.IsInterface) {
getterModifiers = ConvertModifiers(propDef.GetMethod); getterModifiers = ConvertModifiers(propDef.GetMethod);
@ -967,7 +972,7 @@ namespace ICSharpCode.Decompiler.Ast
astEvent.AddAnnotation(eventDef); astEvent.AddAnnotation(eventDef);
astEvent.Name = CleanName(eventDef.Name); astEvent.Name = CleanName(eventDef.Name);
astEvent.ReturnType = ConvertType(eventDef.EventType, eventDef); astEvent.ReturnType = ConvertType(eventDef.EventType, eventDef);
if (eventDef.AddMethod == null || !eventDef.AddMethod.HasOverrides) if (eventDef.AddMethod == null || !IsExplicitInterfaceImplementation(eventDef.AddMethod))
astEvent.Modifiers = ConvertModifiers(eventDef.AddMethod); astEvent.Modifiers = ConvertModifiers(eventDef.AddMethod);
else else
astEvent.PrivateImplementationType = ConvertType(eventDef.AddMethod.Overrides.First().DeclaringType); astEvent.PrivateImplementationType = ConvertType(eventDef.AddMethod.Overrides.First().DeclaringType);

Loading…
Cancel
Save