From 56d0d3233d95fe421ccec9b22c05b393fed424f1 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:59:08 -0400 Subject: [PATCH] Updoot --- AssemblyRemapper/Enums/EFailureReason.cs | 20 +++ AssemblyRemapper/Models/RemapModel.cs | 16 +-- AssemblyRemapper/Models/ScoringModel.cs | 9 +- AssemblyRemapper/Reflection/Remapper.cs | 63 ++++----- AssemblyRemapper/Reflection/SearchProvider.cs | 122 +++++++++++------- AssemblyRemapper/Utils/Logger.cs | 29 ++++- Templates/Settings.jsonc | 2 +- 7 files changed, 165 insertions(+), 96 deletions(-) create mode 100644 AssemblyRemapper/Enums/EFailureReason.cs diff --git a/AssemblyRemapper/Enums/EFailureReason.cs b/AssemblyRemapper/Enums/EFailureReason.cs new file mode 100644 index 0000000..9d597c0 --- /dev/null +++ b/AssemblyRemapper/Enums/EFailureReason.cs @@ -0,0 +1,20 @@ +namespace AssemblyRemapper.Enums; + +internal enum EFailureReason +{ + None, + IsAbstract, + IsEnum, + IsNested, + IsSealed, + IsDerived, + IsInterface, + IsPublic, + HasGenericParameters, + HasAttribute, + IsAttribute, + HasMethods, + HasFields, + HasProperties, + HasNestedTypes, +} \ No newline at end of file diff --git a/AssemblyRemapper/Models/RemapModel.cs b/AssemblyRemapper/Models/RemapModel.cs index be130d1..c41bc57 100644 --- a/AssemblyRemapper/Models/RemapModel.cs +++ b/AssemblyRemapper/Models/RemapModel.cs @@ -29,16 +29,16 @@ internal class SearchParams public bool? HasAttribute { get; set; } = null; public bool? IsDerived { get; set; } = null; public bool? HasGenericParameters { get; set; } = null; - public HashSet MethodNamesToMatch { get; set; } = []; - public HashSet MethodNamesToIgnore { get; set; } = []; + public List MethodNamesToMatch { get; set; } = []; + public List MethodNamesToIgnore { get; set; } = []; - public HashSet FieldNamesToMatch { get; set; } = []; - public HashSet FieldNamesToIgnore { get; set; } = []; - public HashSet PropertyNamesToMatch { get; set; } = []; - public HashSet PropertyNamesToIgnore { get; set; } = []; + public List FieldNamesToMatch { get; set; } = []; + public List FieldNamesToIgnore { get; set; } = []; + public List PropertyNamesToMatch { get; set; } = []; + public List PropertyNamesToIgnore { get; set; } = []; - public HashSet NestedTypesToMatch { get; set; } = []; - public HashSet NestedTypesToIgnore { get; set; } = []; + public List NestedTypesToMatch { get; set; } = []; + public List NestedTypesToIgnore { get; set; } = []; public SearchParams() { diff --git a/AssemblyRemapper/Models/ScoringModel.cs b/AssemblyRemapper/Models/ScoringModel.cs index 5709dee..d491c30 100644 --- a/AssemblyRemapper/Models/ScoringModel.cs +++ b/AssemblyRemapper/Models/ScoringModel.cs @@ -1,4 +1,5 @@ -using AssemblyRemapper.Utils; +using AssemblyRemapper.Enums; +using AssemblyRemapper.Utils; using Mono.Cecil; namespace AssemblyRemapper.Models; @@ -10,6 +11,8 @@ internal class ScoringModel public TypeDefinition Definition { get; set; } public RemapModel RemapModel { get; internal set; } + public EFailureReason FailureReason { get; set; } = EFailureReason.None; + public ScoringModel() { } @@ -64,9 +67,9 @@ internal static class ScoringModelExtensions if (value == null) continue; - if (value is HashSet hashset) + if (value is List list) { - maxScore += hashset.Count * 2; + maxScore += list.Count; } else { diff --git a/AssemblyRemapper/Reflection/Remapper.cs b/AssemblyRemapper/Reflection/Remapper.cs index 7698e12..e3dd15c 100644 --- a/AssemblyRemapper/Reflection/Remapper.cs +++ b/AssemblyRemapper/Reflection/Remapper.cs @@ -13,7 +13,7 @@ internal class Remapper foreach (var remap in DataProvider.Remaps) { - Logger.Log($"Trying to remap {remap.NewTypeName}...", ConsoleColor.Gray); + Logger.Log($"Finding best match for {remap.NewTypeName}...", ConsoleColor.Gray); HandleMapping(remap); } @@ -44,7 +44,12 @@ internal class Remapper { foreach (var type in DataProvider.ModuleDefinition.Types) { - ScoreType(type, mapping); + var result = ScoreType(type, mapping); + + if (result is not EFailureReason.None) + { + //Logger.LogDebug($"Remap [{type.Name} : {mapping.NewTypeName}] failed with reason {result}", silent: true); + } } } @@ -98,13 +103,13 @@ internal class Remapper } } - private void ScoreType(TypeDefinition type, RemapModel remap, string parentTypeName = "") + private EFailureReason ScoreType(TypeDefinition type, RemapModel remap, string parentTypeName = "") { // Handle Direct Remaps by strict naming first bypasses everything else if (remap.UseForceRename) { HandleByDirectName(type, remap); - return; + return EFailureReason.None; } foreach (var nestedType in type.NestedTypes) @@ -124,82 +129,72 @@ internal class Remapper if (type.MatchIsAbstract(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsAbstract", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsAbstract; } if (type.MatchIsEnum(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsEnum", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsEnum; } if (type.MatchIsNested(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsNested", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsNested; } if (type.MatchIsSealed(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsSealed", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsSealed; } if (type.MatchIsDerived(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsDerived", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsDerived; } if (type.MatchIsInterface(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsInterface", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsInterface; } - if (type.MatchIsGeneric(remap.SearchParams, score) == EMatchResult.NoMatch) + if (type.MatchHasGenericParameters(remap.SearchParams, score) == EMatchResult.NoMatch) { - return; + return EFailureReason.HasGenericParameters; } if (type.MatchIsPublic(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("IsPublic", type.Name, score.ProposedNewName); - return; + return EFailureReason.IsPublic; } if (type.MatchHasAttribute(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("HasAttribute", type.Name, score.ProposedNewName); - return; + return EFailureReason.HasAttribute; } if (type.MatchMethods(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("Methods", type.Name, score.ProposedNewName); - return; + return EFailureReason.HasMethods; } if (type.MatchFields(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("Fields", type.Name, score.ProposedNewName); - return; + return EFailureReason.HasFields; } if (type.MatchProperties(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("Properties", type.Name, score.ProposedNewName); - return; + return EFailureReason.HasProperties; } if (type.MatchNestedTypes(remap.SearchParams, score) == EMatchResult.NoMatch) { - LogDiscard("NestedTypes", type.Name, score.ProposedNewName); - return; + return EFailureReason.HasNestedTypes; } ScoringModelExtensions.AddModelToResult(score); + + return EFailureReason.None; } private void HandleByDirectName(TypeDefinition type, RemapModel remap) @@ -217,14 +212,6 @@ internal class Remapper Logger.Log("-----------------------------------------------", ConsoleColor.Green); } - private void LogDiscard(string action, string type, string search) - { - if (DataProvider.AppSettings.Debug) - { - Logger.Log($"[{action}] Discarding type [{type}] for search [{search}]", ConsoleColor.Red); - } - } - private void ChooseBestMatches() { foreach (var score in DataProvider.ScoringModels) diff --git a/AssemblyRemapper/Reflection/SearchProvider.cs b/AssemblyRemapper/Reflection/SearchProvider.cs index f78c8b8..03d0e5f 100644 --- a/AssemblyRemapper/Reflection/SearchProvider.cs +++ b/AssemblyRemapper/Reflection/SearchProvider.cs @@ -22,10 +22,11 @@ internal static class SearchProvider if (type.IsAbstract == parms.IsAbstract) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsAbstract; return EMatchResult.NoMatch; } @@ -38,10 +39,11 @@ internal static class SearchProvider if (type.IsEnum == parms.IsEnum) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsEnum; return EMatchResult.NoMatch; } @@ -54,10 +56,11 @@ internal static class SearchProvider if (type.IsNested == parms.IsNested) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsNested; return EMatchResult.NoMatch; } @@ -70,10 +73,11 @@ internal static class SearchProvider if (type.IsSealed == parms.IsSealed) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsSealed; return EMatchResult.NoMatch; } @@ -86,10 +90,11 @@ internal static class SearchProvider if (type.BaseType != null && (bool)parms.IsDerived) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsDerived; return EMatchResult.NoMatch; } @@ -102,14 +107,15 @@ internal static class SearchProvider if (type.IsInterface == parms.IsInterface) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsInterface; return EMatchResult.NoMatch; } - public static EMatchResult MatchIsGeneric(this TypeDefinition type, SearchParams parms, ScoringModel score) + public static EMatchResult MatchHasGenericParameters(this TypeDefinition type, SearchParams parms, ScoringModel score) { if (parms.HasGenericParameters is null) { @@ -118,10 +124,11 @@ internal static class SearchProvider if (type.HasGenericParameters == parms.HasGenericParameters) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.HasGenericParameters; return EMatchResult.NoMatch; } @@ -136,10 +143,11 @@ internal static class SearchProvider if (boolToCheck == !parms.IsPublic) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.IsPublic; return EMatchResult.NoMatch; } @@ -152,43 +160,62 @@ internal static class SearchProvider if (type.HasCustomAttributes == parms.HasAttribute) { - score.Score += 1; + score.Score++; return EMatchResult.Match; } + score.FailureReason = EFailureReason.HasAttribute; return EMatchResult.NoMatch; } public static EMatchResult MatchMethods(this TypeDefinition type, SearchParams parms, ScoringModel score) { - if (parms.MethodNamesToMatch.Count == 0) { return EMatchResult.Disabled; } - - if (type.HasMethods) + // We're not searching for methods and this type contains methods + if (parms.MethodNamesToMatch.Count == 0 && parms.MethodNamesToIgnore.Count == 0) { - // `*` is the wildcard to ignore all methods that exist on types - if (parms.MethodNamesToIgnore.Contains("*")) + return type.HasMethods + ? EMatchResult.NoMatch + : EMatchResult.Match; + } + + var skippAll = parms.MethodNamesToIgnore.Contains("*"); + + // The type has methods and we dont want any + if (type.HasMethods is true && skippAll is true) + { + foreach (var method in type.Methods) { + if (method.Name == ".ctor") + { + continue; + } + + score.Score--; return EMatchResult.NoMatch; } + + score.Score++; + return EMatchResult.Match; } var matchCount = 0; foreach (var method in type.Methods) { + // Type contains a method we dont want if (parms.MethodNamesToIgnore.Contains(method.Name)) { - // Type contains blacklisted method + score.FailureReason = EFailureReason.HasMethods; return EMatchResult.NoMatch; } foreach (var name in parms.MethodNamesToMatch) { + // Method name match if (method.Name == name) { matchCount += 1; - score.Score += 2; - continue; + score.Score++; } } } @@ -198,15 +225,15 @@ internal static class SearchProvider public static EMatchResult MatchFields(this TypeDefinition type, SearchParams parms, ScoringModel score) { - if (parms.FieldNamesToMatch.Count == 0) { return EMatchResult.Disabled; } - - if (type.HasFields) + if (parms.FieldNamesToMatch.Count == 0 && parms.FieldNamesToIgnore.Count == 0) { - // `*` is the wildcard to ignore all fields that exist on types - if (parms.FieldNamesToIgnore.Contains("*")) - { - return EMatchResult.NoMatch; - } + return EMatchResult.Disabled; + } + + // `*` is the wildcard to ignore all fields that exist on types + if (!type.HasFields && parms.FieldNamesToIgnore.Contains("*")) + { + return EMatchResult.Match; } int matchCount = 0; @@ -216,13 +243,14 @@ internal static class SearchProvider if (parms.FieldNamesToIgnore.Contains(field.Name)) { // Type contains blacklisted field + score.FailureReason = EFailureReason.HasFields; return EMatchResult.NoMatch; } if (parms.FieldNamesToMatch.Contains(field.Name)) { matchCount++; - score.Score += 2; + score.Score++; } } @@ -231,15 +259,16 @@ internal static class SearchProvider public static EMatchResult MatchProperties(this TypeDefinition type, SearchParams parms, ScoringModel score) { - if (parms.PropertyNamesToMatch.Count == 0) { return EMatchResult.Disabled; } - - if (type.HasProperties) + if (parms.PropertyNamesToMatch.Count == 0 && parms.PropertyNamesToIgnore.Count == 0) { - // `*` is the wildcard to ignore all fields that exist on types - if (parms.PropertyNamesToIgnore.Contains("*")) - { - return EMatchResult.NoMatch; - } + return EMatchResult.Disabled; + } + + // `*` is the wildcard to ignore all fields that exist on types + if (!type.HasProperties && parms.PropertyNamesToIgnore.Contains("*")) + { + score.Score++; + return EMatchResult.Match; } int matchCount = 0; @@ -249,13 +278,14 @@ internal static class SearchProvider if (parms.PropertyNamesToIgnore.Contains(property.Name)) { // Type contains blacklisted property + score.FailureReason = EFailureReason.HasProperties; return EMatchResult.NoMatch; } if (parms.PropertyNamesToMatch.Contains(property.Name)) { matchCount++; - score.Score += 2; + score.Score++; } } @@ -264,15 +294,16 @@ internal static class SearchProvider public static EMatchResult MatchNestedTypes(this TypeDefinition type, SearchParams parms, ScoringModel score) { - if (parms.NestedTypesToMatch.Count == 0) { return EMatchResult.Disabled; } - - if (type.HasNestedTypes) + if (parms.NestedTypesToMatch.Count == 0 && parms.NestedTypesToIgnore.Count == 0) { - // `*` is the wildcard to ignore all fields that exist on types - if (parms.NestedTypesToIgnore.Contains("*")) - { - return EMatchResult.NoMatch; - } + return EMatchResult.Disabled; + } + + // `*` is the wildcard to ignore all fields that exist on types + if (type.HasNestedTypes && parms.NestedTypesToIgnore.Contains("*")) + { + score.FailureReason = EFailureReason.HasNestedTypes; + return EMatchResult.NoMatch; } int matchCount = 0; @@ -282,13 +313,14 @@ internal static class SearchProvider if (parms.NestedTypesToIgnore.Contains(nestedType.Name)) { // Type contains blacklisted nested type + score.FailureReason = EFailureReason.HasNestedTypes; return EMatchResult.NoMatch; } if (parms.NestedTypesToMatch.Contains(nestedType.Name)) { matchCount++; - score.Score += 2; + score.Score++; } } diff --git a/AssemblyRemapper/Utils/Logger.cs b/AssemblyRemapper/Utils/Logger.cs index 9714f4d..d5cf279 100644 --- a/AssemblyRemapper/Utils/Logger.cs +++ b/AssemblyRemapper/Utils/Logger.cs @@ -13,12 +13,39 @@ internal static class Logger private static string _logPath = Path.Combine(AppContext.BaseDirectory, "Data", "Log.log"); - public static void Log(string message, ConsoleColor color = ConsoleColor.Gray) + public static void Log(string message, ConsoleColor color = ConsoleColor.Gray, bool silent = false) { + if (silent) + { + WriteToDisk(message); + return; + } + Console.ForegroundColor = color; Console.WriteLine(message); Console.ResetColor(); + WriteToDisk(message); + } + public static void LogDebug(string message, ConsoleColor color = ConsoleColor.Gray, bool silent = false) + { + if (silent) + { + WriteToDisk(message); + return; + } + + if (DataProvider.AppSettings.Debug) + { + Console.ForegroundColor = color; + Console.WriteLine(message); + Console.ResetColor(); + WriteToDisk(message); + } + } + + private static void WriteToDisk(string message) + { try { using (StreamWriter sw = File.AppendText(_logPath)) diff --git a/Templates/Settings.jsonc b/Templates/Settings.jsonc index f01a656..5ccdc94 100644 --- a/Templates/Settings.jsonc +++ b/Templates/Settings.jsonc @@ -1,5 +1,5 @@ { - "Debug": false, // Enables extra debug logging, slows down the program by alot + "Debug": true, // Enables extra debug logging, slows down the program by alot "SilentMode": true, // The tool will stop and prompt you to continue on every remapping if disabled "Publicize": true, // Publicize all types, methods, and properties : NOTE: Not run until after the remap has completed "Unseal": true, // Unseal all types : NOTE: Not run until after the remap has completed