private void WriteEncodedStructMethod(StructMapping structMapping)
{
if (structMapping.TypeDesc.IsRoot)
return;
bool useReflection = structMapping.TypeDesc.UseReflection;
string methodName = (string)MethodNames[structMapping];
Writer.WriteLine();
Writer.Write("object");
Writer.Write(" ");
Writer.Write(methodName);
Writer.Write("(");
Writer.WriteLine(") {");
Writer.Indent++;
Member[] members;
bool anyFixups;
string fixupMethodName;
if (structMapping.TypeDesc.IsAbstract)
{
Writer.Write("throw CreateAbstractTypeException(");
WriteQuotedCSharpString(structMapping.TypeName);
Writer.Write(", ");
WriteQuotedCSharpString(structMapping.Namespace);
Writer.WriteLine(");");
members = new Member[0];
anyFixups = false;
fixupMethodName = null;
}
else
{
WriteCreateMapping(structMapping, "o");
MemberMapping[] mappings = TypeScope.GetSettableMembers(structMapping);
members = new Member[mappings.Length];
for (int i = 0; i < mappings.Length; i++)
{
MemberMapping mapping = mappings[i];
CodeIdentifier.CheckValidIdentifier(mapping.Name);
string source = RaCodeGen.GetStringForMember("o", mapping.Name, structMapping.TypeDesc);
Member member = new Member(this, source, source, "a", i, mapping, GetChoiceIdentifierSource(mapping, "o", structMapping.TypeDesc));
if (mapping.CheckSpecified == SpecifiedAccessor.ReadWrite)
member.CheckSpecifiedSource = RaCodeGen.GetStringForMember("o", mapping.Name + "Specified", structMapping.TypeDesc);
if (!mapping.IsSequence)
member.ParamsReadSource = "paramsRead[" + i.ToString(CultureInfo.InvariantCulture) + "]";
members[i] = member;
}
fixupMethodName = "fixup_" + methodName;
anyFixups = WriteMemberFixupBegin(members, fixupMethodName, "o");
// we're able to not do WriteMemberBegin here because we don't allow arrays as attributes
WriteParamsRead(mappings.Length);
WriteAttributes(members, null, "UnknownNode", "(object)o");
Writer.WriteLine("Reader.MoveToElement();");
Writer.WriteLine("if (Reader.IsEmptyElement) { Reader.Skip(); return o; }");
Writer.WriteLine("Reader.ReadStartElement();");
int loopIndex = WriteWhileNotLoopStart();
Writer.Indent++;
WriteMemberElements(members, "UnknownNode((object)o);", "UnknownNode((object)o);", null, null, null);
Writer.WriteLine("Reader.MoveToContent();");
WriteWhileLoopEnd(loopIndex);
Writer.WriteLine("ReadEndElement();");
Writer.WriteLine("return o;");
}
Writer.Indent--;
Writer.WriteLine("}");
if (anyFixups) WriteFixupMethod(fixupMethodName, members, structMapping.TypeDesc.CSharpName, structMapping.TypeDesc.UseReflection, true, "o");
}