More compliant ordering of GetAllMembers() results. ConstructorArguments and Position...
authorAtsushi Eno <atsushi@ximian.com>
Fri, 29 Oct 2010 09:32:18 +0000 (18:32 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Fri, 29 Oct 2010 09:32:18 +0000 (18:32 +0900)
mcs/class/System.Xaml/System.Xaml/XamlMember.cs
mcs/class/System.Xaml/System.Xaml/XamlType.cs
mcs/class/System.Xaml/Test/System.Xaml/TestedTypes.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlObjectReaderTest.cs

index d8cab94973cf231c12e4ded4d96a2adf46e87970..f310b0f490bde1f14a4685c3d3c592dcda5ce40c 100644 (file)
@@ -235,6 +235,13 @@ namespace System.Xaml
                public XamlValueConverter<ValueSerializer> ValueSerializer {
                        get { return LookupValueSerializer (); }
                }
+               
+               internal bool IsConstructorArgument {
+                       get {
+                               var ap = GetCustomAttributeProvider ();
+                               return ap != null && ap.GetCustomAttributes (typeof (ConstructorArgumentAttribute), false).Length > 0;
+                       }
+               }
 
                public static bool operator == (XamlMember left, XamlMember right)
                {
index b7fcea432c626a2c82916d609d82a21c21be0687..c6cce8673812e1ff4923c94e7bf733308df5d8d3 100644 (file)
@@ -388,12 +388,32 @@ namespace System.Xaml
 
                int CompareMembers (XamlMember m1, XamlMember m2)
                {
+                       // ConstructorArguments and PositionalParameters go first.
+                       if (m1 == XamlLanguage.PositionalParameters)
+                               return -1;
+                       if (m2 == XamlLanguage.PositionalParameters)
+                               return 1;
+                       if (m1.IsConstructorArgument) {
+                               if (!m2.IsConstructorArgument)
+                                       return -1;
+                       }
+                       else if (m2.IsConstructorArgument)
+                               return 1;
+
                        // ContentProperty is returned at last.
                        if (m1.DeclaringType.ContentProperty == m1)
                                return 1;
-                       else if (m2.DeclaringType.ContentProperty == m2)
+                       if (m2.DeclaringType.ContentProperty == m2)
                                return -1;
 
+                       // compare collection kind
+                       var t1 = m1.Type;
+                       var t2 = m2.Type;
+                       int coll1 = t1.IsDictionary ? 3 : t1.IsCollection ? 2 : t1.IsArray ? 1 : 0;
+                       int coll2 = t2.IsDictionary ? 3 : t2.IsCollection ? 2 : t2.IsArray ? 1 : 0;
+                       if (coll1 != coll2)
+                               return coll2 - coll1;
+
                        // then, compare names.
                        return String.CompareOrdinal (m1.Name, m2.Name);
                }
index aa73111006682ce6d646f109b44901fe1eff4528..0eababad4a98ed5454a549cfc606796872cc04a8 100644 (file)
@@ -97,9 +97,6 @@ namespace MonoTests.System.Xaml
                {
                        this.Type = type;
                }
-               
-               [ConstructorArgument ("type")]
-               public Type Type { get; set; }
 
                IList items;
                public IList Items {
@@ -107,6 +104,9 @@ namespace MonoTests.System.Xaml
                        private set { items = value; }
                }
                
+               [ConstructorArgument ("type")]
+               public Type Type { get; set; }
+               
                public override object ProvideValue (IServiceProvider serviceProvider)
                {
                        if (Type == null)
index 1d1b8ea43f21520df4a1b489111f70cd429ccd25..e0114cc37a5b79bca63b08217c5c35f23140d0df 100644 (file)
@@ -776,7 +776,6 @@ namespace MonoTests.System.Xaml
                }
                
                [Test]
-               [Category ("NotWorking")]
                public void Read_MyArrayExtension ()
                {
                        var obj = new MyArrayExtension (new int [] {5, -3, 0});