de4dot-cex/de4dot.code/renamer/NameCreators.cs

218 lines
5.4 KiB
C#
Raw Permalink Normal View History

2011-11-17 11:17:03 +08:00
/*
2015-10-30 05:45:26 +08:00
Copyright (C) 2011-2015 de4dot@gmail.com
2011-11-17 11:17:03 +08:00
This file is part of de4dot.
de4dot is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
de4dot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with de4dot. If not, see <http://www.gnu.org/licenses/>.
*/
using System.Collections.Generic;
using dnlib.DotNet;
2011-11-17 11:17:03 +08:00
using de4dot.blocks;
namespace de4dot.code.renamer {
public interface INameCreator {
2013-01-19 20:03:57 +08:00
string Create();
2011-11-17 11:17:03 +08:00
}
public class OneNameCreator : INameCreator {
2011-11-17 11:17:03 +08:00
string name;
public OneNameCreator(string name) {
this.name = name;
}
2013-01-19 20:03:57 +08:00
public string Create() {
2011-11-17 11:17:03 +08:00
return name;
}
}
public abstract class NameCreatorCounter : INameCreator {
protected int num;
2011-11-17 11:17:03 +08:00
2013-01-19 20:03:57 +08:00
public abstract string Create();
2011-11-17 11:17:03 +08:00
2013-01-19 20:03:57 +08:00
public NameCreatorCounter Merge(NameCreatorCounter other) {
if (num < other.num)
num = other.num;
2011-11-17 11:17:03 +08:00
return this;
}
}
public class GenericParamNameCreator : NameCreatorCounter {
2011-11-17 11:17:03 +08:00
static string[] names = new string[] { "T", "U", "V", "W", "X", "Y", "Z" };
2013-01-19 20:03:57 +08:00
public override string Create() {
if (num < names.Length)
return names[num++];
return string.Format("T{0}", num++);
2011-11-17 11:17:03 +08:00
}
}
public class NameCreator : NameCreatorCounter {
2011-11-17 11:17:03 +08:00
string prefix;
2012-07-07 13:11:32 +08:00
public NameCreator(string prefix)
: this(prefix, 0) {
}
public NameCreator(string prefix, int num) {
2011-11-17 11:17:03 +08:00
this.prefix = prefix;
this.num = num;
}
2013-01-19 20:03:57 +08:00
public NameCreator Clone() {
2011-11-17 11:17:03 +08:00
return new NameCreator(prefix, num);
}
2013-01-19 20:03:57 +08:00
public override string Create() {
2011-11-17 11:17:03 +08:00
return prefix + num++;
}
}
// Like NameCreator but don't add the counter the first time
public class NameCreator2 : NameCreatorCounter {
2011-11-17 11:17:03 +08:00
string prefix;
const string separator = "_";
2012-07-07 13:11:32 +08:00
public NameCreator2(string prefix)
: this(prefix, 0) {
}
public NameCreator2(string prefix, int num) {
2011-11-17 11:17:03 +08:00
this.prefix = prefix;
this.num = num;
}
2013-01-19 20:03:57 +08:00
public override string Create() {
2011-11-17 11:17:03 +08:00
string rv;
if (num == 0)
rv = prefix;
else
rv = prefix + separator + num;
num++;
return rv;
}
}
public interface ITypeNameCreator {
2013-01-19 20:03:57 +08:00
string Create(TypeDef typeDef, string newBaseTypeName);
2011-11-17 11:17:03 +08:00
}
public class NameInfos {
2011-11-17 11:17:03 +08:00
IList<NameInfo> nameInfos = new List<NameInfo>();
class NameInfo {
public string name;
public NameCreator nameCreator;
public NameInfo(string name, NameCreator nameCreator) {
2011-11-17 11:17:03 +08:00
this.name = name;
this.nameCreator = nameCreator;
}
}
2013-01-19 20:03:57 +08:00
public void Add(string name, NameCreator nameCreator) {
2011-11-17 11:17:03 +08:00
nameInfos.Add(new NameInfo(name, nameCreator));
}
2013-01-19 20:03:57 +08:00
public NameCreator Find(string typeName) {
2011-11-17 11:17:03 +08:00
foreach (var nameInfo in nameInfos) {
if (typeName.Contains(nameInfo.name))
return nameInfo.nameCreator;
}
return null;
}
}
public class TypeNameCreator : ITypeNameCreator {
2011-11-17 11:17:03 +08:00
ExistingNames existingNames;
NameCreator createUnknownTypeName;
NameCreator createEnumName;
NameCreator createStructName;
NameCreator createDelegateName;
NameCreator createClassName;
NameCreator createInterfaceName;
2011-11-17 11:17:03 +08:00
NameInfos nameInfos = new NameInfos();
public TypeNameCreator(ExistingNames existingNames) {
this.existingNames = existingNames;
2013-01-19 20:03:57 +08:00
createUnknownTypeName = CreateNameCreator("Type");
createEnumName = CreateNameCreator("Enum");
createStructName = CreateNameCreator("Struct");
createDelegateName = CreateNameCreator("Delegate");
createClassName = CreateNameCreator("Class");
createInterfaceName = CreateNameCreator("Interface");
2011-11-17 11:17:03 +08:00
var names = new string[] {
"Exception",
"EventArgs",
"Attribute",
"Form",
"Dialog",
"Control",
"Stream",
2011-11-17 11:17:03 +08:00
};
foreach (var name in names)
2013-01-19 20:03:57 +08:00
nameInfos.Add(name, CreateNameCreator(name));
2011-11-17 11:17:03 +08:00
}
2013-01-19 20:03:57 +08:00
protected virtual NameCreator CreateNameCreator(string prefix) {
2011-11-17 11:17:03 +08:00
return new NameCreator(prefix);
}
2013-01-19 20:03:57 +08:00
public string Create(TypeDef typeDef, string newBaseTypeName) {
var nameCreator = GetNameCreator(typeDef, newBaseTypeName);
return existingNames.GetName(typeDef.Name.String, nameCreator);
2011-11-17 11:17:03 +08:00
}
2013-01-19 20:03:57 +08:00
NameCreator GetNameCreator(TypeDef typeDef, string newBaseTypeName) {
2011-11-17 11:17:03 +08:00
var nameCreator = createUnknownTypeName;
2012-11-22 16:14:51 +08:00
if (typeDef.IsEnum)
2011-11-17 11:17:03 +08:00
nameCreator = createEnumName;
2012-11-22 16:14:51 +08:00
else if (typeDef.IsValueType)
2011-11-17 11:17:03 +08:00
nameCreator = createStructName;
2012-11-22 16:14:51 +08:00
else if (typeDef.IsClass) {
if (typeDef.BaseType != null) {
var fn = typeDef.BaseType.FullName;
2012-11-04 07:50:24 +08:00
if (fn == "System.Delegate")
2011-11-17 11:17:03 +08:00
nameCreator = createDelegateName;
2012-11-04 07:50:24 +08:00
else if (fn == "System.MulticastDelegate")
2011-11-17 11:17:03 +08:00
nameCreator = createDelegateName;
else {
2013-01-19 20:03:57 +08:00
nameCreator = nameInfos.Find(newBaseTypeName ?? typeDef.BaseType.Name.String);
2011-11-17 11:17:03 +08:00
if (nameCreator == null)
nameCreator = createClassName;
}
}
else
nameCreator = createClassName;
}
2012-11-22 16:14:51 +08:00
else if (typeDef.IsInterface)
2011-11-17 11:17:03 +08:00
nameCreator = createInterfaceName;
return nameCreator;
}
}
public class GlobalTypeNameCreator : TypeNameCreator {
2011-11-17 11:17:03 +08:00
public GlobalTypeNameCreator(ExistingNames existingNames)
: base(existingNames) {
}
2013-01-19 20:03:57 +08:00
protected override NameCreator CreateNameCreator(string prefix) {
return base.CreateNameCreator("G" + prefix);
2011-11-17 11:17:03 +08:00
}
}
}