Update renamer code so a compiler can compile the decompiled output

- property Byte[]_0 => Byte_0
- property ICollection.Boolean_0 => ICollection.IsSynchronized
- property pByte_0 => PByte_0
- property T_0 => Prop_0
- property indexer => Item
This commit is contained in:
de4dot 2011-12-03 14:28:10 +01:00
parent 0d18298b49
commit c9d4dc2268
6 changed files with 100 additions and 20 deletions

View File

@ -222,6 +222,14 @@ namespace de4dot.renamer {
return allTypeInfos.TryGetValue(t, out info);
}
public bool tryGetEvent(EventDef e, out EventInfo info) {
return allEventInfos.TryGetValue(e, out info);
}
public bool tryGetProperty(PropertyDef p, out PropertyInfo info) {
return allPropertyInfos.TryGetValue(p, out info);
}
public PropertyInfo prop(PropertyDef prop) {
return allPropertyInfos[prop];
}

View File

@ -983,19 +983,26 @@ namespace de4dot.renamer {
string newEventName, oldEventName;
var eventInfo = memberInfos.evt(eventDef);
bool mustUseOldEventName = false;
if (overridePrefix == "")
oldEventName = eventInfo.oldName;
else {
var overriddenEventDef = getOverriddenEvent(eventMethod);
if (overriddenEventDef == null)
oldEventName = getRealName(eventInfo.oldName);
else
oldEventName = getRealName(memberInfos.evt(overriddenEventDef).newName);
else {
mustUseOldEventName = true;
EventInfo info;
if (memberInfos.tryGetEvent(overriddenEventDef, out info))
oldEventName = getRealName(info.newName);
else
oldEventName = getRealName(overriddenEventDef.EventDefinition.Name);
}
}
if (eventInfo.renamed)
newEventName = getRealName(eventInfo.newName);
else if (eventDef.Owner.Module.ObfuscatedFile.NameChecker.isValidEventName(oldEventName))
else if (mustUseOldEventName || eventDef.Owner.Module.ObfuscatedFile.NameChecker.isValidEventName(oldEventName))
newEventName = oldEventName;
else {
mergeStateHelper.merge(MergeStateFlags.Events, scope);
@ -1016,10 +1023,20 @@ namespace de4dot.renamer {
}
EventDef getOverriddenEvent(MethodDef overrideMethod) {
var overriddenMethod = modules.resolve(overrideMethod.MethodDefinition.Overrides[0]);
if (overriddenMethod == null)
var theMethod = overrideMethod.MethodDefinition.Overrides[0];
var overriddenMethod = modules.resolve(theMethod);
if (overriddenMethod != null)
return overriddenMethod.Event;
var extType = theMethod.DeclaringType;
if (extType == null)
return null;
return overriddenMethod.Event;
var extTypeDef = modules.resolveOther(extType);
var theMethodDef = extTypeDef.find(theMethod);
if (theMethodDef != null)
return theMethodDef.Event;
return null;
}
MethodDef getEventMethod(MethodNameScope scope) {
@ -1069,20 +1086,29 @@ namespace de4dot.renamer {
var propDef = propMethod.Property;
var propInfo = memberInfos.prop(propDef);
bool mustUseOldPropName = false;
if (overridePrefix == "")
oldPropName = propInfo.oldName;
else {
var overriddenPropDef = getOverriddenProperty(propMethod);
if (overriddenPropDef == null)
oldPropName = getRealName(propInfo.oldName);
else
oldPropName = getRealName(memberInfos.prop(overriddenPropDef).newName);
else {
mustUseOldPropName = true;
PropertyInfo info;
if (memberInfos.tryGetProperty(overriddenPropDef, out info))
oldPropName = getRealName(info.newName);
else
oldPropName = getRealName(overriddenPropDef.PropertyDefinition.Name);
}
}
if (propInfo.renamed)
newPropName = getRealName(propInfo.newName);
else if (propDef.Owner.Module.ObfuscatedFile.NameChecker.isValidPropertyName(oldPropName))
else if (mustUseOldPropName || propDef.Owner.Module.ObfuscatedFile.NameChecker.isValidPropertyName(oldPropName))
newPropName = oldPropName;
else if (isItemProperty(scope))
newPropName = "Item";
else {
var propPrefix = getSuggestedPropertyName(scope) ?? getNewPropertyNamePrefix(scope);
mergeStateHelper.merge(MergeStateFlags.Properties, scope);
@ -1102,11 +1128,29 @@ namespace de4dot.renamer {
return newPropName;
}
bool isItemProperty(MethodNameScope scope) {
foreach (var method in scope.Methods) {
if (method.Property != null && method.Property.isItemProperty())
return true;
}
return false;
}
PropertyDef getOverriddenProperty(MethodDef overrideMethod) {
var overriddenMethod = modules.resolve(overrideMethod.MethodDefinition.Overrides[0]);
if (overriddenMethod == null)
var theMethod = overrideMethod.MethodDefinition.Overrides[0];
var overriddenMethod = modules.resolve(theMethod);
if (overriddenMethod != null)
return overriddenMethod.Property;
var extType = theMethod.DeclaringType;
if (extType == null)
return null;
return overriddenMethod.Property;
var extTypeDef = modules.resolveOther(extType);
var theMethodDef = extTypeDef.find(theMethod);
if (theMethodDef != null)
return theMethodDef.Property;
return null;
}
MethodDef getPropertyMethod(MethodNameScope scope) {
@ -1132,10 +1176,12 @@ namespace de4dot.renamer {
const string defaultVal = "Prop_";
var propType = getPropertyType(scope);
if (propType == null || propType is GenericInstanceType)
if (propType == null || propType is GenericInstanceType || propType is GenericParameter)
return defaultVal;
string name = propType.Name;
var prefix = getPrefix(propType);
string name = propType.GetElementType().Name;
int i;
if ((i = name.IndexOf('`')) >= 0)
name = name.Substring(0, i);
@ -1143,7 +1189,21 @@ namespace de4dot.renamer {
name = name.Substring(i + 1);
if (name == "")
return defaultVal;
return name + "_";
return prefix.ToUpperInvariant() + upperFirst(name) + "_";
}
static string upperFirst(string s) {
return s.Substring(0, 1).ToUpperInvariant() + s.Substring(1);
}
static string getPrefix(TypeReference typeRef) {
string prefix = "";
while (typeRef is PointerType) {
typeRef = ((PointerType)typeRef).ElementType;
prefix += "p";
}
return prefix;
}
enum PropertyMethodType {

View File

@ -216,8 +216,12 @@ namespace de4dot.renamer {
string propName = propInfo.oldName;
if (!NameChecker.isValidPropertyName(propName))
propName = propInfo.suggestedName;
if (!NameChecker.isValidPropertyName(propName))
propName = variableNameState.getNewPropertyName(propDef.PropertyDefinition);
if (!NameChecker.isValidPropertyName(propName)) {
if (propDef.isItemProperty())
propName = "Item";
else
propName = variableNameState.getNewPropertyName(propDef.PropertyDefinition);
}
variableNameState.addPropertyName(propName);
propInfo.rename(propName);

View File

@ -56,7 +56,7 @@ namespace de4dot.renamer {
return addTypeName(typeFullName, newName, prefix).create();
}
string getPrefix(TypeReference typeRef) {
static string getPrefix(TypeReference typeRef) {
string prefix = "";
while (typeRef is PointerType) {
typeRef = ((PointerType)typeRef).ElementType;
@ -153,7 +153,7 @@ namespace de4dot.renamer {
class PropertyNameCreator : TypeNames {
protected override string fixName(string prefix, string name) {
return prefix + upperFirst(name);
return prefix.ToUpperInvariant() + upperFirst(name);
}
}
}

View File

@ -324,7 +324,7 @@ namespace de4dot.renamer.asmmodules {
AssemblyKeyDictionary<TypeDef> typeToTypeDefDict = new AssemblyKeyDictionary<TypeDef>();
ExternalAssemblies externalAssemblies = new ExternalAssemblies();
TypeDef resolveOther(TypeReference type) {
public TypeDef resolveOther(TypeReference type) {
if (type == null)
return null;
type = type.GetElementType();

View File

@ -51,5 +51,13 @@ namespace de4dot.renamer.asmmodules {
}
return false;
}
public bool isItemProperty() {
if (GetMethod != null && GetMethod.ParamDefs.Count >= 1)
return true;
if (SetMethod != null && SetMethod.ParamDefs.Count >= 2)
return true;
return false;
}
}
}