private void WriteMember(string source, AttributeAccessor attribute, TypeDesc memberTypeDesc, string parent)
{
if (memberTypeDesc.IsAbstract) return;
if (memberTypeDesc.IsArrayLike)
{
Writer.WriteLine("{");
Writer.Indent++;
string fullTypeName = memberTypeDesc.CSharpName;
WriteArrayLocalDecl(fullTypeName, "a", source, memberTypeDesc);
if (memberTypeDesc.IsNullable)
{
Writer.WriteLine("if (a != null) {");
Writer.Indent++;
}
if (attribute.IsList)
{
if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
{
Writer.Write("Writer.WriteStartAttribute(null, ");
WriteQuotedCSharpString(attribute.Name);
Writer.Write(", ");
string ns = attribute.Form == XmlSchemaForm.Qualified ? attribute.Namespace : String.Empty;
if (ns != null)
{
WriteQuotedCSharpString(ns);
}
else
{
Writer.Write("null");
}
Writer.WriteLine(");");
}
else
{
Writer.Write(typeof(StringBuilder).FullName);
Writer.Write(" sb = new ");
Writer.Write(typeof(StringBuilder).FullName);
Writer.WriteLine("();");
}
}
TypeDesc arrayElementTypeDesc = memberTypeDesc.ArrayElementTypeDesc;
if (memberTypeDesc.IsEnumerable)
{
Writer.Write(" e = ");
Writer.Write(typeof(IEnumerator).FullName);
if (memberTypeDesc.IsPrivateImplementation)
{
Writer.Write("((");
Writer.Write(typeof(IEnumerable).FullName);
Writer.WriteLine(").GetEnumerator();");
}
else if (memberTypeDesc.IsGenericInterface)
{
if (memberTypeDesc.UseReflection)
{
// we use wildcard method name for generic GetEnumerator method, so we cannot use GetStringForMethodInvoke call here
Writer.Write("(");
Writer.Write(typeof(IEnumerator).FullName);
Writer.Write(")");
Writer.Write(RaCodeGen.GetReflectionVariable(memberTypeDesc.CSharpName, "System.Collections.Generic.IEnumerable*"));
Writer.WriteLine(".Invoke(a, new object[0]);");
}
else
{
Writer.Write("((System.Collections.Generic.IEnumerable<");
Writer.Write(arrayElementTypeDesc.CSharpName);
Writer.WriteLine(">)a).GetEnumerator();");
}
}
else
{
if (memberTypeDesc.UseReflection)
{
Writer.Write("(");
Writer.Write(typeof(IEnumerator).FullName);
Writer.Write(")");
}
Writer.Write(RaCodeGen.GetStringForMethodInvoke("a", memberTypeDesc.CSharpName, "GetEnumerator", memberTypeDesc.UseReflection));
Writer.WriteLine(";");
}
Writer.WriteLine("if (e != null)");
Writer.WriteLine("while (e.MoveNext()) {");
Writer.Indent++;
string arrayTypeFullName = arrayElementTypeDesc.CSharpName;
WriteLocalDecl(arrayTypeFullName, "ai", "e.Current", arrayElementTypeDesc.UseReflection);
}
else
{
Writer.Write("for (int i = 0; i < ");
if (memberTypeDesc.IsArray)
{
Writer.WriteLine("a.Length; i++) {");
}
else
{
Writer.Write("((");
Writer.Write(typeof(ICollection).FullName);
Writer.WriteLine(")a).Count; i++) {");
}
Writer.Indent++;
string arrayTypeFullName = arrayElementTypeDesc.CSharpName;
WriteLocalDecl(arrayTypeFullName, "ai", RaCodeGen.GetStringForArrayMember("a", "i", memberTypeDesc), arrayElementTypeDesc.UseReflection);
}
if (attribute.IsList)
{
// check to see if we can write values of the attribute sequentially
if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
{
Writer.WriteLine("if (i != 0) Writer.WriteString(\" \");");
Writer.Write("WriteValue(");
}
else
{
Writer.WriteLine("if (i != 0) sb.Append(\" \");");
Writer.Write("sb.Append(");
}
if (attribute.Mapping is EnumMapping)
WriteEnumValue((EnumMapping)attribute.Mapping, "ai");
else
WritePrimitiveValue(arrayElementTypeDesc, "ai", true);
Writer.WriteLine(");");
}
else
{
WriteAttribute("ai", attribute, parent);
}
Writer.Indent--;
Writer.WriteLine("}");
if (attribute.IsList)
{
// check to see if we can write values of the attribute sequentially
if (CanOptimizeWriteListSequence(memberTypeDesc.ArrayElementTypeDesc))
{
Writer.WriteLine("Writer.WriteEndAttribute();");
}
else
{
Writer.WriteLine("if (sb.Length != 0) {");
Writer.Indent++;
Writer.Write("WriteAttribute(");
WriteQuotedCSharpString(attribute.Name);
Writer.Write(", ");
string ns = attribute.Form == XmlSchemaForm.Qualified ? attribute.Namespace : String.Empty;
if (ns != null)
{
WriteQuotedCSharpString(ns);
Writer.Write(", ");
}
Writer.WriteLine("sb.ToString());");
Writer.Indent--;
Writer.WriteLine("}");
}
}
if (memberTypeDesc.IsNullable)
{
Writer.Indent--;
Writer.WriteLine("}");
}
Writer.Indent--;
Writer.WriteLine("}");
}
else
{
WriteAttribute(source, attribute, parent);
}
}