#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;
}
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;
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 ();
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);
}
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;
}
if (args != null && args.Any ())
yield return XamlLanguage.Arguments;
- if (type.IsContentValue ()) {
+ if (type.IsContentValue (vsctx)) {
yield return XamlLanguage.Initialization;
yield break;
}
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)
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)
Stack<XamlMember> members = new Stack<XamlMember> ();
List<NamespaceDeclaration> namespaces;
- IServiceProvider service_provider;
+ IValueSerializerContext service_provider;
Stack<ObjectState> object_states = new Stack<ObjectState> ();
class ObjectState
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.
XamlSchemaContext sctx;
XamlWriterStateManager manager;
- IValueSerializerContext service_provider;
+ internal IValueSerializerContext service_provider;
internal Stack<ObjectState> object_states = new Stack<ObjectState> ();
internal PrefixLookup prefix_lookup {
// 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;
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;
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;
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.