Fix attribute state management to handle x:Key inside MarkupExtension correctly.
authorAtsushi Eno <atsushi@ximian.com>
Mon, 8 Nov 2010 11:22:09 +0000 (20:22 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Mon, 8 Nov 2010 11:22:09 +0000 (20:22 +0900)
Namely TypeExtension (it got working).

mcs/class/System.Xaml/System.Xaml/XamlType.cs
mcs/class/System.Xaml/System.Xaml/XamlXmlWriter-new.cs
mcs/class/System.Xaml/Test/System.Xaml.Schema/XamlValueConverterTest.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlSchemaContextTest.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlXmlWriterTest.cs

index 652ce8cc3d52a21dc7ec7b8f3d3f1bf8dead32d6..aaa0168ac3f900065f580553892948d73948bccd 100755 (executable)
@@ -697,8 +697,8 @@ namespace System.Xaml
                        if (a != null)
                                return SchemaContext.GetValueConverter<TypeConverter> (Type.GetType (a.ConverterTypeName), this);
 
-                       if (t == typeof (object))
-                               return SchemaContext.GetValueConverter<TypeConverter> (typeof (TypeConverter), this);
+                       if (t == typeof (object)) // This is a special case. ConverterType is null.
+                               return SchemaContext.GetValueConverter<TypeConverter> (null, this);
 
                        // It's still not decent to check CollectionConverter.
                        var tct = TypeDescriptor.GetConverter (t).GetType ();
index b6b879aca75578a9dd910e4a765d90b8055bf162..6f6115b946c83154fd24a8b3d7d6646a1a0365ab 100755 (executable)
@@ -350,6 +350,8 @@ namespace System.Xaml
                public void WriteEndMember ()
                {
                        manager.EndMember ();
+
+                       OnWriteEndMember ();
                        
                        var state = object_states.Peek ();
                        if (CurrentMember == XamlLanguage.PositionalParameters) {
@@ -364,8 +366,6 @@ namespace System.Xaml
                                state.PositionalParameterIndex = -1;
 
                        contents.Clear ();
-
-                       OnWriteEndMember ();
                }
 
                protected abstract void OnWriteEndObject ();
@@ -590,7 +590,7 @@ namespace System.Xaml
                        //   the second constructor argument.
                        // (Here "top-level" means an object that involves
                        //  StartObject i.e. the root or a collection item.)
-                       var posprms = IsAtTopLevelObject () && object_states.Peek ().Type.HasPositionalParameters () ? state.Type.GetSortedConstructorArguments ().GetEnumerator () : null;
+                       var posprms = member == XamlLanguage.PositionalParameters && IsAtTopLevelObject () && object_states.Peek ().Type.HasPositionalParameters () ? state.Type.GetSortedConstructorArguments ().GetEnumerator () : null;
                        if (posprms != null) {
                                if (inside_toplevel_positional_parameter)
                                        throw new XamlXmlWriterException (String.Format ("The XAML reader input has more than one positional parameter values within a top-level object {0}. While XamlObjectReader can read such an object, XamlXmlWriter cannot write such an object to XML.", state.Type));
@@ -599,9 +599,10 @@ namespace System.Xaml
                                w.WriteStartAttribute (arg.Name);
                                inside_toplevel_positional_parameter = true;
                        }
+                       else if (w.WriteState == WriteState.Attribute)
+                               inside_attribute_object = true;
 
                        if (w.WriteState == WriteState.Attribute) {
-                               inside_attribute_object = true;
                                if (state.PositionalParameterIndex < 0) {
                                        w.WriteString (" ");
                                        w.WriteString (member.Name);
@@ -635,9 +636,16 @@ namespace System.Xaml
 
                AllowedMemberLocations IsAttribute (XamlType xt, XamlMember xm)
                {
+                       var mt = xm.Type;
+                       if (xm == XamlLanguage.Key) {
+                               var tmp = object_states.Pop ();
+                               mt = object_states.Peek ().Type.KeyType;
+                               object_states.Push (tmp);
+                       }
+
                        if (xm == XamlLanguage.Initialization)
                                return AllowedMemberLocations.MemberElement;
-                       if (xm.Type.HasPositionalParameters ())
+                       if (mt.HasPositionalParameters ())
                                return AllowedMemberLocations.Attribute;
                        if (w.WriteState == WriteState.Content)
                                return AllowedMemberLocations.MemberElement;
@@ -656,8 +664,6 @@ namespace System.Xaml
                        if (xd == null && !xt.GetAllMembers ().Contains (xm))
                                return AllowedMemberLocations.None;
 
-                       // FIXME: this is likely unnecessarily complicated.
-                       var mt = (xt != null && xd == XamlLanguage.Key ? xt.KeyType : xm.Type) ?? xm.Type;
                        if (mt != null && mt.TypeConverter != null && mt.TypeConverter.ConverterInstance != null && mt.TypeConverter.ConverterInstance.CanConvertTo (typeof (string)))
                                return AllowedMemberLocations.Attribute;
 
index 3baf0b2e0dcc37ca8ba4664ad36df056b01a6c32..a4cd8aa29ae93e7cf45abdddffca1017b4a2eeeb 100644 (file)
@@ -97,6 +97,15 @@ namespace MonoTests.System.Xaml.Schema
                        Assert.IsNull (c.ConverterInstance, "#1");
                }
 
+               [Test]
+               public void ObjectType ()
+               {
+                       // This test asserts that XamlLanguage.Object.TypeConverter.ConverterType is null for different reason.
+                       var c = new XamlValueConverter<TypeConverter> (typeof (TypeConverter), XamlLanguage.Object, null);
+                       Assert.IsNotNull (c.ConverterInstance, "#1");
+                       Assert.IsNull (XamlLanguage.Object.TypeConverter.ConverterInstance, "#2");
+               }
+
                [Test]
                public void Equality ()
                {
index de1f7a327e163f8a4807a8fd9e72b83d66d4d923..ea45f5f0d68fde3cb75d3a663bf5b70e92a0eea7 100644 (file)
@@ -201,12 +201,17 @@ namespace MonoTests.System.Xaml
                        //Assert.IsTrue (l.Any (t => t.Name == "Property"), "#8");
                        //Assert.IsFalse (l.Any (t => t.Name == "MemberDefinition"), "#9");
                        //Assert.IsFalse (l.Any (t => t.Name == "PropertyDefinition"), "#10");
+                       //Assert.AreEqual ("MemberDefinition", new XamlType (typeof (MemberDefinition), new XamlSchemaContext (null, null)).Name);
+                       //Assert.AreEqual ("Member", l.GetAllXamlTypes (XamlLanguage.Xaml2006Namespace).First (t => t.UnderlyingType == typeof (MemberDefinition)));
                        Assert.IsFalse (l.Any (t => t.Name == "Array"), "#11");
                        Assert.IsFalse (l.Any (t => t.Name == "Null"), "#12");
                        Assert.IsFalse (l.Any (t => t.Name == "Static"), "#13");
                        Assert.IsFalse (l.Any (t => t.Name == "Type"), "#14");
-                       //Assert.AreEqual ("MemberDefinition", new XamlType (typeof (MemberDefinition), new XamlSchemaContext (null, null)).Name);
-                       //Assert.AreEqual ("Member", l.GetAllXamlTypes (XamlLanguage.Xaml2006Namespace).First (t => t.UnderlyingType == typeof (MemberDefinition)));
+                       Assert.IsTrue (l.Contains (XamlLanguage.Type), "#15");
+                       Assert.IsFalse (l.Contains (XamlLanguage.String), "#16"); // huh?
+                       Assert.IsFalse (l.Contains (XamlLanguage.Object), "#17"); // huh?
+                       Assert.IsTrue (l.Contains (XamlLanguage.Array), "#18");
+                       Assert.IsFalse (l.Contains (XamlLanguage.Uri), "#19");
                }
 
                [Test]
index ee200e6b9541150c05bacdf4c77434ab211e37b3..29875053dffacf8000cbd2696fc77db761b5edfe 100755 (executable)
@@ -754,7 +754,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void Write_DictionaryStringType ()
                {
                        var dic = new Dictionary<string,Type> ();