Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs4
-rw-r--r--mcs/class/System.Xaml/System.Xaml/XamlObjectWriter.cs21
-rwxr-xr-xmcs/class/System.Xaml/System.Xaml/XamlXmlWriter.cs5
-rwxr-xr-xmcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs8
4 files changed, 27 insertions, 11 deletions
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<object> Contents = new List<object> ();
public List<XamlMember> WrittenProperties = new List<XamlMember> ();
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);