Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ComplexSerializerCodeGenerator.Members.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System.Runtime.Versioning;
4 using SiliconStudio.AssemblyProcessor.Serializers;
5 #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP
6 using System;
7 using System.CodeDom.Compiler;
8 using System.Collections.Generic;
9 using System.Linq;
10 using System.Text;
11 using Mono.Cecil;
13 
14 namespace SiliconStudio.AssemblyProcessor
15 {
16  internal partial class ComplexSerializerCodeGenerator
17  {
18  private string targetFramework;
19 
20  private AssemblyDefinition assembly;
21  private string assemblySerializerFactoryClassName;
22  private List<TypeReference> referencedAssemblySerializerFactoryTypes = new List<TypeReference>();
23 
24  private List<ICecilSerializerDependency> serializerDependencies = new List<ICecilSerializerDependency>();
25  private List<ICecilSerializerFactory> serializerFactories = new List<ICecilSerializerFactory>();
26  private CecilSerializerContext cecilSerializerContext;
27 
28  //private List<IDataSerializerFactory> serializerFactories = new List<IDataSerializerFactory>();
29 
30  public List<ICecilSerializerDependency> SerializerDependencies
31  {
32  get { return serializerDependencies; }
33  }
34 
35  public List<ICecilSerializerFactory> SerializerFactories
36  {
37  get { return serializerFactories; }
38  }
39 
40  public ComplexSerializerCodeGenerator(IAssemblyResolver assemblyResolver, AssemblyDefinition assembly)
41  {
42  this.assembly = assembly;
43  this.assemblySerializerFactoryClassName = assembly.Name.Name.Replace(" ", string.Empty).Replace(".", string.Empty) + "SerializerFactory";
44 
45  // Register referenced assemblies serializer factory, so that we can call them recursively
46  foreach (var referencedAssemblyName in assembly.MainModule.AssemblyReferences)
47  {
48  var referencedAssembly = assembly.MainModule.AssemblyResolver.Resolve(referencedAssemblyName);
49 
50  var assemblySerializerFactoryType = GetSerializerFactoryType(referencedAssembly);
51  if (assemblySerializerFactoryType != null)
52  referencedAssemblySerializerFactoryTypes.Add(assemblySerializerFactoryType);
53  }
54 
55  // Find target framework and replicate it for serializer assembly.
56  var targetFrameworkAttribute = assembly.CustomAttributes
57  .FirstOrDefault(x => x.AttributeType.FullName == typeof(TargetFrameworkAttribute).FullName);
58  if (targetFrameworkAttribute != null)
59  {
60  targetFramework = "\"" + (string)targetFrameworkAttribute.ConstructorArguments[0].Value + "\"";
61  var frameworkDisplayNameField = targetFrameworkAttribute.Properties.FirstOrDefault(x => x.Name == "FrameworkDisplayName");
62  if (frameworkDisplayNameField.Name != null)
63  {
64  targetFramework += ", FrameworkDisplayName=\"" + (string)frameworkDisplayNameField.Argument.Value + "\"";
65  }
66  }
67 
68  // Prepare serializer processors
69  cecilSerializerContext = new CecilSerializerContext(assembly);
70  var processors = new List<ICecilSerializerProcessor>();
71 
72  // Import list of serializer registered by referenced assemblies
73  processors.Add(new ReferencedAssemblySerializerProcessor());
74 
75  // Generate serializers for types tagged as serializable
76  processors.Add(new CecilComplexClassSerializerProcessor());
77 
78  // Generate serializers for PropertyKey and ParameterKey
79  processors.Add(new PropertyKeySerializerProcessor());
80 
81  // Profile serializers
82  processors.Add(new ProfileSerializerProcessor());
83 
84  // Apply each processor
85  foreach (var processor in processors)
86  processor.ProcessSerializers(cecilSerializerContext);
87  }
88 
89  internal static TypeDefinition GetSerializerFactoryType(AssemblyDefinition referencedAssembly)
90  {
91  var assemblySerializerFactoryAttribute =
92  referencedAssembly.CustomAttributes.FirstOrDefault(
93  x =>
94  x.AttributeType.FullName ==
95  "SiliconStudio.Core.Serialization.Serializers.AssemblySerializerFactoryAttribute");
96 
97  // No serializer factory?
98  if (assemblySerializerFactoryAttribute == null)
99  return null;
100 
101  var typeReference = (TypeReference)assemblySerializerFactoryAttribute.Fields.Single(x => x.Name == "Type").Argument.Value;
102  if (typeReference == null)
103  return null;
104 
105  return typeReference.Resolve();
106  }
107  }
108 }
109 #endif
Mono.Cecil.TypeAttributes TypeAttributes
Fill CecilSerializerContext.SerializableTypes with serializable types handled by referenced assemblie...