Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlSerializationCodeGen.cs
Go to the documentation of this file.
3
5
7{
8 private readonly IndentedWriter _writer;
9
10 private int _nextMethodNumber;
11
12 private readonly Hashtable _methodNames = new Hashtable();
13
15
16 private readonly TypeScope[] _scopes;
17
18 private readonly TypeDesc _stringTypeDesc;
19
20 private readonly TypeDesc _qnameTypeDesc;
21
22 private readonly string _access;
23
24 private readonly string _className;
25
27
28 private int _references;
29
30 private readonly Hashtable _generatedMethods = new Hashtable();
31
32 internal IndentedWriter Writer => _writer;
33
34 internal int NextMethodNumber
35 {
36 get
37 {
38 return _nextMethodNumber;
39 }
40 set
41 {
43 }
44 }
45
47
49
51
52 internal string ClassName => _className;
53
54 internal string Access => _access;
55
56 internal TypeScope[] Scopes => _scopes;
57
59
61
62 [RequiresUnreferencedCode("Calls GetTypeDesc")]
64 {
66 _scopes = scopes;
67 if (scopes.Length != 0)
68 {
69 _stringTypeDesc = scopes[0].GetTypeDesc(typeof(string));
71 }
75 }
76
77 [RequiresUnreferencedCode("calls WriteStructMethod")]
78 internal virtual void GenerateMethod(TypeMapping mapping)
79 {
80 }
81
82 [RequiresUnreferencedCode("calls GenerateMethod")]
84 {
85 while (_references > 0)
86 {
89 }
90 }
91
101
103 {
104 if (a == null)
105 {
106 return new TypeMapping[32];
107 }
108 if (index < a.Length)
109 {
110 return a;
111 }
114 return array;
115 }
116
121
123 {
125 _writer.Write(" ");
127 _writer.WriteLine(" = null;");
128 _writer.Write("public override ");
130 _writer.Write(" ");
132 _writer.WriteLine(" {");
133 _writer.Indent++;
134 _writer.WriteLine("get {");
135 _writer.Indent++;
136 _writer.Write("if (");
138 _writer.WriteLine(" == null) {");
139 _writer.Indent++;
141 _writer.Write(" _tmp = new ");
143 _writer.WriteLine("();");
144 }
145
147 {
148 _writer.Write("if (");
150 _writer.Write(" == null) ");
152 _writer.WriteLine(" = _tmp;");
153 _writer.Indent--;
154 _writer.WriteLine("}");
155 _writer.Write("return ");
157 _writer.WriteLine(";");
158 _writer.Indent--;
159 _writer.WriteLine("}");
160 _writer.Indent--;
161 _writer.WriteLine("}");
162 }
163
165 {
167 if (methods != null && methods.Length != 0 && xmlMappings != null && xmlMappings.Length == methods.Length)
168 {
169 for (int i = 0; i < methods.Length; i++)
170 {
171 if (methods[i] != null)
172 {
173 _writer.Write("_tmp[");
175 _writer.Write("] = ");
177 _writer.WriteLine(";");
178 }
179 }
180 }
182 }
183
185 {
186 _writer.Write("public override ");
188 _writer.Write(" CanSerialize(");
190 _writer.WriteLine(" type) {");
191 _writer.Indent++;
192 Hashtable hashtable = new Hashtable();
193 foreach (Type type in types)
194 {
195 if (!(type == null) && (type.IsPublic || type.IsNestedPublic) && hashtable[type] == null && !DynamicAssemblies.IsTypeDynamic(type) && !type.IsGenericType && (!type.ContainsGenericParameters || !DynamicAssemblies.IsTypeDynamic(type.GetGenericArguments())))
196 {
197 hashtable[type] = type;
198 _writer.Write("if (type == typeof(");
200 _writer.WriteLine(")) return true;");
201 }
202 }
203 _writer.WriteLine("return false;");
204 _writer.Indent--;
205 _writer.WriteLine("}");
206 }
207
209 {
213 _writer.Write("public abstract class ");
215 _writer.Write(" : ");
217 _writer.WriteLine(" {");
218 _writer.Indent++;
219 _writer.Write("protected override ");
221 _writer.WriteLine(" CreateReader() {");
222 _writer.Indent++;
223 _writer.Write("return new ");
225 _writer.WriteLine("();");
226 _writer.Indent--;
227 _writer.WriteLine("}");
228 _writer.Write("protected override ");
230 _writer.WriteLine(" CreateWriter() {");
231 _writer.Indent++;
232 _writer.Write("return new ");
234 _writer.WriteLine("();");
235 _writer.Indent--;
236 _writer.WriteLine("}");
237 _writer.Indent--;
238 _writer.WriteLine("}");
239 return baseSerializer;
240 }
241
242 internal string GenerateTypedSerializer(string readMethod, string writeMethod, XmlMapping mapping, CodeIdentifiers classes, string baseSerializer, string readerClass, string writerClass)
243 {
244 string text = CodeIdentifier.MakeValid(Accessor.UnescapeName(mapping.Accessor.Mapping.TypeDesc.Name));
245 text = classes.AddUnique(text + "Serializer", mapping);
247 _writer.Write("public sealed class ");
249 _writer.Write(" : ");
251 _writer.WriteLine(" {");
252 _writer.Indent++;
254 _writer.Write("public override ");
256 _writer.Write(" CanDeserialize(");
258 _writer.WriteLine(" xmlReader) {");
259 _writer.Indent++;
260 if (mapping.Accessor.Any)
261 {
262 _writer.WriteLine("return true;");
263 }
264 else
265 {
266 _writer.Write("return xmlReader.IsStartElement(");
267 WriteQuotedCSharpString(mapping.Accessor.Name);
268 _writer.Write(", ");
269 WriteQuotedCSharpString(mapping.Accessor.Namespace);
270 _writer.WriteLine(");");
271 }
272 _writer.Indent--;
273 _writer.WriteLine("}");
274 if (writeMethod != null)
275 {
277 _writer.Write("protected override void Serialize(object objectToSerialize, ");
279 _writer.WriteLine(" writer) {");
280 _writer.Indent++;
281 _writer.Write("((");
283 _writer.Write(")writer).");
284 _writer.Write(writeMethod);
285 _writer.Write("(");
287 {
288 _writer.Write("(object[])");
289 }
290 _writer.WriteLine("objectToSerialize);");
291 _writer.Indent--;
292 _writer.WriteLine("}");
293 }
294 if (readMethod != null)
295 {
297 _writer.Write("protected override object Deserialize(");
299 _writer.WriteLine(" reader) {");
300 _writer.Indent++;
301 _writer.Write("return ((");
303 _writer.Write(")reader).");
304 _writer.Write(readMethod);
305 _writer.WriteLine("();");
306 _writer.Indent--;
307 _writer.WriteLine("}");
308 }
309 _writer.Indent--;
310 _writer.WriteLine("}");
311 return text;
312 }
313
315 {
316 string privateName = "typedSerializers";
317 GenerateHashtableGetBegin(privateName, "TypedSerializers");
318 foreach (string key in serializers.Keys)
319 {
320 _writer.Write("_tmp.Add(");
322 _writer.Write(", new ");
323 _writer.Write((string)serializers[key]);
324 _writer.WriteLine("());");
325 }
326 GenerateHashtableGetEnd("typedSerializers");
327 }
328
330 {
331 _writer.Write("public override ");
333 _writer.Write(" GetSerializer(");
335 _writer.WriteLine(" type) {");
336 _writer.Indent++;
337 for (int i = 0; i < xmlMappings.Length; i++)
338 {
340 {
341 Type type = xmlMappings[i].Accessor.Mapping.TypeDesc.Type;
342 if (!(type == null) && (type.IsPublic || type.IsNestedPublic) && !DynamicAssemblies.IsTypeDynamic(type) && !type.IsGenericType && (!type.ContainsGenericParameters || !DynamicAssemblies.IsTypeDynamic(type.GetGenericArguments())))
343 {
344 _writer.Write("if (type == typeof(");
346 _writer.Write(")) return new ");
347 _writer.Write((string)serializers[xmlMappings[i].Key]);
348 _writer.WriteLine("();");
349 }
350 }
351 }
352 _writer.WriteLine("return null;");
353 _writer.Indent--;
354 _writer.WriteLine("}");
355 }
356
358 {
360 _writer.Write("public class XmlSerializerContract : global::");
362 _writer.WriteLine(" {");
363 _writer.Indent++;
364 _writer.Write("public override global::");
366 _writer.Write(" Reader { get { return new ");
368 _writer.WriteLine("(); } }");
369 _writer.Write("public override global::");
371 _writer.Write(" Writer { get { return new ");
373 _writer.WriteLine("(); } }");
374 GeneratePublicMethods("readMethods", "ReadMethods", readMethods, xmlMappings);
375 GeneratePublicMethods("writeMethods", "WriteMethods", writerMethods, xmlMappings);
379 _writer.Indent--;
380 _writer.WriteLine("}");
381 }
382
383 internal static bool IsWildcard(SpecialMapping mapping)
384 {
386 {
387 return ((SerializableMapping)mapping).IsAny;
388 }
389 return mapping.TypeDesc.CanBeElementValue;
390 }
391}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
static string UnescapeName(string name)
Definition Accessor.cs:191
static string MakeValid(string identifier)
static string GetCSharpName(string name)
static void WriteQuotedCSharpString(IndentedWriter writer, string value)
TypeDesc GetTypeDesc(string name, string ns)
Definition TypeScope.cs:224
void GeneratePublicMethods(string privateName, string publicName, string[] methods, XmlMapping[] xmlMappings)
TypeMapping[] EnsureArrayIndex(TypeMapping[] a, int index)
void GenerateGetSerializer(Hashtable serializers, XmlMapping[] xmlMappings)
string GenerateBaseSerializer(string baseSerializer, string readerClass, string writerClass, CodeIdentifiers classes)
void GenerateHashtableGetBegin(string privateName, string publicName)
string GenerateTypedSerializer(string readMethod, string writeMethod, XmlMapping mapping, CodeIdentifiers classes, string baseSerializer, string readerClass, string writerClass)
void GenerateSerializerContract(string className, XmlMapping[] xmlMappings, Type[] types, string readerType, string[] readMethods, string writerType, string[] writerMethods, Hashtable serializers)
XmlSerializationCodeGen(IndentedWriter writer, TypeScope[] scopes, string access, string className)