Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ GenerateMembersElement()

string System.Xml.Serialization.XmlSerializationWriterILGen.GenerateMembersElement ( XmlMembersMapping xmlMembersMapping)
inlineprivate

Definition at line 316 of file XmlSerializationWriterILGen.cs.

317 {
318 ElementAccessor accessor = xmlMembersMapping.Accessor;
319 MembersMapping membersMapping = (MembersMapping)accessor.Mapping;
320 bool hasWrapperElement = membersMapping.HasWrapperElement;
321 bool writeAccessors = membersMapping.WriteAccessors;
322 string text = NextMethodName(accessor.Name);
323 ilg = new CodeGenerator(typeBuilder);
324 ilg.BeginMethod(typeof(void), text, new Type[1] { typeof(object[]) }, new string[1] { "p" }, MethodAttributes.Public | MethodAttributes.HideBySig);
325 MethodInfo method = typeof(XmlSerializationWriter).GetMethod("WriteStartDocument", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
326 ilg.Ldarg(0);
327 ilg.Call(method);
328 MethodInfo method2 = typeof(XmlSerializationWriter).GetMethod("TopLevelElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
329 ilg.Ldarg(0);
332 ilg.Ldarg("p");
333 ilg.Ldlen();
336 {
337 WriteStartElement(accessor.Name, (accessor.Form == XmlSchemaForm.Qualified) ? accessor.Namespace : "", writePrefixed: false);
338 int num = FindXmlnsIndex(membersMapping.Members);
339 if (num >= 0)
340 {
343 handler.AppendLiteral("((");
344 handler.AppendFormatted(typeof(XmlSerializerNamespaces).FullName);
345 handler.AppendLiteral(")p[");
346 handler.AppendFormatted(num);
347 handler.AppendLiteral("])");
348 string source = string.Create(invariantCulture, ref handler);
350 ilg.Ldc(num);
351 ilg.If(Cmp.GreaterThan);
353 ilg.EndIf();
354 }
355 for (int i = 0; i < membersMapping.Members.Length; i++)
356 {
357 MemberMapping memberMapping = membersMapping.Members[i];
358 if (memberMapping.Attribute == null || memberMapping.Ignore)
359 {
360 continue;
361 }
362 SourceInfo source2 = new SourceInfo($"p[{i}]", null, null, localBuilder.LocalType.GetElementType(), ilg);
363 SourceInfo sourceInfo = null;
364 int intVar = 0;
365 if (memberMapping.CheckSpecified != 0)
366 {
367 string text2 = memberMapping.Name + "Specified";
368 for (int j = 0; j < membersMapping.Members.Length; j++)
369 {
370 if (membersMapping.Members[j].Name == text2)
371 {
372 sourceInfo = new SourceInfo($"((bool)p[{j}])", null, null, typeof(bool), ilg);
373 intVar = j;
374 break;
375 }
376 }
377 }
379 ilg.Ldc(i);
380 ilg.If(Cmp.GreaterThan);
381 if (sourceInfo != null)
382 {
386 ilg.Ldc(intVar);
387 ilg.Ble(label);
388 sourceInfo.Load(typeof(bool));
389 ilg.Br_S(label2);
393 ilg.If();
394 }
395 WriteMember(source2, memberMapping.Attribute, memberMapping.TypeDesc, "p");
396 if (sourceInfo != null)
397 {
398 ilg.EndIf();
399 }
400 ilg.EndIf();
401 }
402 }
403 for (int k = 0; k < membersMapping.Members.Length; k++)
404 {
405 MemberMapping memberMapping2 = membersMapping.Members[k];
406 if (memberMapping2.Xmlns != null || memberMapping2.Ignore)
407 {
408 continue;
409 }
410 SourceInfo sourceInfo2 = null;
411 int intVar2 = 0;
412 if (memberMapping2.CheckSpecified != 0)
413 {
414 string text3 = memberMapping2.Name + "Specified";
415 for (int l = 0; l < membersMapping.Members.Length; l++)
416 {
417 if (membersMapping.Members[l].Name == text3)
418 {
419 sourceInfo2 = new SourceInfo($"((bool)p[{l}])", null, null, typeof(bool), ilg);
420 intVar2 = l;
421 break;
422 }
423 }
424 }
426 ilg.Ldc(k);
427 ilg.If(Cmp.GreaterThan);
428 if (sourceInfo2 != null)
429 {
433 ilg.Ldc(intVar2);
434 ilg.Ble(label3);
435 sourceInfo2.Load(typeof(bool));
436 ilg.Br_S(label4);
440 ilg.If();
441 }
442 string text4 = $"p[{k}]";
443 string choiceSource = null;
444 if (memberMapping2.ChoiceIdentifier != null)
445 {
446 for (int m = 0; m < membersMapping.Members.Length; m++)
447 {
448 if (membersMapping.Members[m].Name == memberMapping2.ChoiceIdentifier.MemberName)
449 {
450 choiceSource = $"(({membersMapping.Members[m].TypeDesc.CSharpName})p[{m}])";
451 break;
452 }
453 }
454 }
455 WriteMember(new SourceInfo(text4, text4, null, null, ilg), choiceSource, memberMapping2.ElementsSortedByDerivation, memberMapping2.Text, memberMapping2.ChoiceIdentifier, memberMapping2.TypeDesc, writeAccessors || hasWrapperElement);
456 if (sourceInfo2 != null)
457 {
458 ilg.EndIf();
459 }
460 ilg.EndIf();
461 }
463 {
465 }
466 ilg.EndMethod();
467 return text;
468 }
static CultureInfo InvariantCulture
LocalBuilder DeclareLocal(Type type, string name)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
void Ldloc(LocalBuilder localBuilder)
void WriteMember(SourceInfo source, AttributeAccessor attribute, TypeDesc memberTypeDesc, string parent)
void WriteStartElement(string name, string ns, bool writePrefixed)

References System.Runtime.CompilerServices.DefaultInterpolatedStringHandler.AppendFormatted(), System.Runtime.CompilerServices.DefaultInterpolatedStringHandler.AppendLiteral(), System.Xml.Serialization.CodeGenerator.BeginMethod(), System.Xml.Serialization.CodeGenerator.Ble(), System.Xml.Serialization.CodeGenerator.Br_S(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.CodeGenerator.DeclareLocal(), System.Xml.Serialization.CodeGenerator.DefineLabel(), System.Xml.Dictionary, System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndIf(), System.Xml.Serialization.CodeGenerator.EndMethod(), System.Xml.Serialization.XmlSerializationWriterILGen.FindXmlnsIndex(), System.FullName, System.Xml.Serialization.CodeGenerator.If(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Globalization.CultureInfo.InvariantCulture, System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.Ldc(), System.Xml.Serialization.CodeGenerator.Ldlen(), System.Xml.Serialization.CodeGenerator.Ldloc(), System.Xml.Serialization.CodeGenerator.MarkLabel(), System.Xml.Serialization.XmlSerializationWriterILGen.NextMethodName(), System.source, System.Xml.Serialization.CodeGenerator.Stloc(), System.text, System.Xml.Serialization.XmlSerializationILGen.typeBuilder, System.Xml.Serialization.XmlSerializationWriterILGen.WriteEndElement(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteMember(), System.Xml.Serialization.XmlSerializationWriterILGen.WriteNamespaces(), and System.Xml.Serialization.XmlSerializationWriterILGen.WriteStartElement().

Referenced by System.Xml.Serialization.XmlSerializationWriterILGen.GenerateElement().