Make sure initializeEventHandlerNames() is called after renaming props

This commit is contained in:
de4dot 2011-11-23 11:34:11 +01:00
parent 80f90d3e6a
commit ae5001b239
2 changed files with 72 additions and 54 deletions

View File

@ -789,29 +789,77 @@ namespace de4dot.renamer {
prepareRenameEntryPoints(); prepareRenameEntryPoints();
foreach (var typeDef in modules.AllTypes) var virtualMethods = new ScopeHelper(memberInfos, modules.AllTypes);
prepareRenameMembers(typeDef); var ifaceMethods = new ScopeHelper(memberInfos, modules.AllTypes);
var propMethods = new ScopeHelper(memberInfos, modules.AllTypes);
var eventMethods = new ScopeHelper(memberInfos, modules.AllTypes);
foreach (var scope in getSorted(scopes)) {
if (scope.hasNonRenamableMethod())
continue;
else if (scope.hasGetterOrSetterPropertyMethod() && getPropertyMethodType(scope.Methods[0]) != PropertyMethodType.Other)
propMethods.add(scope);
else if (scope.hasAddRemoveOrRaiseEventMethod())
eventMethods.add(scope);
else if (scope.hasInterfaceMethod())
ifaceMethods.add(scope);
else
virtualMethods.add(scope);
}
prepareRenameVirtualMethods(scopes); var prepareHelper = new PrepareHelper(memberInfos, modules.AllTypes);
prepareHelper.prepare((info) => info.prepareRenameMembers());
prepareHelper.prepare((info) => info.prepareRenamePropsAndEvents());
propMethods.visitAll((scope) => prepareRenameProperty(scope, false));
eventMethods.visitAll((scope) => prepareRenameEvent(scope, false));
propMethods.visitAll((scope) => prepareRenameProperty(scope, true));
eventMethods.visitAll((scope) => prepareRenameEvent(scope, true));
foreach (var typeDef in modules.AllTypes)
memberInfos.type(typeDef).initializeEventHandlerNames();
prepareHelper.prepare((info) => info.prepareRenameMethods());
virtualMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "vmethod_", false));
ifaceMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "imethod_", false));
virtualMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "vmethod_", true));
ifaceMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "imethod_", true));
foreach (var typeDef in modules.AllTypes) foreach (var typeDef in modules.AllTypes)
memberInfos.type(typeDef).prepareRenameMethods2(); memberInfos.type(typeDef).prepareRenameMethods2();
} }
Dictionary<TypeDef, bool> prepareRenameMembersCalled = new Dictionary<TypeDef, bool>(); class PrepareHelper {
void prepareRenameMembers(TypeDef type) { Dictionary<TypeDef, bool> prepareMethodCalled = new Dictionary<TypeDef, bool>();
if (prepareRenameMembersCalled.ContainsKey(type)) MemberInfos memberInfos;
return; Action<TypeInfo> func;
prepareRenameMembersCalled[type] = true; IEnumerable<TypeDef> allTypes;
foreach (var ifaceInfo in type.interfaces) public PrepareHelper(MemberInfos memberInfos, IEnumerable<TypeDef> allTypes) {
prepareRenameMembers(ifaceInfo.typeDef); this.memberInfos = memberInfos;
if (type.baseType != null) this.allTypes = allTypes;
prepareRenameMembers(type.baseType.typeDef); }
TypeInfo info; public void prepare(Action<TypeInfo> func) {
if (memberInfos.tryGetType(type, out info)) this.func = func;
info.prepareRenameMembers(); prepareMethodCalled.Clear();
foreach (var typeDef in allTypes)
prepare(typeDef);
}
void prepare(TypeDef type) {
if (prepareMethodCalled.ContainsKey(type))
return;
prepareMethodCalled[type] = true;
foreach (var ifaceInfo in type.interfaces)
prepare(ifaceInfo.typeDef);
if (type.baseType != null)
prepare(type.baseType.typeDef);
TypeInfo info;
if (memberInfos.tryGetType(type, out info))
func(info);
}
} }
static List<MethodNameScope> getSorted(MethodNameScopes scopes) { static List<MethodNameScope> getSorted(MethodNameScopes scopes) {
@ -876,37 +924,6 @@ namespace de4dot.renamer {
} }
} }
void prepareRenameVirtualMethods(MethodNameScopes scopes) {
var allScopes = getSorted(scopes);
var virtualMethods = new ScopeHelper(memberInfos, modules.AllTypes);
var ifaceMethods = new ScopeHelper(memberInfos, modules.AllTypes);
var propMethods = new ScopeHelper(memberInfos, modules.AllTypes);
var eventMethods = new ScopeHelper(memberInfos, modules.AllTypes);
foreach (var scope in allScopes) {
if (scope.hasNonRenamableMethod())
continue;
else if (scope.hasGetterOrSetterPropertyMethod() && getPropertyMethodType(scope.Methods[0]) != PropertyMethodType.Other)
propMethods.add(scope);
else if (scope.hasAddRemoveOrRaiseEventMethod())
eventMethods.add(scope);
else if (scope.hasInterfaceMethod())
ifaceMethods.add(scope);
else
virtualMethods.add(scope);
}
propMethods.visitAll((scope) => prepareRenameProperty(scope, false));
eventMethods.visitAll((scope) => prepareRenameEvent(scope, false));
virtualMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "vmethod_", false));
ifaceMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "imethod_", false));
propMethods.visitAll((scope) => prepareRenameProperty(scope, true));
eventMethods.visitAll((scope) => prepareRenameEvent(scope, true));
virtualMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "vmethod_", true));
ifaceMethods.visitAll((scope) => prepareRenameVirtualMethods(scope, "imethod_", true));
}
static readonly Regex removeGenericsArityRegex = new Regex(@"`[0-9]+"); static readonly Regex removeGenericsArityRegex = new Regex(@"`[0-9]+");
static string getOverridePrefix(MethodNameScope scope, MethodDef method) { static string getOverridePrefix(MethodNameScope scope, MethodDef method) {
if (scope.Methods.Count != 1) if (scope.Methods.Count != 1)

View File

@ -143,12 +143,12 @@ namespace de4dot.renamer {
initializeWindowsFormsFieldsAndProps(); initializeWindowsFormsFieldsAndProps();
prepareRenameFields(); prepareRenameFields();
}
public void prepareRenamePropsAndEvents() {
mergeState();
prepareRenameProperties(); prepareRenameProperties();
prepareRenameEvents(); prepareRenameEvents();
initializeEventHandlerNames();
prepareRenameMethods();
} }
void prepareRenameFields() { void prepareRenameFields() {
@ -177,7 +177,7 @@ namespace de4dot.renamer {
if (fieldInfo.renamed) if (fieldInfo.renamed)
continue; continue;
if (!checker.isValidFieldName(fieldInfo.oldName)) if (!checker.isValidFieldName(fieldInfo.oldName))
fieldInfo.rename(variableNameState.getNewFieldName(fieldDef.FieldDefinition)); fieldInfo.rename(fieldInfo.suggestedName ?? variableNameState.getNewFieldName(fieldDef.FieldDefinition));
} }
} }
@ -261,7 +261,8 @@ namespace de4dot.renamer {
renameMethod(methodDef, newName); renameMethod(methodDef, newName);
} }
void prepareRenameMethods() { public void prepareRenameMethods() {
mergeState();
foreach (var methodDef in type.AllMethodsSorted) { foreach (var methodDef in type.AllMethodsSorted) {
if (methodDef.isVirtual()) if (methodDef.isVirtual())
continue; continue;
@ -470,7 +471,7 @@ namespace de4dot.renamer {
if (fieldInfo.renamed) if (fieldInfo.renamed)
continue; continue;
fieldInfo.rename(variableNameState.getNewFieldName(fieldInfo.oldName, new NameCreator2(fieldName))); fieldInfo.suggestedName = variableNameState.getNewFieldName(fieldInfo.oldName, new NameCreator2(fieldName));
} }
} }
} }
@ -492,7 +493,7 @@ namespace de4dot.renamer {
return ldfld.Operand as FieldReference; return ldfld.Operand as FieldReference;
} }
void initializeEventHandlerNames() { public void initializeEventHandlerNames() {
var ourFields = new Dictionary<FieldReferenceAndDeclaringTypeKey, FieldDef>(); var ourFields = new Dictionary<FieldReferenceAndDeclaringTypeKey, FieldDef>();
foreach (var fieldDef in type.AllFields) foreach (var fieldDef in type.AllFields)
ourFields[new FieldReferenceAndDeclaringTypeKey(fieldDef.FieldDefinition)] = fieldDef; ourFields[new FieldReferenceAndDeclaringTypeKey(fieldDef.FieldDefinition)] = fieldDef;