From fc4360d58e6000b6c01510d2b5a35c053727401a Mon Sep 17 00:00:00 2001 From: AhmedAhmedEG Date: Mon, 9 Oct 2023 10:09:58 +0300 Subject: [PATCH] Fixed List types causing miss-detections and added null checks. --- .../MonoCecilTempGenerator.cs | 59 ++++++++----------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/AssetsTools.NET.MonoCecil/MonoCecilTempGenerator.cs b/AssetsTools.NET.MonoCecil/MonoCecilTempGenerator.cs index 5aadbea..cfeb91d 100644 --- a/AssetsTools.NET.MonoCecil/MonoCecilTempGenerator.cs +++ b/AssetsTools.NET.MonoCecil/MonoCecilTempGenerator.cs @@ -1,9 +1,8 @@ -using Mono.Cecil; +using System.Collections.Generic; using Mono.Cecil.Rocks; -using System; -using System.Collections.Generic; -using System.IO; using System.Linq; +using Mono.Cecil; +using System.IO; namespace AssetsTools.NET.Extra { @@ -68,7 +67,7 @@ public List Read(AssemblyDefinition assembly, string nam return children; } - private AssemblyDefinition GetAssemblyWithDependencies(string path) + public AssemblyDefinition GetAssemblyWithDependencies(string path) { string assemblyName = Path.GetFileName(path); if (loadedAssemblies.ContainsKey(assemblyName)) @@ -114,17 +113,18 @@ private void RecursiveTypeLoad(ModuleDefinition module, string nameSpace, string typeRef = new TypeReference(nameSpace, typeName, module, module); type = typeRef.Resolve(); } - + + if (type is null) { return; } + RecursiveTypeLoad(type, attf, availableDepth, true); } private void RecursiveTypeLoad(TypeDefWithSelfRef type, List attf, int availableDepth, bool isRecursiveCall = false) { - if (!isRecursiveCall) - { - availableDepth--; - } + if (!isRecursiveCall) { availableDepth--; } + if (type.typeDef.BaseType is null) { return; } + string baseName = type.typeDef.BaseType.FullName; if (baseName != "System.Object" && baseName != "UnityEngine.Object" && @@ -151,6 +151,7 @@ private List ReadTypes(TypeDefWithSelfRef type, int avai bool isArrayOrList = false; bool isPrimitive = false; + bool isString = false; bool derivesFromUEObject = false; bool isManagedReference = false; @@ -172,51 +173,42 @@ private List ReadTypes(TypeDefWithSelfRef type, int avai field.Type = CommonMonoTemplateHelper.ConvertBaseToPrimitive(enumType); } else if (isPrimitive = fieldTypeDef.typeDef.IsPrimitive) - { field.Type = CommonMonoTemplateHelper.ConvertBaseToPrimitive(fieldTypeDef.typeDef.FullName); - } + else if (fieldTypeDef.typeDef.FullName == "System.String") { + isString = true; field.Type = "string"; } + else if (derivesFromUEObject = DerivesFromUEObject(fieldTypeDef)) - { field.Type = $"PPtr<${fieldTypeDef.typeDef.Name}>"; - } + else if (isManagedReference = fieldDef.CustomAttributes.Any(a => a.AttributeType.Name == "SerializeReference")) { anyFieldIsManagedReference = true; field.Type = "managedReference"; } else - { field.Type = fieldTypeDef.typeDef.Name; - } if (isPrimitive) - { field.Children = new List(); - } + else if (fieldTypeDef.typeDef.FullName == "System.String") - { field.Children = CommonMonoTemplateHelper.String(); - } + else if (CommonMonoTemplateHelper.IsSpecialUnityType(fieldTypeDef.typeDef.FullName)) - { field.Children = SpecialUnity(fieldTypeDef, availableDepth); - } + else if (derivesFromUEObject) - { field.Children = CommonMonoTemplateHelper.PPtr(unityVersion); - } + else if (isManagedReference) - { field.Children = CommonMonoTemplateHelper.ManagedReference(unityVersion); - } + else if (fieldTypeDef.typeDef.IsSerializable) - { field.Children = Serialized(fieldTypeDef, availableDepth); - } field.ValueType = AssetTypeValueField.GetValueTypeByTypeName(field.Type); field.IsAligned = CommonMonoTemplateHelper.TypeAligns(field.ValueType); @@ -224,22 +216,17 @@ private List ReadTypes(TypeDefWithSelfRef type, int avai if (isArrayOrList) { - if (isPrimitive || derivesFromUEObject) - { + if (isString || isPrimitive || derivesFromUEObject) field = CommonMonoTemplateHelper.Vector(field); - } + else - { field = CommonMonoTemplateHelper.VectorWithType(field); - } } localChildren.Add(field); } if (anyFieldIsManagedReference && DerivesFromUEObject(type)) - { localChildren.Add(CommonMonoTemplateHelper.ManagedReferencesRegistry("references", unityVersion)); - } return localChildren; } @@ -278,7 +265,7 @@ private List GetAcceptableFields(TypeDefWithSelfRef parentType, } // unity doesn't serialize a field of the same type as declaring type // unless it inherits from UnityEngine.Object - else if (parentType.typeDef.FullName == solidifiedFieldType.typeDef.FullName && !DerivesFromUEObject(parentType)) + else if (solidifiedFieldType.typeDef != null && parentType.typeDef.FullName == solidifiedFieldType.typeDef.FullName && !DerivesFromUEObject(parentType)) { continue; }