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);
        }
Example #2
0
        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);
        }