diff --git a/de4dot.code/renamer/MemberRefs.cs b/de4dot.code/renamer/MemberRefs.cs index c273df3c..876540ee 100644 --- a/de4dot.code/renamer/MemberRefs.cs +++ b/de4dot.code/renamer/MemberRefs.cs @@ -351,6 +351,14 @@ namespace de4dot.renamer { } } + // Called when all types have been renamed + public void onTypesRenamed() { + events.onTypesRenamed(); + fields.onTypesRenamed(); + methods.onTypesRenamed(); + types.onTypesRenamed(); + } + public IEnumerable getAllInterfaces() { if (isInterface()) yield return this; diff --git a/de4dot.code/renamer/Misc.cs b/de4dot.code/renamer/Misc.cs index a0f90e41..13c62b81 100644 --- a/de4dot.code/renamer/Misc.cs +++ b/de4dot.code/renamer/Misc.cs @@ -40,6 +40,7 @@ namespace de4dot.renamer { IEnumerable getSorted(); TRef find(TMRef tmref); void add(TRef tref); + void onTypesRenamed(); } class TypeDefDict : RefDict { @@ -73,6 +74,13 @@ namespace de4dot.renamer { tokenToTypeDef[new ScopeAndTokenKey(typeDef.TypeDefinition)] = typeDef; typeRefToDef[new TypeReferenceKey(typeDef.TypeDefinition)] = typeDef; } + + public void onTypesRenamed() { + var all = new List(typeRefToDef.Values); + typeRefToDef.Clear(); + foreach (var typeDef in all) + typeRefToDef[new TypeReferenceKey(typeDef.TypeDefinition)] = typeDef; + } } class FieldDefDict : RefDict { @@ -106,6 +114,13 @@ namespace de4dot.renamer { tokenToFieldDef[new ScopeAndTokenKey(fieldDef.FieldDefinition)] = fieldDef; fieldRefToDef[new FieldReferenceKey(fieldDef.FieldDefinition)] = fieldDef; } + + public void onTypesRenamed() { + var all = new List(fieldRefToDef.Values); + fieldRefToDef.Clear(); + foreach (var fieldDef in all) + fieldRefToDef[new FieldReferenceKey(fieldDef.FieldDefinition)] = fieldDef; + } } class MethodDefDict : RefDict { @@ -139,6 +154,13 @@ namespace de4dot.renamer { tokenToMethodDef[new ScopeAndTokenKey(methodDef.MethodDefinition)] = methodDef; methodRefToDef[new MethodReferenceKey(methodDef.MethodDefinition)] = methodDef; } + + public void onTypesRenamed() { + var all = new List(methodRefToDef.Values); + methodRefToDef.Clear(); + foreach (var methodDef in all) + methodRefToDef[new MethodReferenceKey(methodDef.MethodDefinition)] = methodDef; + } } class PropertyDefDict : RefDict { @@ -167,6 +189,9 @@ namespace de4dot.renamer { public void add(PropertyDef propDef) { tokenToPropDef[new ScopeAndTokenKey(propDef.PropertyDefinition)] = propDef; } + + public void onTypesRenamed() { + } } class EventDefDict : RefDict { @@ -195,6 +220,9 @@ namespace de4dot.renamer { public void add(EventDef eventDef) { tokenToEventDef[new ScopeAndTokenKey(eventDef.EventDefinition)] = eventDef; } + + public void onTypesRenamed() { + } } class Renamed { diff --git a/de4dot.code/renamer/Module.cs b/de4dot.code/renamer/Module.cs index 2d26294a..eafeecfe 100644 --- a/de4dot.code/renamer/Module.cs +++ b/de4dot.code/renamer/Module.cs @@ -303,8 +303,10 @@ namespace de4dot.renamer { void rebuildAllTypesDict() { var newAllTypes = new TypeDefDict(); - foreach (var typeDef in allTypes.getAll()) + foreach (var typeDef in allTypes.getAll()) { + typeDef.onTypesRenamed(); newAllTypes.add(typeDef); + } allTypes = newAllTypes; }