Esempio n. 1
0
        public void ProcessType(CecilSerializerContext context, TypeReference type, MethodDefinition updateMainMethod)
        {
            var typeDefinition = type.Resolve();

            // No need to process enum
            if (typeDefinition.IsEnum)
            {
                return;
            }

            var updateCurrentMethod = updateMainMethod;
            ResolveGenericsVisitor replaceGenericsVisitor = null;

            if (typeDefinition.HasGenericParameters)
            {
                // Make a prepare method for just this object since it might need multiple instantiation
                updateCurrentMethod = new MethodDefinition(ComputeUpdateMethodName(typeDefinition), MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static, context.Assembly.MainModule.TypeSystem.Void);
                var genericsMapping = new Dictionary <TypeReference, TypeReference>();
                foreach (var genericParameter in typeDefinition.GenericParameters)
                {
                    var genericParameterCopy = new GenericParameter(genericParameter.Name, updateCurrentMethod)
                    {
                        Attributes = genericParameter.Attributes,
                    };
                    foreach (var constraint in genericParameter.Constraints)
                    {
                        genericParameterCopy.Constraints.Add(context.Assembly.MainModule.ImportReference(constraint));
                    }
                    updateCurrentMethod.GenericParameters.Add(genericParameterCopy);

                    genericsMapping[genericParameter] = genericParameterCopy;
                }

                replaceGenericsVisitor = new ResolveGenericsVisitor(genericsMapping);

                updateMainMethod.DeclaringType.Methods.Add(updateCurrentMethod);
            }

            var il = updateCurrentMethod.Body.GetILProcessor();
            var emptyObjectField = updateMainMethod.DeclaringType.Fields.FirstOrDefault(x => x.Name == "emptyObject");

            // Note: forcing fields and properties to be processed in all cases
            foreach (var serializableItem in ComplexClassSerializerGenerator.GetSerializableItems(type, true, ComplexTypeSerializerFlags.SerializePublicFields | ComplexTypeSerializerFlags.SerializePublicProperties | ComplexTypeSerializerFlags.Updatable))
            {
                var fieldReference = serializableItem.MemberInfo as FieldReference;
                if (fieldReference != null)
                {
                    var field = fieldReference.Resolve();

                    // First time it is needed, let's create empty object: var emptyObject = new object();
                    if (emptyObjectField == null)
                    {
                        emptyObjectField = new FieldDefinition("emptyObject", FieldAttributes.Static | FieldAttributes.Private, context.Assembly.MainModule.TypeSystem.Object);

                        // Create static ctor that will initialize this object
                        var staticConstructor = new MethodDefinition(".cctor",
                                                                     MethodAttributes.Private | MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
                                                                     context.Assembly.MainModule.TypeSystem.Void);
                        var staticConstructorIL = staticConstructor.Body.GetILProcessor();
                        staticConstructorIL.Emit(OpCodes.Newobj, context.Assembly.MainModule.ImportReference(emptyObjectField.FieldType.Resolve().GetConstructors().Single(x => !x.IsStatic && !x.HasParameters)));
                        staticConstructorIL.Emit(OpCodes.Stsfld, emptyObjectField);
                        staticConstructorIL.Emit(OpCodes.Ret);

                        updateMainMethod.DeclaringType.Fields.Add(emptyObjectField);
                        updateMainMethod.DeclaringType.Methods.Add(staticConstructor);
                    }

                    il.Emit(OpCodes.Ldtoken, type);
                    il.Emit(OpCodes.Call, getTypeFromHandleMethod);
                    il.Emit(OpCodes.Ldstr, field.Name);

                    il.Emit(OpCodes.Ldsfld, emptyObjectField);
                    il.Emit(OpCodes.Ldflda, context.Assembly.MainModule.ImportReference(fieldReference));
                    il.Emit(OpCodes.Conv_I);
                    il.Emit(OpCodes.Ldsfld, emptyObjectField);
                    il.Emit(OpCodes.Conv_I);
                    il.Emit(OpCodes.Sub);
                    il.Emit(OpCodes.Conv_I4);

                    var fieldType = context.Assembly.MainModule.ImportReference(replaceGenericsVisitor != null ? replaceGenericsVisitor.VisitDynamic(field.FieldType) : field.FieldType).FixupValueType();
                    il.Emit(OpCodes.Newobj, context.Assembly.MainModule.ImportReference(updatableFieldGenericCtor).MakeGeneric(fieldType));
                    il.Emit(OpCodes.Call, updateEngineRegisterMemberMethod);
                }

                var propertyReference = serializableItem.MemberInfo as PropertyReference;
                if (propertyReference != null)
                {
                    var property = propertyReference.Resolve();

                    var propertyGetMethod = context.Assembly.MainModule.ImportReference(property.GetMethod).MakeGeneric(updateCurrentMethod.GenericParameters.ToArray());

                    il.Emit(OpCodes.Ldtoken, type);
                    il.Emit(OpCodes.Call, getTypeFromHandleMethod);
                    il.Emit(OpCodes.Ldstr, property.Name);

                    il.Emit(OpCodes.Ldftn, propertyGetMethod);

                    // Only get setter if it exists and it's public
                    if (property.SetMethod != null && property.SetMethod.IsPublic)
                    {
                        var propertySetMethod = context.Assembly.MainModule.ImportReference(property.SetMethod).MakeGeneric(updateCurrentMethod.GenericParameters.ToArray());
                        il.Emit(OpCodes.Ldftn, propertySetMethod);
                    }
                    else
                    {
                        // 0 (native int)
                        il.Emit(OpCodes.Ldc_I4_0);
                        il.Emit(OpCodes.Conv_I);
                    }

                    var propertyType = context.Assembly.MainModule.ImportReference(replaceGenericsVisitor != null ? replaceGenericsVisitor.VisitDynamic(property.PropertyType) : property.PropertyType).FixupValueType();

                    var updatablePropertyInflatedCtor = GetOrCreateUpdatablePropertyCtor(context.Assembly, propertyType);

                    il.Emit(OpCodes.Newobj, updatablePropertyInflatedCtor);
                    il.Emit(OpCodes.Call, updateEngineRegisterMemberMethod);
                }
            }

            if (updateCurrentMethod != updateMainMethod)
            {
                // If we have a local method, close it
                il.Emit(OpCodes.Ret);

                // Also call it from main method if it was a closed generic instantiation
                if (type is GenericInstanceType)
                {
                    il = updateMainMethod.Body.GetILProcessor();
                    il.Emit(OpCodes.Call, updateCurrentMethod.MakeGeneric(((GenericInstanceType)type).GenericArguments.Select(context.Assembly.MainModule.ImportReference).Select(CecilExtensions.FixupValueType).ToArray()));
                }
            }
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"
using System;
using System.Collections.Generic;
using System.Reflection;
using SiliconStudio.Core.Serialization;
using SiliconStudio.Core.Reflection;
using SiliconStudio.Core.Serialization.Serializers;
using SiliconStudio.DataSerializers;

[assembly: AssemblyVersion(""");
            
            #line 17 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assembly.Name.Version.ToString()));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 18 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 if (targetFramework != null) { 
            
            #line default
            #line hidden
            this.Write("[assembly: System.Runtime.Versioning.TargetFramework(");
            
            #line 19 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(targetFramework));
            
            #line default
            #line hidden
            this.Write(")]\r\n");
            
            #line 20 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n[assembly: SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFacto" +
                    "ry(Type = typeof(SiliconStudio.DataSerializers.");
            
            #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write(@"))]

namespace SiliconStudio.Core.Serialization.Serializers
{
	class AssemblySerializerFactoryAttribute : Attribute
	{
		public Type Type;
	}
}

namespace SiliconStudio.DataSerializers
{
    // Assembly attributes that defines supported serializer (only generics one so that other assemblies can do generic instantiations by themselves)
");
            
            #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 foreach (var profile in cecilSerializerContext.SerializableTypesProfiles) {
       foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local && x.Value.SerializerType != null)) { 
            
            #line default
            #line hidden
            this.Write("    [DataSerializerGlobalAttribute(typeof(");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp(false)));
            
            #line default
            #line hidden
            this.Write("), typeof(");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(false)));
            
            #line default
            #line hidden
            this.Write("), DataSerializerGenericMode.");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", Profile = \"");
            
            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 38 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
     }
       foreach (var type in profile.Value.GenericSerializableTypes.Where(x => x.Value.Local && x.Value.SerializerType != null)) {
            
            #line default
            #line hidden
            this.Write("    [DataSerializerGlobalAttribute(typeof(");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp(true)));
            
            #line default
            #line hidden
            this.Write("), typeof(");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(true)));
            
            #line default
            #line hidden
            this.Write("), DataSerializerGenericMode.");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", Profile = \"");
            
            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 41 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
     }
   } 
            
            #line default
            #line hidden
            this.Write("   \tpublic static class ");
            
            #line 43 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write("\r\n\t{\r\n\t    [SiliconStudio.Core.ModuleInitializer]\r\n        internal static void I" +
                    "nitialize()\r\n        {\r\n");
            
            #line 48 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 foreach (var profile in cecilSerializerContext.SerializableTypesProfiles) { 
            
            #line default
            #line hidden
            this.Write("\t\t\tDataSerializerFactory.RegisterSerializationProfile(\"");
            
            #line 49 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\", Register");
            
            #line 49 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write(");\r\n");
            
            #line 50 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("        }\r\n\r\n");
            
            #line 53 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 foreach (var profile in cecilSerializerContext.SerializableTypesProfiles) { 
            
            #line default
            #line hidden
            this.Write("\t\tpublic static void Register");
            
            #line 54 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("(DataSerializerFactory serializerFactory)\r\n\t\t{\r\n\t\t\t// Force module .ctor of refer" +
                    "enced assemblies to be initialized as well\r\n");
            
            #line 57 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 foreach (var referencedAssemblySerializerFactoryType in referencedAssemblySerializerFactoryTypes) { 
            
            #line default
            #line hidden
            this.Write("\t\t\tModuleRuntimeHelpers.RunModuleConstructor(typeof(");
            
            #line 58 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(referencedAssemblySerializerFactoryType.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write(").GetTypeInfo().Module);\r\n");
            
            #line 59 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n\t\t\t// Register types used by this assembly\r\n");
            
            #line 62 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local)) { 
            
            #line default
            #line hidden
            this.Write("\t\t\tif (!serializerFactory.CanSerialize(typeof(");
            
            #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write(")))\r\n\t\t\t{\r\n");
            
            #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
   if (type.Value.SerializerType != null) { 
            
            #line default
            #line hidden
            this.Write("\t\t\t\tserializerFactory.RegisterSerializer(");
            
            #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));
            
            #line default
            #line hidden
            this.Write(", new ");
            
            #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write("());\r\n");
            
            #line 67 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
   } else { 
            
            #line default
            #line hidden
            this.Write("\t\t\t\tserializerFactory.RegisterNullSerializer(");
            
            #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));
            
            #line default
            #line hidden
            this.Write(", typeof(");
            
            #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write("));\r\n");
            
            #line 69 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
   } 
            
            #line default
            #line hidden
            this.Write("\t\t\t}\r\n");
            
            #line 71 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\t\t}\r\n\r\n");
            
            #line 74 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
 } // foreach (profile) 
            
            #line default
            #line hidden
            this.Write("\t}\r\n}\r\n\r\n");
            
            #line 78 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"

// Generate complex serializers
foreach (var complexType in cecilSerializerContext.ComplexTypes)
{
	var complexClassSerializerGenerator = new ComplexClassSerializerGenerator(complexType.Key, complexType.Value.ComplexSerializerProcessParentType);
	Write(complexClassSerializerGenerator.TransformText());
} 
            
            #line default
            #line hidden
            return this.GenerationEnvironment.ToString();
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"
using System;
using System.Collections.Generic;
using System.Reflection;
using SiliconStudio.Core.Serialization;
using SiliconStudio.Core.Reflection;
using SiliconStudio.Core.Serialization.Serializers;
using SiliconStudio.DataSerializers;

[assembly: AssemblyVersion(""");
            
            #line 17 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assembly.Name.Version.ToString()));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 18 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 if (targetFramework != null) { 
            
            #line default
            #line hidden
            this.Write("[assembly: System.Runtime.Versioning.TargetFramework(");
            
            #line 19 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(targetFramework));
            
            #line default
            #line hidden
            this.Write(")]\r\n");
            
            #line 20 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n[assembly: SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFacto" +
                    "ry(Type = typeof(SiliconStudio.DataSerializers.");
            
            #line 22 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write(@"))]

namespace SiliconStudio.Core.Serialization.Serializers
{
	class AssemblySerializerFactoryAttribute : Attribute
	{
		public Type Type;
	}
}

namespace SiliconStudio.DataSerializers
{
    // Assembly attributes that defines supported serializer (only generics one so that other assemblies can do generic instantiations by themselves)
");
            
            #line 35 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 foreach (var profile in cecilSerializerContext.SerializableTypesProfiles) {
       foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local)) { 
            
            #line default
            #line hidden
            this.Write("    [DataSerializerGlobalAttribute(");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType != null ? $"typeof({type.Value.SerializerType.ConvertCSharp(false)})" : "null"));
            
            #line default
            #line hidden
            this.Write(", typeof(");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(false)));
            
            #line default
            #line hidden
            this.Write("), DataSerializerGenericMode.");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", Profile = \"");
            
            #line 37 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 38 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
     }
       foreach (var type in profile.Value.GenericSerializableTypes.Where(x => x.Value.Local)) {
            
            #line default
            #line hidden
            this.Write("    [DataSerializerGlobalAttribute(");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType != null ? $"typeof({type.Value.SerializerType.ConvertCSharp(true)})" : "null"));
            
            #line default
            #line hidden
            this.Write(", typeof(");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(true)));
            
            #line default
            #line hidden
            this.Write("), DataSerializerGenericMode.");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", ");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));
            
            #line default
            #line hidden
            this.Write(", Profile = \"");
            
            #line 40 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\")]\r\n");
            
            #line 41 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
     }
   } 
            
            #line default
            #line hidden
            this.Write("   \tpublic static class ");
            
            #line 43 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write("\r\n\t{\r\n\t    [SiliconStudio.Core.ModuleInitializer]\r\n        internal static void I" +
                    "nitialize()\r\n        {\r\n\t\t\tvar assemblySerializers = new AssemblySerializers(typ" +
                    "eof(");
            
            #line 48 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write(").GetTypeInfo().Assembly);\r\n\r\n\t\t\t// Register data contract aliases\r\n");
            
            #line 51 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 foreach (var alias in cecilSerializerContext.DataContractAliases) { 
            
            #line default
            #line hidden
            this.Write("\t\t\tassemblySerializers.DataContractAliases.Add(new KeyValuePair<string, Type>(@\"");
            
            #line 52 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(alias.Key));
            
            #line default
            #line hidden
            this.Write("\", typeof(");
            
            #line 52 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(alias.Value.ConvertCSharp(true)));
            
            #line default
            #line hidden
            this.Write(")));\r\n");
            
            #line 53 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n");
            
            #line 55 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 foreach (var referencedAssemblySerializerFactoryType in referencedAssemblySerializerFactoryTypes) { 
            
            #line default
            #line hidden
            this.Write("\t\t\tassemblySerializers.Modules.Add(typeof(");
            
            #line 56 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(referencedAssemblySerializerFactoryType.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write(").GetTypeInfo().Module);\r\n");
            
            #line 57 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n");
            
            #line 59 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 foreach (var profile in cecilSerializerContext.SerializableTypesProfiles) { 
            
            #line default
            #line hidden
            this.Write("\t\t\t{\r\n\t\t\t\tvar assemblySerializersProfile = new AssemblySerializersPerProfile();\r\n" +
                    "\t\t\t\tassemblySerializers.Profiles[\"");
            
            #line 62 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));
            
            #line default
            #line hidden
            this.Write("\"] = assemblySerializersProfile;\r\n\r\n");
            
            #line 64 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
   foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local)) { 
            
            #line default
            #line hidden
            this.Write("\t\t\t\tassemblySerializersProfile.Add(new AssemblySerializerEntry(");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));
            
            #line default
            #line hidden
            this.Write(", typeof(");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write("), ");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 if (type.Value.SerializerType != null) { 
            
            #line default
            #line hidden
            this.Write("typeof(");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write(")");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } else { 
            
            #line default
            #line hidden
            this.Write("null");
            
            #line 65 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("));\r\n");
            
            #line 66 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
       if (type.Value.SerializerType?.Resolve()?.Methods.Any(x => x.IsConstructor && x.IsStatic) == true) {
			// Some data serializer have static constructor, force them to run
			// TODO: It is currently used for update engine registration, but we could also make a specific method to not mix it with static ctor. 
            
            #line default
            #line hidden
            this.Write("\t\t\t\tSystem.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(");
            
            #line 69 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));
            
            #line default
            #line hidden
            this.Write(").TypeHandle);\r\n");
            
            #line 70 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
       } 
            
            #line default
            #line hidden
            
            #line 71 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
   } 
            
            #line default
            #line hidden
            this.Write("\t\t\t}\r\n");
            
            #line 73 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
 } 
            
            #line default
            #line hidden
            this.Write("\r\n\t\t\tDataSerializerFactory.RegisterSerializationAssembly(assemblySerializers);\r\n " +
                    "           AssemblyRegistry.Register(typeof(");
            
            #line 76 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));
            
            #line default
            #line hidden
            this.Write(").GetTypeInfo().Assembly, AssemblyCommonCategories.Engine);\r\n        }\r\n\t}\r\n}\r\n\r\n" +
                    "");
            
            #line 81 "D:\Dev\Xenko\Xenko2\sources\common\core\SiliconStudio.AssemblyProcessor\ComplexSerializerCodeGenerator.tt"

