From 178841ff1c171ca978fd79d68240b678c99a5a50 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 16 Apr 2010 09:31:50 +0000 Subject: [PATCH] 2010-04-16 Atsushi Enomoto * XamlXmlReader.cs : Resolve generic type names. Process attribute members. * XamlLanguage.cs : add XamlTypeName-to-ClrType method. * XmlSchemaContext.cs : extracted special type name handling to above. * XamlXmlReaderTest.cs : add more detailed read tests, and more file-based tests (not working yet). * Dictionary_Int32_String.xml, Dictionary_String_Type.xml : add more test files (not working though). svn path=/trunk/mcs/; revision=155619 --- mcs/class/System.Xaml/System.Xaml/ChangeLog | 7 + .../System.Xaml/System.Xaml/XamlLanguage.cs | 63 +++++++- .../System.Xaml/XamlSchemaContext.cs | 22 +-- .../System.Xaml/System.Xaml/XamlXmlReader.cs | 128 ++++++++++++---- .../System.Xaml/Test/System.Xaml/ChangeLog | 5 + .../Test/System.Xaml/XamlXmlReaderTest.cs | 138 ++++++++++++++++++ mcs/class/System.Xaml/Test/XmlFiles/ChangeLog | 5 + .../Test/XmlFiles/Dictionary_Int32_String.xml | 5 + .../Test/XmlFiles/Dictionary_String_Type.xml | 8 + 9 files changed, 325 insertions(+), 56 deletions(-) create mode 100644 mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml create mode 100644 mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml diff --git a/mcs/class/System.Xaml/System.Xaml/ChangeLog b/mcs/class/System.Xaml/System.Xaml/ChangeLog index 822a01daef5..f40f80a5feb 100644 --- a/mcs/class/System.Xaml/System.Xaml/ChangeLog +++ b/mcs/class/System.Xaml/System.Xaml/ChangeLog @@ -1,3 +1,10 @@ +2010-04-16 Atsushi Enomoto + + * XamlXmlReader.cs : Resolve generic type names. Process attribute + members. + * XamlLanguage.cs : add XamlTypeName-to-ClrType method. + * XmlSchemaContext.cs : extracted special type name handling to above. + 2010-04-16 Atsushi Enomoto * XamlType.cs : sort of reverted AllowedContentTypes. diff --git a/mcs/class/System.Xaml/System.Xaml/XamlLanguage.cs b/mcs/class/System.Xaml/System.Xaml/XamlLanguage.cs index 266a85246e6..c91838186b8 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlLanguage.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlLanguage.cs @@ -24,6 +24,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; +using System.Linq; using System.Reflection; using System.Xaml.Schema; using System.Windows.Markup; @@ -215,24 +216,72 @@ namespace System.Xaml } } + internal static XamlType GetSpecialXaml2006Type (string name) + { + // FIXME: I'm not really sure if these *special* names + // should be resolved here and there. There just does + // not seem to be any other appropriate places. + switch (name) { + case "Array": + return XamlLanguage.Array; + case "Member": + return XamlLanguage.Member; + case "Null": + return XamlLanguage.Null; + case "Property": + return XamlLanguage.Property; + case "Static": + return XamlLanguage.Static; + case "Type": + return XamlLanguage.Type; + } + return null; + } + static readonly int clr_ns_len = "clr-namespace:".Length; static readonly int clr_ass_len = "assembly=".Length; - internal static Type ParseClrTypeName (string xmlNamespace, string xmlLocalName) + internal static Type ResolveXamlTypeName (string xmlNamespace, string xmlLocalName, IList typeArguments, IXamlNamespaceResolver nsResolver) { string ns = xmlNamespace; string name = xmlLocalName; - if (!ns.StartsWith ("clr-namespace:", StringComparison.Ordinal)) - return null; + if (ns == XamlLanguage.Xaml2006Namespace) { + var xt = GetSpecialXaml2006Type (name); + if (xt == null) + xt = AllTypes.FirstOrDefault (t => t.Name == xmlLocalName); + if (xt == null) + throw new FormatException (string.Format ("There is no type '{0}' in XAML namespace", name)); + return xt.UnderlyingType; + } + else if (!ns.StartsWith ("clr-namespace:", StringComparison.Ordinal)) + throw new FormatException (string.Format ("Unexpected XAML namespace '{0}'", ns)); + + Type [] genArgs = null; + if (typeArguments != null) { + var xtns = typeArguments; + genArgs = new Type [xtns.Count]; + for (int i = 0; i < genArgs.Length; i++) { + var xtn = xtns [i]; + genArgs [i] = ResolveXamlTypeName (xtn.Namespace, xtn.Name, xtn.TypeArguments, nsResolver); + } + } + // convert xml namespace to clr namespace and assembly string [] split = ns.Split (';'); if (split.Length != 2 || split [0].Length <= clr_ns_len || split [1].Length <= clr_ass_len) throw new XamlParseException (string.Format ("Cannot resolve runtime namespace from XML namespace '{0}'", ns)); - var tns = split [0].Substring (clr_ns_len); - var tan = split [1].Substring (clr_ass_len); - string aqn = (tns.Length > 0 ? tns + '.' + name : name) + (tan.Length > 0 ? ", " + tan : string.Empty); - return System.Type.GetType (aqn); + string tns = split [0].Substring (clr_ns_len); + string aname = split [1].Substring (clr_ass_len); + + string tfn = tns.Length > 0 ? tns + '.' + name : name; + if (genArgs != null) + tfn += "`" + genArgs.Length; + string taqn = tfn + (aname.Length > 0 ? ", " + aname : string.Empty); + var ret = System.Type.GetType (taqn); + if (ret == null) + throw new XamlParseException (string.Format ("Cannot resolve runtime type from XML namespace '{0}', local name '{1}' with {2} type arguments ({3})", ns, name, typeArguments.Count, taqn)); + return genArgs == null ? ret : ret.MakeGenericType (genArgs); } } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs b/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs index b07dd66a589..e5eaaf71287 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs @@ -189,25 +189,9 @@ namespace System.Xaml XamlType ret; if (xamlNamespace == XamlLanguage.Xaml2006Namespace) { - // FIXME: I'm not really sure if these *special* - // names should be resolved here. There just - // does not seem to be any other appropriate - // places. - switch (name) { - case "Array": - return XamlLanguage.Array; - case "Member": - return XamlLanguage.Member; - case "Null": - return XamlLanguage.Null; - case "Property": - return XamlLanguage.Property; - case "Static": - return XamlLanguage.Static; - case "Type": - return XamlLanguage.Type; - } - ret = XamlLanguage.AllTypes.FirstOrDefault (t => TypeMatches (t, xamlNamespace, name, typeArguments)); + ret = XamlLanguage.GetSpecialXaml2006Type (name); + if (ret == null) + ret = XamlLanguage.AllTypes.FirstOrDefault (t => TypeMatches (t, xamlNamespace, name, typeArguments)); if (ret != null) return ret; } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs b/mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs index dfde4d166f1..eab41741282 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs @@ -23,16 +23,19 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Xml; using System.Xaml.Schema; -using Pair = System.Collections.Generic.KeyValuePair; +using Pair = System.Collections.Generic.KeyValuePair; namespace System.Xaml { // FIXME: is GetObject supported by this reader? public class XamlXmlReader : XamlReader, IXamlLineInfo { + #region constructors + public XamlXmlReader (Stream stream) : this (stream, (XamlXmlReaderSettings) null) { @@ -129,7 +132,10 @@ namespace System.Xaml r = XmlReader.Create (xmlReader, xrs); line_info = r as IXmlLineInfo; + xaml_namespace_resolver = new NamespaceResolver (r as IXmlNamespaceResolver); } + + #endregion XmlReader r; IXmlLineInfo line_info; @@ -140,12 +146,12 @@ namespace System.Xaml object current; bool inside_object_not_member, is_empty_object, is_empty_member; - List type_args = new List (); Stack types = new Stack (); XamlMember current_member; - List current_element_directives = new List (); - IEnumerator current_directive_enumerator; + List stored_members = new List (); + IEnumerator stored_member_enumerator; + IXamlNamespaceResolver xaml_namespace_resolver; public bool HasLineInfo { get { return line_info != null && line_info.HasLineInfo (); } @@ -193,6 +199,10 @@ namespace System.Xaml if (is_eof) return false; + // check this before is_empty_* so that they aren't ignored. + if (MoveToNextAttributeMember ()) + return true; + if (is_empty_object) { is_empty_object = false; ReadEndType (); @@ -212,9 +222,6 @@ namespace System.Xaml return true; } - if (CheckCurrentDirective ()) - return true; - if (!r.EOF) r.MoveToContent (); if (r.EOF) { @@ -270,8 +277,8 @@ namespace System.Xaml { string name = r.LocalName; string ns = r.NamespaceURI; - type_args.Clear (); - CollectDirectiveAttributes (); + string typeArgNames = null; + var atts = ProcessAttributes (); if (!r.IsEmptyElement) { r.Read (); @@ -284,7 +291,8 @@ namespace System.Xaml break; default: // this value is for Initialization - current_element_directives.Add (new Pair (XamlLanguage.Initialization, r.Value)); + // FIXME: this could also be a WrappedContents + stored_members.Add (new Pair (XamlLanguage.Initialization, r.Value)); r.Read (); continue; } @@ -294,15 +302,21 @@ namespace System.Xaml else is_empty_object = true; - XamlType xt; - if (ns.StartsWith ("clr-namespace:", StringComparison.Ordinal)) { - Type rtype = XamlLanguage.ParseClrTypeName (ns, name); - if (rtype == null) - throw new XamlParseException (String.Format ("Cannot resolve runtime namespace from XML namespace '{0}' and local name '{1}'", ns, name)); - xt = sctx.GetXamlType (rtype); + // check TypeArguments to resolve Type, and remove them from the list. They don't appear as a node. + foreach (var p in stored_members) { + if (p.Key == XamlLanguage.TypeArguments) { + typeArgNames = p.Value; + stored_members.Remove (p); + break; + } } - else - xt = sctx.GetXamlType (new XamlTypeName (ns, name, type_args.ToArray ())); + + XamlType xt; + IList typeArgs = typeArgNames == null ? null : XamlTypeName.ParseList (typeArgNames, xaml_namespace_resolver); + Type rtype = XamlLanguage.ResolveXamlTypeName (ns, name, typeArgs, xaml_namespace_resolver); + if (rtype == null) + throw new XamlParseException (String.Format ("Cannot resolve runtime namespace from XML namespace '{0}', local name '{1}' and type argument '{2}'", ns, name, typeArgNames)); + xt = sctx.GetXamlType (rtype); if (xt == null) // FIXME: .NET just treats the node as empty! // we have to sort out what to do here. @@ -310,11 +324,18 @@ namespace System.Xaml types.Push (xt); current = xt; + foreach (var p in atts) { + var xm = xt.GetMember (p.Key); + if (xm != null) + stored_members.Add (new Pair (xm, p.Value)); + // ignore unknown attribute + } + node_type = XamlNodeType.StartObject; inside_object_not_member = true; // The next Read() results are likely directives. - current_directive_enumerator = current_element_directives.GetEnumerator (); + stored_member_enumerator = stored_members.GetEnumerator (); } void ReadStartMember () @@ -357,30 +378,56 @@ namespace System.Xaml node_type = XamlNodeType.Value; } - void CollectDirectiveAttributes () + // returns remaining attributes to be processed + Dictionary ProcessAttributes () { - var l = current_element_directives; - if (types.Count == 0 && r.BaseURI != null) // top - l.Add (new Pair (XamlLanguage.Base, r.BaseURI)); + var l = stored_members; + + // base + string xmlbase = r.GetAttribute ("base", XamlLanguage.Xml1998Namespace) ?? r.BaseURI; + if (types.Count == 0 && xmlbase != null) // top + l.Add (new Pair (XamlLanguage.Base, xmlbase)); + + var atts = new Dictionary (); + + if (r.MoveToFirstAttribute ()) { + do { + if (r.NamespaceURI == XamlLanguage.Xmlns2000Namespace) + continue; + XamlDirective d = XamlLanguage.AllDirectives.FirstOrDefault (dd => (dd.AllowedLocation & AllowedMemberLocations.Attribute) != 0 && dd.Name == r.LocalName); + if (d != null) { + l.Add (new Pair (d, r.Value)); + continue; + } + if (r.NamespaceURI == String.Empty) { + atts.Add (r.LocalName, r.Value); + continue; + } + // Should we just ignore unknown attribute in XAML namespace or any other namespaces ? + // Probably yes for compatibility with future version. + } while (r.MoveToNextAttribute ()); + r.MoveToElement (); + } + return atts; } - bool CheckCurrentDirective () + bool MoveToNextAttributeMember () { - if (current_directive_enumerator != null) { + if (stored_member_enumerator != null) { // FIXME: value might have to be deserialized. switch (node_type) { case XamlNodeType.StartObject: case XamlNodeType.EndMember: // -> StartMember - if (current_directive_enumerator.MoveNext ()) { - current = current_member = current_directive_enumerator.Current.Key; + if (stored_member_enumerator.MoveNext ()) { + current = current_member = stored_member_enumerator.Current.Key; node_type = XamlNodeType.StartMember; return true; } break; case XamlNodeType.StartMember: // -> Value - current = current_directive_enumerator.Current.Value; + current = stored_member_enumerator.Current.Value; node_type = XamlNodeType.Value; return true; case XamlNodeType.Value: @@ -391,8 +438,8 @@ namespace System.Xaml } } - current_element_directives.Clear (); - current_directive_enumerator = null; + stored_members.Clear (); + stored_member_enumerator = null; return false; } @@ -400,5 +447,26 @@ namespace System.Xaml { return HasLineInfo ? String.Format (" Line {0}, at {1}", LineNumber, LinePosition) : String.Empty; } + + class NamespaceResolver : IXamlNamespaceResolver + { + IXmlNamespaceResolver source; + + public NamespaceResolver (IXmlNamespaceResolver source) + { + this.source = source; + } + + public string GetNamespace (string prefix) + { + return source.LookupNamespace (prefix); + } + + public IEnumerable GetNamespacePrefixes () + { + foreach (var p in source.GetNamespacesInScope (XmlNamespaceScope.All)) + yield return new NamespaceDeclaration (p.Value, p.Key); + } + } } } diff --git a/mcs/class/System.Xaml/Test/System.Xaml/ChangeLog b/mcs/class/System.Xaml/Test/System.Xaml/ChangeLog index 58a3eebcea8..da52b564028 100644 --- a/mcs/class/System.Xaml/Test/System.Xaml/ChangeLog +++ b/mcs/class/System.Xaml/Test/System.Xaml/ChangeLog @@ -1,3 +1,8 @@ +2010-04-16 Atsushi Enomoto + + * XamlXmlReaderTest.cs : add more detailed read tests, and more + file-based tests (not working yet). + 2010-04-15 Atsushi Enomoto * XamlTypeTest.cs, XamlLanguageTest.cs : enable AllowedContentTypes diff --git a/mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs b/mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs index 6a47ea7741a..a51c7e3a402 100644 --- a/mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs +++ b/mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs @@ -105,6 +105,22 @@ namespace MonoTests.System.Xaml LoadTest ("List_Int32.xml", typeof (List)); } + [Test] + [Category ("NotWorking")] + public void Read_DictionaryInt32String () + { + ReadTest ("Dictionary_Int32_String.xml"); + LoadTest ("Dictionary_Int32_String.xml", typeof (Dictionary)); + } + + [Test] + [Category ("NotWorking")] + public void Read_DictionaryStringType () + { + ReadTest ("Dictionary_String_Type.xml"); + LoadTest ("Dictionary_String_Type.xml", typeof (Dictionary)); + } + [Test] public void Read1 () { @@ -184,5 +200,127 @@ namespace MonoTests.System.Xaml Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2"); Assert.IsFalse (r.Read (), "end"); } + + [Test] + public void Read3 () + { + var r = GetReader ("Type.xml"); + + Assert.IsTrue (r.Read (), "ns#1"); + Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2"); + Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3"); + + Assert.IsTrue (r.Read (), "so#1"); + Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2"); + Assert.AreEqual (XamlLanguage.Type, r.Type, "so#3"); + + Assert.IsTrue (r.Read (), "sbase#1"); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2"); + Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3"); + + Assert.IsTrue (r.Read (), "vbase#1"); + Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2"); + Assert.IsTrue (r.Value is string, "vbase#3"); + + Assert.IsTrue (r.Read (), "ebase#1"); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2"); + + Assert.IsTrue (r.Read (), "sinit#1"); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2"); + // FIXME: fix XamlMember.Equals() + //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3"); + Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3"); + + Assert.IsTrue (r.Read (), "vinit#1"); + Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2"); + Assert.AreEqual ("x:Int32", r.Value, "vinit#3"); // string + + Assert.IsTrue (r.Read (), "einit#1"); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2"); + + Assert.IsTrue (r.Read (), "eo#1"); + Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2"); + + Assert.IsFalse (r.Read (), "end"); + } + + [Test] + [Category ("NotWorking")] + public void Read4 () + { + var r = GetReader ("List_Int32.xml"); + + Assert.IsTrue (r.Read (), "ns#1"); + Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2"); + Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3"); + Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4"); + + Assert.IsTrue (r.Read (), "ns2#1"); + Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2"); + Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3"); + Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4"); + + Assert.IsTrue (r.Read (), "so#1"); + Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2"); + var xt = new XamlType (typeof (List), r.SchemaContext); + Assert.AreEqual (xt, r.Type, "so#3"); + + Assert.IsTrue (r.Read (), "sbase#1"); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2"); + Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3"); + + Assert.IsTrue (r.Read (), "vbase#1"); + Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2"); + Assert.IsTrue (r.Value is string, "vbase#3"); + + Assert.IsTrue (r.Read (), "ebase#1"); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2"); + + Assert.IsTrue (r.Read (), "scap#1"); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2"); + Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3"); + + Assert.IsTrue (r.Read (), "vcap#1"); + Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2"); + Assert.AreEqual ("5", r.Value, "vcap#3"); // string + + Assert.IsTrue (r.Read (), "ecap#1"); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2"); + + Assert.IsTrue (r.Read (), "sItems#1"); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2"); + Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3"); + + int [] values = {4, -5, 0, 255, int.MaxValue}; + var ci = new CultureInfo ("en-US"); + + for (int i = 0; i < 5; i++) { + Assert.IsTrue (r.Read (), "soItem#1." + i); + Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i); + Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i); + + Assert.IsTrue (r.Read (), "sItem#1." + i); + Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i); + Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i); + + Assert.IsTrue (r.Read (), "vItem#1." + i); + Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i); + Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i); + + Assert.IsTrue (r.Read (), "eItem#1." + i); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i); + + Assert.IsTrue (r.Read (), "eoItem#1"); + Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2"); + } + + Assert.IsTrue (r.Read (), "eItems#1"); + Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2"); + + Assert.IsTrue (r.Read (), "eo#1"); + Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2"); + + Assert.IsFalse (r.Read (), "end"); + } } } diff --git a/mcs/class/System.Xaml/Test/XmlFiles/ChangeLog b/mcs/class/System.Xaml/Test/XmlFiles/ChangeLog index 7c0de9f5f18..a4a430c80c4 100644 --- a/mcs/class/System.Xaml/Test/XmlFiles/ChangeLog +++ b/mcs/class/System.Xaml/Test/XmlFiles/ChangeLog @@ -1,3 +1,8 @@ +2010-04-16 Atsushi Enomoto + + * Dictionary_Int32_String.xml, Dictionary_String_Type.xml : + add more test files (not working though). + 2010-04-15 Atsushi Enomoto * DateTime.xml : new test file. (not working though) diff --git a/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml new file mode 100644 index 00000000000..04d5a56e10f --- /dev/null +++ b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml @@ -0,0 +1,5 @@ + + foo + bar + baz + \ No newline at end of file diff --git a/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml new file mode 100644 index 00000000000..90520b2446e --- /dev/null +++ b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file -- 2.25.1