static void GeneratePropertyBagsForSerializableTypes(Context context, HashSet <TypeDefinition> serializableContainerTypes) { var module = context.Module; var createValueMethod = module.ImportReference(UnityObjectReference.CreateValueMethod); var createArrayMethod = module.ImportReference(UnityObjectReference.CreateArrayMethod); var createListMethod = module.ImportReference(UnityObjectReference.CreateListMethod); var getTypeMethod = module.ImportReference(k_GetTypeMethod); var objectReference = context.ImportReference(typeof(object)); var unityObjectReference = context.ImportReference(typeof(UnityObjectReference)); var unityObjectListReference = context.ImportReference(typeof(List <UnityObjectReference>)); var listType = context.ImportReference(typeof(List <>)); var preserveAttributeConstructor = module.ImportReference(typeof(PreserveAttribute).GetConstructor(Type.EmptyTypes)); var propertyBagDefinitions = new List <Tuple <TypeDefinition, TypeReference> >(); var externalContainerTypes = new Dictionary <string, TypeDefinition>(); foreach (var type in serializableContainerTypes) { var externalContainer = TryGenerateExternalContainerType(type, context, objectReference, preserveAttributeConstructor); if (externalContainer != null) { externalContainerTypes[type.FullName] = externalContainer; } } foreach (var type in serializableContainerTypes) { Console.WriteLine($"GENERATE FOR {type}"); var containerType = type.Module == context.Module ? type : context.ImportReference(type); externalContainerTypes.TryGetValue(type.FullName, out var externalContainer); var propertyBagType = GeneratePropertyBag(context, containerType, externalContainer, externalContainerTypes, getTypeMethod, createValueMethod, createArrayMethod, createListMethod, unityObjectReference, unityObjectListReference, listType); context.Module.Types.Add(propertyBagType); propertyBagDefinitions.Add(new Tuple <TypeDefinition, TypeReference>(propertyBagType, externalContainer ?? containerType)); } var propertyBagRegistryTypeDefinition = PropertyBagRegistry.Generate(context, propertyBagDefinitions); context.Module.Types.Add(propertyBagRegistryTypeDefinition); }
static void GeneratePropertyBagsForSerializableTypes(Context context, HashSet <Type> serializableContainerTypes) { var module = context.Module; var createValueMethod = module.ImportReference(UnityObjectReference.CreateValueMethod); var createArrayMethod = module.ImportReference(UnityObjectReference.CreateArrayMethod); var createListMethod = module.ImportReference(UnityObjectReference.CreateListMethod); var unityObjectPropertyType = context.ImportReference(typeof(UnityObjectReference)); var unityObjectPropertyListType = context.ImportReference(typeof(List <UnityObjectReference>)); var propertyBagDefinitions = new List <Tuple <TypeDefinition, TypeReference> >(); foreach (var type in serializableContainerTypes) { var containerType = context.ImportReference(type); var propertyBagType = GeneratePropertyBag(context, containerType, createValueMethod, createArrayMethod, createListMethod, unityObjectPropertyType, unityObjectPropertyListType); module.Types.Add(propertyBagType); propertyBagDefinitions.Add(new Tuple <TypeDefinition, TypeReference>(propertyBagType, containerType)); } var propertyBagRegistryTypeDefinition = PropertyBagRegistry.Generate(context, propertyBagDefinitions); module.Types.Add(propertyBagRegistryTypeDefinition); }