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 ();
public void WriteEndMember ()
{
manager.EndMember ();
+
+ OnWriteEndMember ();
var state = object_states.Peek ();
if (CurrentMember == XamlLanguage.PositionalParameters) {
state.PositionalParameterIndex = -1;
contents.Clear ();
-
- OnWriteEndMember ();
}
protected abstract void OnWriteEndObject ();
// 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));
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);
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;
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;
//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]