void ReadStartType ()
{
string name = r.LocalName;
string ns = r.NamespaceURI;
string typeArgNames = null;
var members = new List<Pair> ();
var atts = ProcessAttributes (members);
// check TypeArguments to resolve Type, and remove them from the list. They don't appear as a node.
var l = new List<Pair> ();
foreach (var p in members) {
if (p.Key == XamlLanguage.TypeArguments) {
typeArgNames = p.Value;
l.Add (p);
break;
}
}
foreach (var p in l)
members.Remove (p);
XamlType xt;
IList<XamlTypeName> typeArgs = typeArgNames == null ? null : XamlTypeName.ParseList (typeArgNames, xaml_namespace_resolver);
var xtn = new XamlTypeName (ns, name, typeArgs);
xt = sctx.GetXamlType (xtn);
if (xt == null)
// creates name-only XamlType. Also, it does not seem that it does not store this XamlType to XamlSchemaContext (Try GetXamlType(xtn) after reading such xaml node, it will return null).
xt = new XamlType (ns, name, typeArgs == null ? null : typeArgs.Select<XamlTypeName,XamlType> (xxtn => sctx.GetXamlType (xxtn)).ToArray (), sctx);
types.Push (xt);
current = xt;
if (!r.IsEmptyElement) {
r.Read ();
do {
r.MoveToContent ();
switch (r.NodeType) {
case XmlNodeType.Element:
// FIXME: parse type arguments etc.
case XmlNodeType.EndElement:
break;
default:
// this value is for Initialization, or Content property value
if (xt.ContentProperty != null)
members.Add (new Pair (xt.ContentProperty, r.Value));
else
members.Add (new Pair (XamlLanguage.Initialization, r.Value));
r.Read ();
continue;
}
break;
} while (true);
}
else
is_empty_object = true;
foreach (var p in atts) {
int idx = p.Key.IndexOf (':');
string prefix = idx > 0 ? p.Key.Substring (0, idx) : String.Empty;
string aname = idx > 0 ? p.Key.Substring (idx + 1) : p.Key;
idx = aname.IndexOf ('.');
if (idx > 0) {
string apns = prefix.Length > 0 ? r.LookupNamespace (prefix) : r.NamespaceURI;
var apname = aname.Substring (0, idx);
var axtn = new XamlTypeName (apns, apname, null);
var at = sctx.GetXamlType (axtn);
var am = at.GetAttachableMember (aname.Substring (idx + 1));
if (am != null)
members.Add (new Pair (am, p.Value));
// ignore unknown attribute
}
var xm = xt.GetMember (aname);
if (xm != null)
members.Add (new Pair (xm, p.Value));
// ignore unknown attribute
}
node_type = XamlNodeType.StartObject;
inside_object_not_member = true;
// The next Read() results are likely directives.
stored_member_enumerator = members.GetEnumerator ();
}