private void WriteMemberElementsIf(Member[] members, Member anyElement, string elementElseString, string checkTypeSource)
{
bool checkType = checkTypeSource != null && checkTypeSource.Length > 0;
//int count = checkType ? 1 : 0;
int count = 0;
bool isSequence = IsSequence(members);
if (isSequence)
{
Writer.WriteLine("switch (state) {");
}
int cases = 0;
for (int i = 0; i < members.Length; i++)
{
Member member = (Member)members[i];
if (member.Mapping.Xmlns != null)
continue;
if (member.Mapping.Ignore)
continue;
if (isSequence && (member.Mapping.IsText || member.Mapping.IsAttribute))
continue;
bool firstElement = true;
ChoiceIdentifierAccessor choice = member.Mapping.ChoiceIdentifier;
ElementAccessor[] elements = member.Mapping.Elements;
for (int j = 0; j < elements.Length; j++)
{
ElementAccessor e = elements[j];
string ns = e.Form == XmlSchemaForm.Qualified ? e.Namespace : "";
if (!isSequence && e.Any && (e.Name == null || e.Name.Length == 0)) continue;
if (!firstElement || (!isSequence && count > 0))
{
Writer.Write("else ");
}
else if (isSequence)
{
Writer.Write("case ");
Writer.Write(cases.ToString(CultureInfo.InvariantCulture));
Writer.WriteLine(":");
Writer.Indent++;
}
count++;
firstElement = false;
Writer.Write("if (");
if (member.ParamsReadSource != null)
{
Writer.Write("!");
Writer.Write(member.ParamsReadSource);
Writer.Write(" && ");
}
if (checkType)
{
if (e.Mapping is NullableMapping)
{
TypeDesc td = ((NullableMapping)e.Mapping).BaseMapping.TypeDesc;
Writer.Write(RaCodeGen.GetStringForTypeof(td.CSharpName, td.UseReflection));
}
else
{
Writer.Write(RaCodeGen.GetStringForTypeof(e.Mapping.TypeDesc.CSharpName, e.Mapping.TypeDesc.UseReflection));
}
Writer.Write(".IsAssignableFrom(");
Writer.Write(checkTypeSource);
Writer.Write("Type)");
}
else
{
if (member.Mapping.IsReturnValue)
Writer.Write("(IsReturnValue || ");
if (isSequence && e.Any && e.AnyNamespaces == null)
{
Writer.Write("true");
}
else
{
WriteXmlNodeEqual("Reader", e.Name, ns);
}
if (member.Mapping.IsReturnValue)
Writer.Write(")");
}
Writer.WriteLine(") {");
Writer.Indent++;
if (checkType)
{
if (e.Mapping.TypeDesc.IsValueType || e.Mapping is NullableMapping)
{
Writer.Write("if (");
Writer.Write(checkTypeSource);
Writer.WriteLine(" != null) {");
Writer.Indent++;
}
if (e.Mapping is NullableMapping)
{
WriteSourceBegin(member.ArraySource);
TypeDesc td = ((NullableMapping)e.Mapping).BaseMapping.TypeDesc;
Writer.Write(RaCodeGen.GetStringForCreateInstance(e.Mapping.TypeDesc.CSharpName, e.Mapping.TypeDesc.UseReflection, false, true, "(" + td.CSharpName + ")" + checkTypeSource));
}
else
{
WriteSourceBeginTyped(member.ArraySource, e.Mapping.TypeDesc);
Writer.Write(checkTypeSource);
}
WriteSourceEnd(member.ArraySource);
Writer.WriteLine(";");
if (e.Mapping.TypeDesc.IsValueType)
{
Writer.Indent--;
Writer.WriteLine("}");
}
if (member.FixupIndex >= 0)
{
Writer.Write("fixup.Ids[");
Writer.Write(member.FixupIndex.ToString(CultureInfo.InvariantCulture));
Writer.Write("] = ");
Writer.Write(checkTypeSource);
Writer.WriteLine("Id;");
}
}
else
{
WriteElement(member.ArraySource, member.ArrayName, member.ChoiceArraySource, e, choice, member.Mapping.CheckSpecified == SpecifiedAccessor.ReadWrite ? member.CheckSpecifiedSource : null, member.IsList && member.Mapping.TypeDesc.IsNullable, member.Mapping.ReadOnly, member.FixupIndex, j);
}
if (member.Mapping.IsReturnValue)
Writer.WriteLine("IsReturnValue = false;");
if (member.ParamsReadSource != null)
{
Writer.Write(member.ParamsReadSource);
Writer.WriteLine(" = true;");
}
Writer.Indent--;
Writer.WriteLine("}");
}
if (isSequence)
{
if (member.IsArrayLike)
{
Writer.WriteLine("else {");
Writer.Indent++;
}
cases++;
Writer.Write("state = ");
Writer.Write(cases.ToString(CultureInfo.InvariantCulture));
Writer.WriteLine(";");
if (member.IsArrayLike)
{
Writer.Indent--;
Writer.WriteLine("}");
}
Writer.WriteLine("break;");
Writer.Indent--;
}
}
if (count > 0)
{
if (isSequence)
Writer.WriteLine("default:");
else
Writer.WriteLine("else {");
Writer.Indent++;
}
WriteMemberElementsElse(anyElement, elementElseString);
if (count > 0)
{
if (isSequence)
{
Writer.WriteLine("break;");
}
Writer.Indent--;
Writer.WriteLine("}");
}
}