From 2e100c5e48b28bb08bd1f59581b87d62b776eab4 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 17 Nov 2010 15:50:18 +0900 Subject: Made a couple of PositionalParameter related fixes, disabling test, etc. --- .../System.Windows.Markup/ValueSerializer.cs | 4 ++-- .../System.Xaml/System.Xaml/XamlObjectWriter.cs | 21 +++++++++++++++++---- mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs | 5 ----- .../Test/System.Xaml/XamlObjectWriterTest.cs | 8 ++++++++ 4 files changed, 27 insertions(+), 11 deletions(-) (limited to 'mcs/class/System.Xaml') diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs index d3a001de3d2..b625bb98444 100644 --- a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs @@ -56,8 +56,8 @@ namespace System.Windows.Markup if (context != null) throw new NotImplementedException (); - // MarkupExtension is serialized without ValueSerializer. - if (typeof (MarkupExtension).IsAssignableFrom (type)) + // Standard MarkupExtensions are serialized without ValueSerializer. + if (typeof (MarkupExtension).IsAssignableFrom (type) && XamlLanguage.AllTypes.Any (x => x.UnderlyingType == type)) return null; var tc = TypeDescriptor.GetConverter (type); diff --git a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs index cdd6b45fadc..78703620aa9 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs @@ -64,6 +64,7 @@ namespace System.Xaml { public XamlType Type; public object Value; + public object KeyValue; public List Contents = new List (); public List WrittenProperties = new List (); public bool IsInstantiated; @@ -100,9 +101,9 @@ namespace System.Xaml return; while (object_states.Count > 0) { - WriteEndObject (); - if (object_states.Count > 0) + if (object_states.Count == members.Count) WriteEndMember (); + WriteEndObject (); } } @@ -160,6 +161,11 @@ namespace System.Xaml var state = object_states.Peek (); var contents = state.Contents; + if (xm == XamlLanguage.PositionalParameters) { + manager.AcceptMultipleValues = false; + //state.PositionalParameterIndex = -1; + } + if (xm == XamlLanguage.FactoryMethod) { if (contents.Count != 1 || !(contents [0] is string)) throw new XamlObjectWriterException (String.Format ("FactoryMethod must be non-empty string name. {0} value exists.", contents.Count > 0 ? contents [0] : "0")); @@ -291,6 +297,8 @@ namespace System.Xaml throw new ArgumentNullException ("property"); manager.StartMember (); + if (property == XamlLanguage.PositionalParameters) + manager.AcceptMultipleValues = true; //var wpl = object_states.Peek ().WrittenProperties; // FIXME: enable this. Duplicate property check should @@ -361,8 +369,13 @@ namespace System.Xaml state.Value = value; state.IsInstantiated = true; } -// else if (xm.Type.IsCollection) - else if (xm == XamlLanguage.Items) // FIXME: am not sure which is good yet. + else if (xm.Type.IsDictionary) { + if (xm == XamlLanguage.Key) + state.KeyValue = GetCorrectlyTypedValue (xm.Type.KeyType, value); + else + state.Contents.Add (GetCorrectlyTypedValue (xm.Type.ItemType, value)); + } + else if (xm.Type.IsCollection) state.Contents.Add (GetCorrectlyTypedValue (xm.Type.ItemType, value)); else state.Contents.Add (GetCorrectlyTypedValue (xm.Type, value)); diff --git a/mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs b/mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs index c3fcbb18607..7bf57a759ee 100755 --- a/mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs @@ -345,16 +345,11 @@ namespace System.Xaml var state = object_states.Peek (); if (CurrentMember == XamlLanguage.PositionalParameters) { - // this is an exception that indicates the state manager to accept more than values within this member. manager.AcceptMultipleValues = false; state.PositionalParameterIndex = -1; } - var xm = CurrentMember; var contents = state.Contents; - if (xm == XamlLanguage.PositionalParameters) - state.PositionalParameterIndex = -1; - contents.Clear (); } diff --git a/mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs b/mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs index fea88f7ac1c..86293d3e5ba 100755 --- a/mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs +++ b/mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs @@ -352,8 +352,16 @@ namespace MonoTests.System.Xaml Assert.AreEqual ("bar", l [1], "#3"); } + // I believe .NET XamlObjectWriter.Dispose() is hack and should + // be fixed to exactly determine which of End (member or object) + // to call that results in this ExpectedException. + // Surprisingly, PositionalParameters is allowed to be closed + // without EndMember. So it smells that .NET is hacky. + // We should disable this test and introduce better code (which + // is already in XamlWriterInternalBase). [Test] [ExpectedException (typeof (XamlObjectWriterException))] + [Ignore ("See the comment in XamlObjectWriterTest.cs")] public void CloseWithoutEndMember () { var xw = new XamlObjectWriter (sctx, null); -- cgit v1.2.3