// Generate complex serializers
foreach (var complexType in cecilSerializerContext.ComplexTypes)
{
	var complexClassSerializerGenerator = new ComplexClassSerializerGenerator(complexType.Key, complexType.Value.ComplexSerializerProcessParentType);
	Write(complexClassSerializerGenerator.TransformText());
} 
            
            #line default
            #line hidden
            return this.GenerationEnvironment.ToString();
        }
Esempio n. 4
0
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"
using System;
using System.Collections.Generic;
using System.Reflection;
using SiliconStudio.Core.Serialization;
using SiliconStudio.Core.Reflection;
using SiliconStudio.Core.Serialization.Serializers;
using SiliconStudio.DataSerializers;

[assembly: AssemblyVersion(""");

            #line 17 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assembly.Name.Version.ToString()));

            #line default
            #line hidden
            this.Write("\")]\r\n");

            #line 18 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            if (targetFramework != null)
            {
            #line default
            #line hidden
                this.Write("[assembly: System.Runtime.Versioning.TargetFramework(");

            #line 19 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(targetFramework));

            #line default
            #line hidden
                this.Write(")]\r\n");

            #line 20 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("\r\n[assembly: SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFacto" +
                       "ry(Type = typeof(SiliconStudio.DataSerializers.");

            #line 22 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));

            #line default
            #line hidden
            this.Write(@"))]

namespace SiliconStudio.Core.Serialization.Serializers
{
	class AssemblySerializerFactoryAttribute : Attribute
	{
		public Type Type;
	}
}

namespace SiliconStudio.DataSerializers
{
    // Assembly attributes that defines supported serializer (only generics one so that other assemblies can do generic instantiations by themselves)
");

            #line 35 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var profile in cecilSerializerContext.SerializableTypesProfiles)
            {
                foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local))
                {
            #line default
            #line hidden
                    this.Write("    [DataSerializerGlobalAttribute(");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType != null ? $"typeof({type.Value.SerializerType.ConvertCSharp(false)})" : "null"));

            #line default
            #line hidden
                    this.Write(", typeof(");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(false)));

            #line default
            #line hidden
                    this.Write("), DataSerializerGenericMode.");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));

            #line default
            #line hidden
                    this.Write(", ");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", ");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", Profile = \"");

            #line 37 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                    this.Write("\")]\r\n");

            #line 38 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }
                foreach (var type in profile.Value.GenericSerializableTypes.Where(x => x.Value.Local))
                {
            #line default
            #line hidden
                    this.Write("    [DataSerializerGlobalAttribute(");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType != null ? $"typeof({type.Value.SerializerType.ConvertCSharp(true)})" : "null"));

            #line default
            #line hidden
                    this.Write(", typeof(");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(true)));

            #line default
            #line hidden
                    this.Write("), DataSerializerGenericMode.");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));

            #line default
            #line hidden
                    this.Write(", ");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", ");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", Profile = \"");

            #line 40 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                    this.Write("\")]\r\n");

            #line 41 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }
            }

            #line default
            #line hidden
            this.Write("   \tpublic static class ");

            #line 43 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));

            #line default
            #line hidden
            this.Write("\r\n\t{\r\n\t    [SiliconStudio.Core.ModuleInitializer]\r\n        internal static void I" +
                       "nitialize()\r\n        {\r\n\t\t\tvar assemblySerializers = new AssemblySerializers(typ" +
                       "eof(");

            #line 48 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));

            #line default
            #line hidden
            this.Write(").GetTypeInfo().Assembly);\r\n\r\n\t\t\t// Register data contract aliases\r\n");

            #line 51 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var alias in cecilSerializerContext.DataContractAliases)
            {
            #line default
            #line hidden
                this.Write("\t\t\tassemblySerializers.DataContractAliases.Add(new KeyValuePair<string, Type>(@\"");

            #line 52 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(alias.Key));

            #line default
            #line hidden
                this.Write("\", typeof(");

            #line 52 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(alias.Value.ConvertCSharp(true)));

            #line default
            #line hidden
                this.Write(")));\r\n");

            #line 53 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("\r\n");

            #line 55 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var referencedAssemblySerializerFactoryType in referencedAssemblySerializerFactoryTypes)
            {
            #line default
            #line hidden
                this.Write("\t\t\tassemblySerializers.Modules.Add(typeof(");

            #line 56 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(referencedAssemblySerializerFactoryType.ConvertCSharp()));

            #line default
            #line hidden
                this.Write(").GetTypeInfo().Module);\r\n");

            #line 57 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("\r\n");

            #line 59 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var profile in cecilSerializerContext.SerializableTypesProfiles)
            {
            #line default
            #line hidden
                this.Write("\t\t\t{\r\n\t\t\t\tvar assemblySerializersProfile = new AssemblySerializersPerProfile();\r\n" +
                           "\t\t\t\tassemblySerializers.Profiles[\"");

            #line 62 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                this.Write("\"] = assemblySerializersProfile;\r\n\r\n");

            #line 64 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local))
                {
            #line default
            #line hidden
                    this.Write("\t\t\t\tassemblySerializersProfile.Add(new AssemblySerializerEntry(");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));

            #line default
            #line hidden
                    this.Write(", typeof(");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));

            #line default
            #line hidden
                    this.Write("), ");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    if (type.Value.SerializerType != null)
                    {
            #line default
            #line hidden
                        this.Write("typeof(");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));

            #line default
            #line hidden
                        this.Write(")");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    }
                    else
                    {
            #line default
            #line hidden
                        this.Write("null");

            #line 65 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    }

            #line default
            #line hidden
                    this.Write("));\r\n");

            #line 66 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    if (type.Value.SerializerType?.Resolve()?.Methods.Any(x => x.IsConstructor && x.IsStatic) == true)
                    {
                        // Some data serializer have static constructor, force them to run
                        // TODO: It is currently used for update engine registration, but we could also make a specific method to not mix it with static ctor.

            #line default
            #line hidden
                        this.Write("\t\t\t\tSystem.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(");

            #line 69 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));

            #line default
            #line hidden
                        this.Write(").TypeHandle);\r\n");

            #line 70 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    }

            #line default
            #line hidden

            #line 71 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }

            #line default
            #line hidden
                this.Write("\t\t\t}\r\n");

            #line 73 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("\r\n\t\t\tDataSerializerFactory.RegisterSerializationAssembly(assemblySerializers);\r\n " +
                       "       }\r\n\t}\r\n}\r\n\r\n");

            #line 80 "C:\DEV\xenko\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"

// Generate complex serializers
            foreach (var complexType in cecilSerializerContext.ComplexTypes)
            {
                var complexClassSerializerGenerator = new ComplexClassSerializerGenerator(complexType.Key, complexType.Value.ComplexSerializerProcessParentType);
                Write(complexClassSerializerGenerator.TransformText());
            }

            #line default
            #line hidden
            return(this.GenerationEnvironment.ToString());
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"
using System;
using System.Collections.Generic;
using System.Reflection;
using SiliconStudio.Core.Serialization;
using SiliconStudio.Core.Reflection;
using SiliconStudio.Core.Serialization.Serializers;
using SiliconStudio.DataSerializers;

[assembly: AssemblyVersion(""");

            #line 17 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assembly.Name.Version.ToString()));

            #line default
            #line hidden
            this.Write("\")]\r\n");

            #line 18 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            if (targetFramework != null)
            {
            #line default
            #line hidden
                this.Write("[assembly: System.Runtime.Versioning.TargetFramework(");

            #line 19 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(targetFramework));

            #line default
            #line hidden
                this.Write(")]\r\n");

            #line 20 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("\r\n[assembly: SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFacto" +
                       "ry(Type = typeof(SiliconStudio.DataSerializers.");

            #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));

            #line default
            #line hidden
            this.Write(@"))]

namespace SiliconStudio.Core.Serialization.Serializers
{
	class AssemblySerializerFactoryAttribute : Attribute
	{
		public Type Type;
	}
}

namespace SiliconStudio.DataSerializers
{
    // Assembly attributes that defines supported serializer (only generics one so that other assemblies can do generic instantiations by themselves)
");

            #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var profile in cecilSerializerContext.SerializableTypesProfiles)
            {
                foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local && x.Value.SerializerType != null))
                {
            #line default
            #line hidden
                    this.Write("    [DataSerializerGlobalAttribute(typeof(");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp(false)));

            #line default
            #line hidden
                    this.Write("), typeof(");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(false)));

            #line default
            #line hidden
                    this.Write("), DataSerializerGenericMode.");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));

            #line default
            #line hidden
                    this.Write(", ");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", ");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", Profile = \"");

            #line 37 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                    this.Write("\")]\r\n");

            #line 38 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }
                foreach (var type in profile.Value.GenericSerializableTypes.Where(x => x.Value.Local && x.Value.SerializerType != null))
                {
            #line default
            #line hidden
                    this.Write("    [DataSerializerGlobalAttribute(typeof(");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp(true)));

            #line default
            #line hidden
                    this.Write("), typeof(");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp(true)));

            #line default
            #line hidden
                    this.Write("), DataSerializerGenericMode.");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Mode.ToString()));

            #line default
            #line hidden
                    this.Write(", ");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.Inherited ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", ");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.ComplexSerializer ? "true" : "false"));

            #line default
            #line hidden
                    this.Write(", Profile = \"");

            #line 40 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                    this.Write("\")]\r\n");

            #line 41 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }
            }

            #line default
            #line hidden
            this.Write("   \tpublic static class ");

            #line 43 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(assemblySerializerFactoryClassName));

            #line default
            #line hidden
            this.Write("\r\n\t{\r\n\t    [SiliconStudio.Core.ModuleInitializer]\r\n        internal static void I" +
                       "nitialize()\r\n        {\r\n");

            #line 48 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var profile in cecilSerializerContext.SerializableTypesProfiles)
            {
            #line default
            #line hidden
                this.Write("\t\t\tDataSerializerFactory.RegisterSerializationProfile(\"");

            #line 49 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                this.Write("\", Register");

            #line 49 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                this.Write(");\r\n");

            #line 50 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            }

            #line default
            #line hidden
            this.Write("        }\r\n\r\n");

            #line 53 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            foreach (var profile in cecilSerializerContext.SerializableTypesProfiles)
            {
            #line default
            #line hidden
                this.Write("\t\tpublic static void Register");

            #line 54 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(profile.Key));

            #line default
            #line hidden
                this.Write("(DataSerializerFactory serializerFactory)\r\n\t\t{\r\n\t\t\t// Force module .ctor of refer" +
                           "enced assemblies to be initialized as well\r\n");

            #line 57 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                foreach (var referencedAssemblySerializerFactoryType in referencedAssemblySerializerFactoryTypes)
                {
            #line default
            #line hidden
                    this.Write("\t\t\tModuleRuntimeHelpers.RunModuleConstructor(typeof(");

            #line 58 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(referencedAssemblySerializerFactoryType.ConvertCSharp()));

            #line default
            #line hidden
                    this.Write(").GetTypeInfo().Module);\r\n");

            #line 59 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }

            #line default
            #line hidden
                this.Write("\r\n\t\t\t// Register types used by this assembly\r\n");

            #line 62 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                foreach (var type in profile.Value.SerializableTypes.Where(x => x.Value.Local))
                {
            #line default
            #line hidden
                    this.Write("\t\t\tif (!serializerFactory.CanSerialize(typeof(");

            #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));

            #line default
            #line hidden
                    this.Write(")))\r\n\t\t\t{\r\n");

            #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    if (type.Value.SerializerType != null)
                    {
            #line default
            #line hidden
                        this.Write("\t\t\t\tserializerFactory.RegisterSerializer(");

            #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));

            #line default
            #line hidden
                        this.Write(", new ");

            #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Value.SerializerType.ConvertCSharp()));

            #line default
            #line hidden
                        this.Write("());\r\n");

            #line 67 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    }
                    else
                    {
            #line default
            #line hidden
                        this.Write("\t\t\t\tserializerFactory.RegisterNullSerializer(");

            #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertTypeId()));

            #line default
            #line hidden
                        this.Write(", typeof(");

            #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(type.Key.ConvertCSharp()));

            #line default
            #line hidden
                        this.Write("));\r\n");

            #line 69 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                    }

            #line default
            #line hidden
                    this.Write("\t\t\t}\r\n");

            #line 71 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
                }

            #line default
            #line hidden
                this.Write("\t\t}\r\n\r\n");

            #line 74 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"
            } // foreach (profile)

            #line default
            #line hidden
            this.Write("\t}\r\n}\r\n\r\n");

            #line 78 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexSerializerCodeGenerator.tt"

// Generate complex serializers
            foreach (var complexType in cecilSerializerContext.ComplexTypes)
            {
                var complexClassSerializerGenerator = new ComplexClassSerializerGenerator(complexType.Key, complexType.Value.ComplexSerializerProcessParentType);
                Write(complexClassSerializerGenerator.TransformText());
            }

            #line default
            #line hidden
            return(this.GenerationEnvironment.ToString());
        }