Make string convertibility check more strictly.
authorAtsushi Eno <atsushi@ximian.com>
Mon, 15 Nov 2010 12:35:46 +0000 (21:35 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Mon, 15 Nov 2010 12:35:46 +0000 (21:35 +0900)
mcs/class/System.Xaml/System.Xaml/TypeExtensionMethods.cs
mcs/class/System.Xaml/System.Xaml/XamlNode.cs
mcs/class/System.Xaml/System.Xaml/XamlObjectNodeIterator.cs
mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs
mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs
mcs/class/System.Xaml/Test/System.Windows.Markup/ValueSerializerTest.cs

index 44b60797c8d2a016ce41f973af140b8e6209ea6c..26eb2f03ccbbd80e5653b7aa8709e72d28ef8e9a 100644 (file)
@@ -103,23 +103,21 @@ namespace System.Xaml
 
                #endregion
 
-               // FIXME: receive IValueSerializerContext too.
-               public static bool IsContentValue (this XamlMember member)
+               public static bool IsContentValue (this XamlMember member, IValueSerializerContext vsctx)
                {
                        if (member == XamlLanguage.Initialization)
                                return true;
                        if (member == XamlLanguage.PositionalParameters)
                                return true;
-                       if (member.TypeConverter != null && member.TypeConverter.ConverterInstance != null && member.TypeConverter.ConverterInstance.CanConvertTo (/*vsctx,*/ typeof (string)))
+                       if (member.TypeConverter != null && member.TypeConverter.ConverterInstance != null && member.TypeConverter.ConverterInstance.CanConvertTo (vsctx, typeof (string)))
                                return true;
-                       return IsContentValue (member.Type/*,vsctx*/);
+                       return IsContentValue (member.Type,vsctx);
                }
 
-               // FIXME: receive IValueSerializerContext too.
-               public static bool IsContentValue (this XamlType type)
+               public static bool IsContentValue (this XamlType type, IValueSerializerContext vsctx)
                {
                        var t = type.UnderlyingType;
-                       if (type.TypeConverter != null && type.TypeConverter.ConverterInstance != null && type.TypeConverter.ConverterInstance.CanConvertTo (/*vsctx,*/ typeof (string)))
+                       if (type.TypeConverter != null && type.TypeConverter.ConverterInstance != null && type.TypeConverter.ConverterInstance.CanConvertTo (vsctx, typeof (string)))
                                return true;
                        return false;
                }
@@ -138,15 +136,15 @@ namespace System.Xaml
                        return true;
                }
 
-               public static bool HasPositionalParameters (this XamlType type)
+               public static bool HasPositionalParameters (this XamlType type, IValueSerializerContext vsctx)
                {
                        // FIXME: find out why only TypeExtension and StaticExtension yield this directive. Seealso XamlObjectReaderTest.Read_CustomMarkupExtension*()
                        return  type == XamlLanguage.Type ||
                                type == XamlLanguage.Static ||
-                               ExaminePositionalParametersApplicable (type) && type.ConstructionRequiresArguments;
+                               ExaminePositionalParametersApplicable (type, vsctx) && type.ConstructionRequiresArguments;
                }
                
-               static bool ExaminePositionalParametersApplicable (this XamlType type)
+               static bool ExaminePositionalParametersApplicable (this XamlType type, IValueSerializerContext vsctx)
                {
                        if (!type.IsMarkupExtension || type.UnderlyingType == null)
                                return false;
@@ -156,7 +154,7 @@ namespace System.Xaml
                                return false;
 
                        foreach (var arg in args)
-                               if (arg.Type != null && !arg.Type.IsContentValue ())
+                               if (arg.Type != null && !arg.Type.IsContentValue (vsctx))
                                        return false;
 
                        Type [] argTypes = (from arg in args select arg.Type.UnderlyingType).ToArray ();
index 022d3b7b6996b032f7cd0ae6bd7183115e10a37c..a3a52dc0d59389f4f37a2ccaff23d86134fd0c3f 100644 (file)
@@ -102,9 +102,9 @@ namespace System.Xaml
                        return type.SchemaContext.GetXamlType (new InstanceContext (obj).GetWrappedValue ().GetType ());
                }
                
-               public IEnumerable<XamlNodeMember> Children ()
+               public IEnumerable<XamlNodeMember> Children (IValueSerializerContext vsctx)
                {
-                       foreach (var xm in type.GetAllObjectReaderMembersByType ())
+                       foreach (var xm in type.GetAllObjectReaderMembersByType (vsctx))
                                yield return new XamlNodeMember (this, xm);
                }
                
