+2010-04-22 Atsushi Enomoto <atsushi@ximian.com>
+
+ * XamlObjectReader.cs, TypeExtensionMethods.cs : now it can return
+ Type name correctly, with INamespacePrefixLookup implementation.
+
2010-04-20 Atsushi Enomoto <atsushi@ximian.com>
* ArrayExtension.cs : remove MonoTODO.
#region type conversion and member value retrieval
- public static string GetStringValue (this XamlType xt, object obj)
+ public static string GetStringValue (this XamlType xt, object obj, INamespacePrefixLookup prefixLookup)
{
if (obj == null)
return String.Empty;
+ if (obj is Type)
+ return new XamlTypeName (xt.SchemaContext.GetXamlType ((Type) obj)).ToString (prefixLookup);
+
if (obj is DateTime)
// FIXME: DateTimeValueSerializer should apply
return (string) TypeDescriptor.GetConverter (typeof (DateTime)).ConvertToInvariantString (obj);
return DoConvert (xt.TypeConverter, target, explicitTargetType ?? xt.UnderlyingType);
}
- public static object GetMemberValueForObjectReader (this XamlMember xm, XamlType xt, object target)
+ public static object GetMemberValueForObjectReader (this XamlMember xm, XamlType xt, object target, INamespacePrefixLookup prefixLookup)
{
- object native = GetPropertyOrFieldValueForObjectReader (xm, xt, target);
+ object native = GetPropertyOrFieldValueForObjectReader (xm, xt, target, prefixLookup);
var convertedType = xm.Type == null ? null : xm.Type.UnderlyingType;
- // FIXME: not sure if it REALLY applies to everywhere.
- if (convertedType == typeof (Type))
- convertedType = typeof (string);
-
return DoConvert (xm.TypeConverter, native, convertedType);
}
return value;
}
- static object GetPropertyOrFieldValueForObjectReader (this XamlMember xm, XamlType xt, object target)
+ static object GetPropertyOrFieldValueForObjectReader (this XamlMember xm, XamlType xt, object target, INamespacePrefixLookup prefixLookup)
{
// FIXME: should this be done here??
if (xm == XamlLanguage.Initialization)
string [] args = new string [argdefs.Length];
for (int i = 0; i < args.Length; i++) {
var am = argdefs [i];
- args [i] = GetStringValue (am.Type, GetMemberValueForObjectReader (am, xt, target));
+ args [i] = GetStringValue (am.Type, GetMemberValueForObjectReader (am, xt, target, prefixLookup), prefixLookup);
}
return String.Join (", ", args);
}
using System.ComponentModel;
using System.Linq;
using System.Windows.Markup;
+using System.Xaml.Schema;
namespace System.Xaml
{
public class XamlObjectReader : XamlReader
{
+ #region nested types
+
class NSList : List<NamespaceDeclaration>
{
public NSList (XamlNodeType ownerType, IEnumerable<NamespaceDeclaration> nsdecls)
}
}
+ class PrefixLookup : INamespacePrefixLookup
+ {
+ XamlObjectReader source;
+
+ public PrefixLookup (XamlObjectReader source)
+ {
+ this.source = source;
+ }
+
+ public string LookupPrefix (string ns)
+ {
+ foreach (var nsd in source.namespaces)
+ if (nsd.Namespace == ns)
+ return nsd.Prefix;
+ return null;
+ }
+ }
+
+ #endregion nested types
+
public XamlObjectReader (object instance)
: this (instance, new XamlSchemaContext (null, null), null)
{
sctx = schemaContext;
this.settings = settings;
+ prefix_lookup = new PrefixLookup (this);
+
if (instance != null) {
// check type validity. Note that some checks are done at Read() phase.
var type = instance.GetType ();
XamlSchemaContext sctx;
XamlObjectReaderSettings settings;
+ INamespacePrefixLookup prefix_lookup;
+
Stack<XamlType> types = new Stack<XamlType> ();
Stack<object> objects = new Stack<object> ();
Stack<IEnumerator<XamlMember>> members_stack = new Stack<IEnumerator<XamlMember>> ();
- IEnumerator<NamespaceDeclaration> namespaces;
+ NSList namespaces;
+ IEnumerator<NamespaceDeclaration> ns_iterator;
XamlNodeType node_type = XamlNodeType.None;
bool is_eof;
}
public override NamespaceDeclaration Namespace {
- get { return NodeType == XamlNodeType.NamespaceDeclaration ? namespaces.Current : null; }
+ get { return NodeType == XamlNodeType.NamespaceDeclaration ? ns_iterator.Current : null; }
}
public override XamlNodeType NodeType {
var l = new List<string> ();
CollectNamespaces (l, instance, root_type);
var nss = from s in l select new NamespaceDeclaration (s, s == XamlLanguage.Xaml2006Namespace ? "x" : s == root_type.PreferredXamlNamespace ? String.Empty : SchemaContext.GetPreferredPrefix (s));
- namespaces = new NSList (XamlNodeType.StartObject, nss).GetEnumerator ();
+ namespaces = new NSList (XamlNodeType.StartObject, nss);
+ ns_iterator = namespaces.GetEnumerator ();
- namespaces.MoveNext ();
+ ns_iterator.MoveNext ();
node_type = XamlNodeType.NamespaceDeclaration;
return true;
case XamlNodeType.NamespaceDeclaration:
- if (namespaces.MoveNext ())
+ if (ns_iterator.MoveNext ())
return true;
- node_type = ((NSEnumerator) namespaces).OwnerType; // StartObject or StartMember
+ node_type = ((NSEnumerator) ns_iterator).OwnerType; // StartObject or StartMember
if (node_type == XamlNodeType.StartObject)
StartNextObject ();
else
var xm = members_stack.Peek ().Current;
var obj = objects.Peek ();
var xt = types.Peek ();
- if (xt.IsContentValue ())
- return xt.GetStringValue (obj);
- return xm != null ? xm.GetMemberValueForObjectReader (xt, obj) : instance;
+
+ object retobj;
+ XamlType retxt;
+ if (xt.IsContentValue ()) {
+ retxt = xt;
+ retobj = obj;
+ } else {
+ retxt = xm.Type;
+ retobj = xm.GetMemberValueForObjectReader (xt, obj, prefix_lookup);
+ }
+
+ // FIXME: I'm not sure if this should be really done
+ // here, but every primitive values seem to be exposed
+ // as a string, not a typed object in XamlObjectReader.
+ if (retxt.IsContentValue ())
+ return retxt.GetStringValue (retobj, prefix_lookup);
+ else
+ return retobj;
}
}
}
+2010-04-22 Atsushi Enomoto <atsushi@ximian.com>
+
+ * XamlObjectReaderTest.cs : enabled working tests. Add decent
+ namespace declaration node assertions in the next tests.
+
2010-04-22 Atsushi Enomoto <atsushi@ximian.com>
* XamlObjectReaderTest.cs : add another MarkupExtension test.
}
[Test]
- [Category ("NotWorking")]
public void Read_Type ()
{
var r = new XamlObjectReader (typeof (int));
}
[Test]
- [Category ("NotWorking")]
public void Read_TypeExtension ()
{
var r = new XamlObjectReader (new TypeExtension (typeof (int)));
{
Assert.IsTrue (r.Read (), "#11");
Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
- Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#13-2");
- Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#13-3");
+
+ var nsmap = new Dictionary<string,string> ();
+ nsmap ["x"] = XamlLanguage.Xaml2006Namespace;
+ nsmap [String.Empty] = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
+
+ Assert.IsTrue (nsmap.ContainsKey (r.Namespace.Prefix), "#13-2");
+ Assert.AreEqual (nsmap [r.Namespace.Prefix], r.Namespace.Namespace, "#13-3:" + r.Namespace.Prefix);
+ nsmap.Remove (r.Namespace.Prefix);
Assert.IsTrue (r.Read (), "#16");
Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#17");
Assert.IsNotNull (r.Namespace, "#18");
- Assert.AreEqual ("x", r.Namespace.Prefix, "#18-2");
- Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#18-3");
+ Assert.IsTrue (nsmap.ContainsKey (r.Namespace.Prefix), "#18-2");
+ Assert.AreEqual (nsmap [r.Namespace.Prefix], r.Namespace.Namespace, "#18-3:" + r.Namespace.Prefix);
+ nsmap.Remove (r.Namespace.Prefix);
Assert.IsTrue (r.Read (), "#21");
Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#3");
Assert.IsTrue (r.Read (), "#4");
Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#5");
- // FIXME: enable this.
- //Assert.AreEqual ("x:Int32", r.Value, "#6");
+ Assert.AreEqual ("x:Int32", r.Value, "#6");
}
void SimpleReadStandardType (object instance)