private string GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping)
{
ElementAccessor element = xmlMembersMapping.Accessor;
MemberMapping[] mappings = ((MembersMapping)element.Mapping).Members;
bool hasWrapperElement = ((MembersMapping)element.Mapping).HasWrapperElement;
string methodName = NextMethodName(element.Name);
Writer.WriteLine();
Writer.Write("public object[] ");
Writer.Write(methodName);
Writer.WriteLine("() {");
Writer.Indent++;
Writer.WriteLine("Reader.MoveToContent();");
Writer.Write("object[] p = new object[");
Writer.Write(mappings.Length.ToString(CultureInfo.InvariantCulture));
Writer.WriteLine("];");
InitializeValueTypes("p", mappings);
int wrapperLoopIndex = 0;
if (hasWrapperElement)
{
wrapperLoopIndex = WriteWhileNotLoopStart();
Writer.Indent++;
WriteIsStartTag(element.Name, element.Form == XmlSchemaForm.Qualified ? element.Namespace : "");
}
Member anyText = null;
Member anyElement = null;
Member anyAttribute = null;
ArrayList membersList = new ArrayList();
ArrayList textOrArrayMembersList = new ArrayList();
ArrayList attributeMembersList = new ArrayList();
for (int i = 0; i < mappings.Length; i++)
{
MemberMapping mapping = mappings[i];
string source = "p[" + i.ToString(CultureInfo.InvariantCulture) + "]";
string arraySource = source;
if (mapping.Xmlns != null)
{
arraySource = "((" + mapping.TypeDesc.CSharpName + ")" + source + ")";
}
string choiceSource = GetChoiceIdentifierSource(mappings, mapping);
Member member = new Member(this, source, arraySource, "a", i, mapping, choiceSource);
Member anyMember = new Member(this, source, null, "a", i, mapping, choiceSource);
if (!mapping.IsSequence)
member.ParamsReadSource = "paramsRead[" + i.ToString(CultureInfo.InvariantCulture) + "]";
if (mapping.CheckSpecified == SpecifiedAccessor.ReadWrite)
{
string nameSpecified = mapping.Name + "Specified";
for (int j = 0; j < mappings.Length; j++)
{
if (mappings[j].Name == nameSpecified)
{
member.CheckSpecifiedSource = "p[" + j.ToString(CultureInfo.InvariantCulture) + "]";
break;
}
}
}
bool foundAnyElement = false;
if (mapping.Text != null) anyText = anyMember;
if (mapping.Attribute != null && mapping.Attribute.Any)
anyAttribute = anyMember;
if (mapping.Attribute != null || mapping.Xmlns != null)
attributeMembersList.Add(member);
else if (mapping.Text != null)
textOrArrayMembersList.Add(member);
if (!mapping.IsSequence)
{
for (int j = 0; j < mapping.Elements.Length; j++)
{
if (mapping.Elements[j].Any && mapping.Elements[j].Name.Length == 0)
{
anyElement = anyMember;
if (mapping.Attribute == null && mapping.Text == null)
textOrArrayMembersList.Add(anyMember);
foundAnyElement = true;
break;
}
}
}
if (mapping.Attribute != null || mapping.Text != null || foundAnyElement)
membersList.Add(anyMember);
else if (mapping.TypeDesc.IsArrayLike && !(mapping.Elements.Length == 1 && mapping.Elements[0].Mapping is ArrayMapping))
{
membersList.Add(anyMember);
textOrArrayMembersList.Add(anyMember);
}
else
{
if (mapping.TypeDesc.IsArrayLike && !mapping.TypeDesc.IsArray)
member.ParamsReadSource = null; // collection
membersList.Add(member);
}
}
Member[] members = (Member[])membersList.ToArray(typeof(Member));
Member[] textOrArrayMembers = (Member[])textOrArrayMembersList.ToArray(typeof(Member));
if (members.Length > 0 && members[0].Mapping.IsReturnValue) Writer.WriteLine("IsReturnValue = true;");
WriteParamsRead(mappings.Length);
if (attributeMembersList.Count > 0)
{
Member[] attributeMembers = (Member[])attributeMembersList.ToArray(typeof(Member));
WriteMemberBegin(attributeMembers);
WriteAttributes(attributeMembers, anyAttribute, "UnknownNode", "(object)p");
WriteMemberEnd(attributeMembers);
Writer.WriteLine("Reader.MoveToElement();");
}
WriteMemberBegin(textOrArrayMembers);
if (hasWrapperElement)
{
Writer.WriteLine("if (Reader.IsEmptyElement) { Reader.Skip(); Reader.MoveToContent(); continue; }");
Writer.WriteLine("Reader.ReadStartElement();");
}
if (IsSequence(members))
{
Writer.WriteLine("int state = 0;");
}
int loopIndex = WriteWhileNotLoopStart();
Writer.Indent++;
string unknownNode = "UnknownNode((object)p, " + ExpectedElements(members) + ");";
WriteMemberElements(members, unknownNode, unknownNode, anyElement, anyText, null);
Writer.WriteLine("Reader.MoveToContent();");
WriteWhileLoopEnd(loopIndex);
WriteMemberEnd(textOrArrayMembers);
if (hasWrapperElement)
{
Writer.WriteLine("ReadEndElement();");
Writer.Indent--;
Writer.WriteLine("}");
WriteUnknownNode("UnknownNode", "null", element, true);
Writer.WriteLine("Reader.MoveToContent();");
WriteWhileLoopEnd(wrapperLoopIndex);
}
Writer.WriteLine("return p;");
Writer.Indent--;
Writer.WriteLine("}");
return methodName;
}