From 6073106cfe86d861ffaa74cdada8e936c0755e5d Mon Sep 17 00:00:00 2001 From: de4dot Date: Mon, 5 Dec 2011 18:11:34 +0100 Subject: [PATCH] Restore explicitly overridden props/events --- de4dot.code/renamer/Renamer.cs | 120 ++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 33 deletions(-) diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index bde5b76b..c0335250 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -461,8 +461,26 @@ namespace de4dot.renamer { void restoreVirtualProperties(IEnumerable allScopes) { if (!RestoreProperties) return; - foreach (var scope in allScopes) + foreach (var scope in allScopes) { restoreVirtualProperties(scope); + restoreExplicitVirtualProperties(scope); + } + } + + void restoreExplicitVirtualProperties(MethodNameScope scope) { + if (scope.Methods.Count != 1) + return; + var propMethod = scope.Methods[0]; + if (propMethod.Property != null) + return; + if (propMethod.MethodDefinition.Overrides.Count == 0) + return; + + var theProperty = getOverriddenProperty(propMethod); + if (theProperty == null) + return; + + createProperty(theProperty, propMethod); } void restoreVirtualProperties(MethodNameScope scope) { @@ -485,15 +503,18 @@ namespace de4dot.renamer { if (missingProps == null) return; - foreach (var method in missingProps) { - if (!method.Owner.HasModule) - continue; + foreach (var method in missingProps) + createProperty(prop, method); + } - if (method.MethodDefinition.MethodReturnType.ReturnType.FullName == "System.Void") - createPropertySetter(prop.PropertyDefinition.Name, method); - else - createPropertyGetter(prop.PropertyDefinition.Name, method); - } + void createProperty(PropertyDef propDef, MethodDef methodDef) { + if (!methodDef.Owner.HasModule) + return; + + if (methodDef.MethodDefinition.MethodReturnType.ReturnType.FullName == "System.Void") + createPropertySetter(propDef.PropertyDefinition.Name, methodDef); + else + createPropertyGetter(propDef.PropertyDefinition.Name, methodDef); } void restorePropertiesFromNames(IEnumerable allScopes) { @@ -611,8 +632,10 @@ namespace de4dot.renamer { void restoreVirtualEvents(IEnumerable allScopes) { if (!RestoreEvents) return; - foreach (var scope in allScopes) + foreach (var scope in allScopes) { restoreVirtualEvents(scope); + restoreExplicitVirtualEvents(scope); + } } enum EventMethodType { @@ -623,6 +646,23 @@ namespace de4dot.renamer { Raiser, } + void restoreExplicitVirtualEvents(MethodNameScope scope) { + if (scope.Methods.Count != 1) + return; + var eventMethod = scope.Methods[0]; + if (eventMethod.Event != null) + return; + if (eventMethod.MethodDefinition.Overrides.Count == 0) + return; + + MethodDef overriddenMethod; + var theEvent = getOverriddenEvent(eventMethod, out overriddenMethod); + if (theEvent == null) + return; + + createEvent(theEvent, eventMethod, getEventMethodType(overriddenMethod)); + } + void restoreVirtualEvents(MethodNameScope scope) { if (scope.Methods.Count <= 1 || !scope.hasEvent()) return; @@ -638,14 +678,7 @@ namespace de4dot.renamer { } else if (evt == null) { evt = method.Event; - if (evt.AddMethod == method) - methodType = EventMethodType.Adder; - else if (evt.RemoveMethod == method) - methodType = EventMethodType.Remover; - else if (evt.RaiseMethod == method) - methodType = EventMethodType.Raiser; - else - methodType = EventMethodType.Other; + methodType = getEventMethodType(method); } } if (evt == null) @@ -653,21 +686,37 @@ namespace de4dot.renamer { if (missingEvents == null) return; - foreach (var method in missingEvents) { - if (!method.Owner.HasModule) - continue; + foreach (var method in missingEvents) + createEvent(evt, method, methodType); + } - switch (methodType) { - case EventMethodType.Adder: - createEventAdder(evt.EventDefinition.Name, method); - break; - case EventMethodType.Remover: - createEventRemover(evt.EventDefinition.Name, method); - break; - } + void createEvent(EventDef eventDef, MethodDef methodDef, EventMethodType methodType) { + if (!methodDef.Owner.HasModule) + return; + + switch (methodType) { + case EventMethodType.Adder: + createEventAdder(eventDef.EventDefinition.Name, methodDef); + break; + case EventMethodType.Remover: + createEventRemover(eventDef.EventDefinition.Name, methodDef); + break; } } + static EventMethodType getEventMethodType(MethodDef method) { + var evt = method.Event; + if (evt == null) + return EventMethodType.None; + if (evt.AddMethod == method) + return EventMethodType.Adder; + if (evt.RemoveMethod == method) + return EventMethodType.Remover; + if (evt.RaiseMethod == method) + return EventMethodType.Raiser; + return EventMethodType.Other; + } + void restoreEventsFromNames(IEnumerable allScopes) { if (!RestoreEventsFromNames) return; @@ -1023,8 +1072,13 @@ namespace de4dot.renamer { } EventDef getOverriddenEvent(MethodDef overrideMethod) { + MethodDef overriddenMethod; + return getOverriddenEvent(overrideMethod, out overriddenMethod); + } + + EventDef getOverriddenEvent(MethodDef overrideMethod, out MethodDef overriddenMethod) { var theMethod = overrideMethod.MethodDefinition.Overrides[0]; - var overriddenMethod = modules.resolve(theMethod); + overriddenMethod = modules.resolve(theMethod); if (overriddenMethod != null) return overriddenMethod.Event; @@ -1034,9 +1088,9 @@ namespace de4dot.renamer { var extTypeDef = modules.resolveOther(extType); if (extTypeDef == null) return null; - var theMethodDef = extTypeDef.find(theMethod); - if (theMethodDef != null) - return theMethodDef.Event; + overriddenMethod = extTypeDef.find(theMethod); + if (overriddenMethod != null) + return overriddenMethod.Event; return null; }