101 lines
3.0 KiB
C#
Raw Normal View History

2024-06-11 23:07:59 -04:00
using AssemblyRemapper.Models;
using AssemblyRemapper.Utils;
using Mono.Cecil;
2024-06-11 19:18:48 -04:00
using Mono.Collections.Generic;
namespace AssemblyRemapper.Reflection;
internal static class RenameService
{
2024-06-12 14:38:43 -04:00
public static void RenameAll(ScoringModel score)
{
var types = DataProvider.ModuleDefinition.Types;
// Rename all fields and properties first
RenameAllFields(score, types);
RenameAllProperties(score, types);
score.Definition.Name = score.ProposedNewName;
types.FirstOrDefault(t => t.Name == score.ProposedNewName).Name = score.ProposedNewName;
}
public static void RenameAllDirect(RemapModel remap, TypeDefinition type)
{
var directRename = new ScoringModel();
directRename.Definition = type;
directRename.RemapModel = remap;
RenameAll(directRename);
}
private static void RenameAllFields(
ScoringModel score,
2024-06-11 23:07:59 -04:00
Collection<TypeDefinition> typesToCheck)
2024-06-11 19:18:48 -04:00
{
2024-06-11 23:07:59 -04:00
foreach (var type in typesToCheck)
2024-06-11 19:18:48 -04:00
{
int fieldCount = 0;
foreach (var field in type.Fields)
{
2024-06-12 14:38:43 -04:00
if (field.FieldType.Name == score.Definition.Name)
2024-06-11 19:18:48 -04:00
{
2024-06-12 14:38:43 -04:00
var newFieldName = GetNewFieldName(score.RemapModel.NewTypeName, field.IsPrivate, fieldCount);
if (field.Name == newFieldName) { continue; }
2024-06-12 12:42:50 -04:00
2024-06-12 14:38:43 -04:00
Logger.Log($"Renaming field: `{field.Name}` on Type `{type.Name}` to {newFieldName}");
2024-06-12 12:42:50 -04:00
field.Name = newFieldName;
2024-06-11 19:18:48 -04:00
fieldCount++;
}
}
if (type.HasNestedTypes)
{
foreach (var _ in type.NestedTypes)
{
2024-06-12 14:38:43 -04:00
RenameAllFields(score, type.NestedTypes);
2024-06-11 19:18:48 -04:00
}
}
}
}
2024-06-12 14:38:43 -04:00
private static void RenameAllProperties(
ScoringModel score,
2024-06-11 23:07:59 -04:00
Collection<TypeDefinition> typesToCheck)
2024-06-11 19:18:48 -04:00
{
2024-06-11 23:07:59 -04:00
foreach (var type in typesToCheck)
2024-06-11 19:18:48 -04:00
{
int propertyCount = 0;
foreach (var property in type.Properties)
{
2024-06-12 14:38:43 -04:00
if (property.PropertyType.Name == score.Definition.Name)
2024-06-11 19:18:48 -04:00
{
2024-06-12 14:38:43 -04:00
var newName = propertyCount > 0 ? $"{score.RemapModel.NewTypeName}_{propertyCount}" : score.RemapModel.NewTypeName;
Logger.Log($"Renaming Property: `{property.Name}` on Type `{type}` to {newName}");
property.Name = newName;
2024-06-11 19:18:48 -04:00
}
}
if (type.HasNestedTypes)
{
foreach (var _ in type.NestedTypes)
{
2024-06-12 14:38:43 -04:00
RenameAllProperties(score, type.NestedTypes);
2024-06-11 19:18:48 -04:00
}
}
}
}
private static string GetNewFieldName(string TypeName, bool isPrivate, int fieldCount = 0)
{
var discard = isPrivate ? "_" : "";
string newFieldCount = fieldCount > 0 ? $"_{fieldCount}" : string.Empty;
return $"{discard}{char.ToLower(TypeName[0])}{TypeName[1..]}{newFieldCount}";
}
}