@@ -184,9 +184,9 @@ namespace System.Xaml
        internal static class TypeExtensionMethods2
        {
                // Note that this returns XamlMember which might not actually appear in XamlObjectReader. For example, XamlLanguage.Items won't be returned when there is no item in the collection.
-               public static IEnumerable<XamlMember> GetAllObjectReaderMembersByType (this XamlType type)
+               public static IEnumerable<XamlMember> GetAllObjectReaderMembersByType (this XamlType type, IValueSerializerContext vsctx)
                {
-                       if (type.HasPositionalParameters ()) {
+                       if (type.HasPositionalParameters (vsctx)) {
                                yield return XamlLanguage.PositionalParameters;
                                yield break;
                        }
@@ -196,7 +196,7 @@ namespace System.Xaml
                        if (args != null && args.Any ())
                                yield return XamlLanguage.Arguments;
 
-                       if (type.IsContentValue ()) {
+                       if (type.IsContentValue (vsctx)) {
                                yield return XamlLanguage.Initialization;
                                yield break;
                        }
index 6eb0575d6c7b1cea6b0e7a3d067490c27a2a1b3b..c18370c54374340c479c49310003f543e5803d5d 100644 (file)
@@ -112,7 +112,7 @@ namespace System.Xaml
                        if (xm != null) {
                                // overrideMemberType is (so far) used for XamlLanguage.Key.
                                var xtt = overrideMemberType ?? xm.Type;
-                               if (xtt.IsContentValue () || xm.IsContentValue ()) {
+                               if (xtt.IsContentValue (value_serializer_ctx) || xm.IsContentValue (value_serializer_ctx)) {
                                        // though null value is special: it is written as a standalone object.
                                        var val = xobj.GetRawValue ();
                                        if (val == null)
@@ -149,7 +149,7 @@ namespace System.Xaml
 
                IEnumerable<XamlNodeInfo> GetObjectMemberNodes (XamlObject xobj)
                {
-                       var xce = xobj.Children ().GetEnumerator ();
+                       var xce = xobj.Children (value_serializer_ctx).GetEnumerator ();
                        while (xce.MoveNext ()) {
                                // XamlLanguage.Items does not show up if the content is empty.
                                if (xce.Current.Member == XamlLanguage.Items)
index d0574b1a715de46bf11367b23c6dd2691fd60d07..eb3f3ad1d5a1eee72e845c84049f91dbaa340104 100644 (file)
@@ -57,7 +57,7 @@ namespace System.Xaml
                Stack<XamlMember> members = new Stack<XamlMember> ();
 
                List<NamespaceDeclaration> namespaces;
-               IServiceProvider service_provider;
+               IValueSerializerContext service_provider;
                Stack<ObjectState> object_states = new Stack<ObjectState> ();
 
                class ObjectState
@@ -338,7 +338,7 @@ namespace System.Xaml
                        var cstate = new ObjectState () {Type = xamlType, IsInstantiated = false};
                        object_states.Push (cstate);
 
-                       if (!xamlType.IsContentValue ()) // FIXME: there could be more conditions e.g. the type requires Arguments.
+                       if (!xamlType.IsContentValue (service_provider)) // FIXME: there could be more conditions e.g. the type requires Arguments.
                                InitializeObjectIfRequired (true);
                        
                        if (wpl != null) // note that this adds to the *owner* object's properties.
index f9b00c2887bbbf548ae40d3c2850c9cc2e186225..4a4849d4be5d2e7aefb868793e8b6080aa0bc65a 100755 (executable)
@@ -180,7 +180,7 @@ namespace System.Xaml
                XamlSchemaContext sctx;
                XamlWriterStateManager manager;
 
-               IValueSerializerContext service_provider;
+               internal IValueSerializerContext service_provider;
 
                internal Stack<ObjectState> object_states = new Stack<ObjectState> ();
                internal PrefixLookup prefix_lookup {
@@ -604,7 +604,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 = member == XamlLanguage.PositionalParameters && IsAtTopLevelObject () && object_states.Peek ().Type.HasPositionalParameters () ? state.Type.GetSortedConstructorArguments ().GetEnumerator () : null;
+                       var posprms = member == XamlLanguage.PositionalParameters && IsAtTopLevelObject () && object_states.Peek ().Type.HasPositionalParameters (service_provider) ? state.Type.GetSortedConstructorArguments ().GetEnumerator () : null;
                        if (posprms != null) {
                                posprms.MoveNext ();
                                var arg = posprms.Current;
@@ -658,7 +658,7 @@ namespace System.Xaml
 
                        if (xm == XamlLanguage.Initialization)
                                return AllowedMemberLocations.MemberElement;
-                       if (mt.HasPositionalParameters ())
+                       if (mt.HasPositionalParameters (service_provider))
                                return AllowedMemberLocations.Attribute;
                        if (w.WriteState == WriteState.Content)
                                return AllowedMemberLocations.MemberElement;
@@ -677,7 +677,7 @@ namespace System.Xaml
                        if (xd == null && !xt.GetAllMembers ().Contains (xm))
                                return AllowedMemberLocations.None;
 
-                       if (xm.IsContentValue () || xt.IsContentValue ())
+                       if (xm.IsContentValue (service_provider) || xt.IsContentValue (service_provider))
                                return AllowedMemberLocations.Attribute;
 
                        return AllowedMemberLocations.MemberElement;
index a88cbd92931bb1bf322abe375e5f2424c2766c3e..551934759802da342d9c48ab378ae16e1de73ee4 100644 (file)
@@ -77,6 +77,8 @@ namespace MonoTests.System.Windows.Markup
                                        Assert.IsNull (v, "NoSerializer_" + t.Name);
                                        continue;
                                }
+                               else if (v == null)
+                                       Assert.Fail ("Missing serializer for " + t.Name);
 
                                // String ValueSerializer is the only exceptional one that mostly fails ConvertToString().
                                // For remaining types, ConvertToString() should succeed.