|
|
@@ -0,0 +1,114 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Reflection; |
|
|
|
using System.Text; |
|
|
|
|
|
|
|
namespace CLre.Fixes |
|
|
|
{ |
|
|
|
[AttributeUsage(AttributeTargets.Class)] |
|
|
|
public class BugfixAttribute : Attribute |
|
|
|
{ |
|
|
|
public string name { get; set; } |
|
|
|
public string description { get; set; } |
|
|
|
public Type target { get; set; } |
|
|
|
public string more { get; set; } |
|
|
|
public uint id { get; set; } |
|
|
|
public BugfixType component { get; set; } |
|
|
|
} |
|
|
|
|
|
|
|
public enum BugfixType : byte |
|
|
|
{ |
|
|
|
Miscellaneous = 0x00, |
|
|
|
HarmonyPatch, |
|
|
|
Initialiser, |
|
|
|
Workaround, |
|
|
|
Debug |
|
|
|
} |
|
|
|
|
|
|
|
internal static class BugfixAttributeUtility |
|
|
|
{ |
|
|
|
public static void LogBugfixes() |
|
|
|
{ |
|
|
|
List<uint> keys = new List<uint>(); |
|
|
|
Dictionary<uint, BugfixStruct> fixes = new Dictionary<uint, BugfixStruct>(); |
|
|
|
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) |
|
|
|
{ |
|
|
|
BugfixAttribute b = t.GetCustomAttribute<BugfixAttribute>(true); |
|
|
|
if (b != null) |
|
|
|
{ |
|
|
|
if (!fixes.ContainsKey(b.id)) |
|
|
|
{ |
|
|
|
BugfixStruct bugfixStruct = new BugfixStruct{id = b.id}; |
|
|
|
bugfixStruct.Merge(b); |
|
|
|
fixes[b.id] = bugfixStruct; |
|
|
|
keys.Add(b.id); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
BugfixStruct bugfixStruct = fixes[b.id]; |
|
|
|
bugfixStruct.Merge(b); |
|
|
|
fixes[b.id] = bugfixStruct; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
keys.Sort(); |
|
|
|
//keys.Sort((u, u1) => u.CompareTo(u1)); |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
sb.AppendFormat("Applying {0} CLre fixes\n", keys.Count); |
|
|
|
sb.AppendFormat("-----------------------------\n"); |
|
|
|
foreach (uint i in keys) |
|
|
|
{ |
|
|
|
sb.Append(fixes[i].ToString()); |
|
|
|
sb.Append("\n"); |
|
|
|
} |
|
|
|
sb.AppendFormat("-----------------------------\n"); |
|
|
|
API.Utility.Logging.Log(sb.ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
private struct BugfixStruct |
|
|
|
{ |
|
|
|
public string name; |
|
|
|
public string description; |
|
|
|
public Type target; |
|
|
|
public string more; |
|
|
|
public uint id; |
|
|
|
private uint total; |
|
|
|
private uint[] bugfixTypeCount; |
|
|
|
|
|
|
|
public void Merge(BugfixAttribute b) |
|
|
|
{ |
|
|
|
if (name == null && b.name != null) name = b.name; |
|
|
|
if (description == null && b.description != null) description = b.description; |
|
|
|
if (target == null && b.target != null) target = b.target; |
|
|
|
if (more == null && b.more != null) more = b.more; |
|
|
|
total++; |
|
|
|
if (bugfixTypeCount == null) bugfixTypeCount = new uint[Enum.GetNames(typeof(BugfixType)).Length]; |
|
|
|
bugfixTypeCount[(byte) b.component]++; |
|
|
|
} |
|
|
|
|
|
|
|
public override string ToString() |
|
|
|
{ |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
sb.AppendFormat(" {0}: ", name); |
|
|
|
if (more != null) |
|
|
|
{ |
|
|
|
sb.AppendFormat("[MORE: {0}] ", more); |
|
|
|
} |
|
|
|
else if (description != null) |
|
|
|
{ |
|
|
|
sb.Append(description); |
|
|
|
sb.Append(" "); |
|
|
|
} |
|
|
|
|
|
|
|
if (target != null) |
|
|
|
{ |
|
|
|
sb.AppendFormat("[TARGET: {0}] ", target.FullName); |
|
|
|
} |
|
|
|
sb.AppendFormat("[ID: {0}] ", id); |
|
|
|
sb.AppendFormat("({0}M/{1}P/{2}I/{3}W/{4}D/{5}T)", bugfixTypeCount[(byte) BugfixType.Miscellaneous], bugfixTypeCount[(byte) BugfixType.HarmonyPatch], bugfixTypeCount[(byte) BugfixType.Initialiser], bugfixTypeCount[(byte) BugfixType.Workaround], bugfixTypeCount[(byte) BugfixType.Debug], total); |
|
|
|
return sb.ToString(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |