10 namespace SiliconStudio.AssemblyProcessor
13 using System.Reflection;
14 using System.Collections.Generic;
22 #line 1 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
23 [global::System.CodeDom.Compiler.GeneratedCodeAttribute(
"Microsoft.VisualStudio.TextTemplating",
"11.0.0.0")]
24 internal partial
class ComplexClassSerializerGenerator : ComplexClassSerializerGeneratorBase
30 public virtual string TransformText()
34 #line 7 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
36 var className = SerializerTypeName(type,
true,
true);
37 var parentType = hasParentSerializer ? ResolveGenericsVisitor.Process(type, type.BaseType) : null;
42 this.Write(
"\r\nnamespace SiliconStudio.DataSerializers\r\n{\r\n\t");
44 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
45 if (type.HasGenericParameters) {
49 this.Write(
"public ");
51 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
56 this.Write(
"sealed class ");
58 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
59 this.Write(this.ToStringHelper.ToStringWithCulture(className));
65 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
66 this.Write(this.ToStringHelper.ToStringWithCulture(type.IsClass && !type.IsValueType && !type.IsAbstract && HasEmptyConstructor(type) ?
"Class" : string.Empty));
70 this.Write(
"DataSerializer<");
72 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
73 this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
77 this.Write(
">, IDataSerializerInitializer");
79 #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
80 this.Write(this.ToStringHelper.ToStringWithCulture(GenerateGenericConstraints(type)));
84 this.Write(
"\r\n\t{\r\n");
86 #line 16 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
87 if (hasParentSerializer) {
91 this.Write(
"\t\tprivate DataSerializer<");
93 #line 17 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
94 this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
98 this.Write(
"> parentSerializer;\r\n");
100 #line 18 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
102 var serializableItems = GetSerializableItems(type,
true).ToArray();
108 #line 21 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
109 foreach (var serializableItem
in serializableItems) {
113 this.Write(
"\t\tprivate DataSerializer<");
115 #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
116 this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.Type.ConvertCSharp()));
122 #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
123 this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
127 this.Write(
"Serializer;\r\n");
129 #line 23 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
134 this.Write(
"\r\n\t\tpublic void Initialize(SerializerSelector serializerSelector)\r\n\t\t{\r\n");
136 #line 27 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
137 if (hasParentSerializer) {
141 this.Write(
"\t\t\t// Get parent serializer\r\n\t\t\tparentSerializer = serializerSelector.GetSerializ" +
144 #line 29 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
145 this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
149 this.Write(
">();\r\n\t\t\tif (parentSerializer == null)\r\n\t\t\t\tthrow new InvalidOperationException(s" +
150 "tring.Format(\"Could not find parent serializer for type {0}\", @\"");
152 #line 31 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
153 this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
157 this.Write(
"\"));\r\n");
159 #line 32 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
164 this.Write(
"\t\t\t// Cache member serializers\r\n");
166 #line 34 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
167 foreach (var serializableItem
in serializableItems) {
171 this.Write(
"\t\t\t");
173 #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
174 this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
178 this.Write(
"Serializer = MemberSerializer<");
180 #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
181 this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.Type.ConvertCSharp()));
185 this.Write(
">.Create(serializerSelector);\r\n");
187 #line 36 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
192 this.Write(
"\t\t}\r\n\r\n\t\tpublic override void Serialize(ref ");
194 #line 39 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
195 this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
199 this.Write(
" obj, ArchiveMode mode, SerializationStream stream)\r\n\t\t{\r\n");
201 #line 41 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
202 if (hasParentSerializer) {
206 this.Write(
"\t\t\t// Serialize parent (for now we don\'t copy reference back because it shouldn\'t" +
207 " change)\r\n\t\t\t");
209 #line 43 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
210 this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
214 this.Write(
" parentObj = obj;\r\n\t\t\tparentSerializer.Serialize(ref parentObj, mode, stream);\r\n\t" +
217 #line 45 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
218 this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
222 this.Write(
")parentObj;\r\n\r\n");
224 #line 47 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
226 foreach (var serializableItem
in serializableItems) {
227 var memberType = serializableItem.Type;
228 var memberTypeName = serializableItem.Type.ConvertCSharp();
229 var memberName = serializableItem.MemberInfo.Name;
230 var memberVariableName = CreateMemberVariableName(serializableItem.MemberInfo);
231 var memberAccessName = (serializableItem.MemberInfo is PropertyDefinition) ? memberVariableName :
"obj." + memberName;
233 if (serializableItem.HasFixedAttribute)
238 this.Write(
"\t\tthrow new NotImplementedException(\"FixedBuffer attribute is not supported.\");\r\n" +
241 #line 58 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
245 if (serializableItem.MemberInfo is PropertyDefinition)
252 #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
253 this.Write(this.ToStringHelper.ToStringWithCulture(memberTypeName));
259 #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
260 this.Write(this.ToStringHelper.ToStringWithCulture(memberVariableName));
264 this.Write(
" = obj.");
266 #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
267 this.Write(this.ToStringHelper.ToStringWithCulture(memberName));
273 #line 64 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
280 #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
281 this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
285 this.Write(
"Serializer.Serialize(ref ");
287 #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
288 this.Write(this.ToStringHelper.ToStringWithCulture(memberAccessName));
292 this.Write(
", mode, stream);\r\n");
294 #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
295 if (serializableItem.MemberInfo is PropertyDefinition && serializableItem.AssignBack)
302 #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
303 this.Write(this.ToStringHelper.ToStringWithCulture(memberName));
309 #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
310 this.Write(this.ToStringHelper.ToStringWithCulture(memberVariableName));
316 #line 69 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
323 this.Write(
"\t\t}\r\n\r\n\t\tinternal static void ForceGenericInstantiation()\r\n\t\t{\r\n");
325 #line 76 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
327 foreach (var memberSerializerType
in EnumerateSerializerTypes(serializableItems.Select(x => x.Type))){
331 this.Write(
"\t\t\ttypeof(");
333 #line 78 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
334 this.Write(this.ToStringHelper.ToStringWithCulture(memberSerializerType.ConvertCSharp()));
338 this.Write(
").ToString();\r\n");
340 #line 79 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
345 this.Write(
"\t\t}\r\n\t}\r\n}");
346 return this.GenerationEnvironment.ToString();
356 [global::System.CodeDom.Compiler.GeneratedCodeAttribute(
"Microsoft.VisualStudio.TextTemplating",
"11.0.0.0")]
357 internal class ComplexClassSerializerGeneratorBase
360 private global::System.Text.StringBuilder generationEnvironmentField;
361 private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
362 private global::System.Collections.Generic.List<
int> indentLengthsField;
363 private string currentIndentField =
"";
364 private bool endsWithNewline;
365 private global::System.Collections.Generic.IDictionary<string,
object> sessionField;
371 protected System.Text.StringBuilder GenerationEnvironment
375 if ((this.generationEnvironmentField == null))
377 this.generationEnvironmentField =
new global::System.Text.StringBuilder();
379 return this.generationEnvironmentField;
383 this.generationEnvironmentField = value;
389 public System.CodeDom.Compiler.CompilerErrorCollection Errors
393 if ((this.errorsField == null))
395 this.errorsField =
new global::System.CodeDom.Compiler.CompilerErrorCollection();
397 return this.errorsField;
403 private System.Collections.Generic.List<
int> indentLengths
407 if ((this.indentLengthsField == null))
409 this.indentLengthsField =
new global::System.Collections.Generic.List<
int>();
411 return this.indentLengthsField;
417 public string CurrentIndent
421 return this.currentIndentField;
427 public virtual global::System.Collections.Generic.IDictionary<string,
object>
Session
431 return this.sessionField;
435 this.sessionField = value;
439 #region Transform-time helpers
443 public void Write(
string textToAppend)
445 if (
string.IsNullOrEmpty(textToAppend))
451 if (((this.GenerationEnvironment.Length == 0)
452 ||
this.endsWithNewline))
454 this.GenerationEnvironment.Append(this.currentIndentField);
455 this.endsWithNewline =
false;
458 if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
460 this.endsWithNewline =
true;
464 if ((this.currentIndentField.Length == 0))
466 this.GenerationEnvironment.Append(textToAppend);
470 textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
473 if (this.endsWithNewline)
475 this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
479 this.GenerationEnvironment.Append(textToAppend);
485 public void WriteLine(
string textToAppend)
487 this.Write(textToAppend);
488 this.GenerationEnvironment.AppendLine();
489 this.endsWithNewline =
true;
494 public void Write(
string format, params
object[] args)
496 this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture,
format, args));
501 public void WriteLine(
string format, params
object[] args)
503 this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture,
format, args));
508 public void Error(
string message)
510 System.CodeDom.Compiler.CompilerError error =
new global::System.CodeDom.Compiler.CompilerError();
511 error.ErrorText = message;
512 this.Errors.Add(error);
517 public void Warning(
string message)
519 System.CodeDom.Compiler.CompilerError error =
new global::System.CodeDom.Compiler.CompilerError();
520 error.ErrorText = message;
521 error.IsWarning =
true;
522 this.Errors.Add(error);
527 public void PushIndent(
string indent)
529 if ((indent == null))
531 throw new global::System.ArgumentNullException(
"indent");
533 this.currentIndentField = (this.currentIndentField + indent);
534 this.indentLengths.Add(indent.Length);
539 public string PopIndent()
541 string returnValue =
"";
542 if ((this.indentLengths.Count > 0))
544 int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
545 this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
546 if ((indentLength > 0))
548 returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
549 this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
557 public void ClearIndent()
559 this.indentLengths.Clear();
560 this.currentIndentField =
"";
563 #region ToString Helpers
569 private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
573 public System.IFormatProvider FormatProvider
577 return this.formatProviderField ;
583 this.formatProviderField = value;
592 if ((objectToConvert == null))
594 throw new global::System.ArgumentNullException(
"objectToConvert");
596 System.Type t = objectToConvert.GetType();
597 System.Reflection.MethodInfo method = t.GetMethod(
"ToString",
new System.Type[] {
598 typeof(System.IFormatProvider)});
599 if ((method == null))
601 return objectToConvert.ToString();
605 return ((
string)(method.Invoke(objectToConvert,
new object[] {
606 this.formatProviderField })));
610 private ToStringInstanceHelper toStringHelperField =
new ToStringInstanceHelper();
614 public ToStringInstanceHelper ToStringHelper
618 return this.toStringHelperField;
string ToStringWithCulture(object objectToConvert)
This is called from the compile/run appdomain to convert objects within an expression block to a stri...
An error message (level 4).
Utility class to produce culture-oriented representation of an object as a string.
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
The template can be applied to an existing PackageSession.
A warning message (level 3).