diff options
Diffstat (limited to 'Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs index 235115d6..c93c14f2 100644 --- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs @@ -37,9 +37,8 @@ namespace Xamarin.Forms.Build.Tasks public ILContext Context { get; } public bool StopOnResourceDictionary { get; } - public TreeVisitingMode VisitingMode => TreeVisitingMode.BottomUp; - public bool StopOnDataTemplate => true; - public bool VisitNodeOnDataTemplate => true; + public bool VisitChildrenFirst { get; } = true; + public bool StopOnDataTemplate { get; } = true; ModuleDefinition Module { get; } @@ -89,11 +88,6 @@ namespace Xamarin.Forms.Build.Tasks if ((propertyName != XmlName.Empty || TryGetPropertyName(node, parentNode, out propertyName)) && skips.Contains(propertyName)) return; - if (propertyName == XmlName._CreateContent) { - SetDataTemplate((IElementNode)parentNode, node, Context, node); - return; - } - //if this node is an IMarkupExtension, invoke ProvideValue() and replace the variable var vardef = Context.Variables[node]; var vardefref = new VariableDefinitionReference(vardef); @@ -120,15 +114,18 @@ namespace Xamarin.Forms.Build.Tasks return; if (parentNode is IElementNode && ((IElementNode)parentNode).SkipProperties.Contains (propertyName)) return; - - Context.IL.Append(SetPropertyValue(Context.Variables[(IElementNode)parentNode], propertyName, node, Context, node)); + + if (propertyName == XmlName._CreateContent) + SetDataTemplate((IElementNode)parentNode, node, Context, node); + else + Context.IL.Append(SetPropertyValue(Context.Variables[(IElementNode)parentNode], propertyName, node, Context, node)); } else if (IsCollectionItem(node, parentNode) && parentNode is IElementNode) { // Collection element, implicit content, or implicit collection element. string contentProperty; var parentVar = Context.Variables[(IElementNode)parentNode]; - if (parentVar.VariableType.ImplementsInterface(Module.ImportReference(typeof (IEnumerable))) && parentVar.VariableType.GetMethods(md => md.Name == "Add" && md.Parameters.Count == 1, Module).Any()) + if (parentVar.VariableType.ImplementsInterface(Module.ImportReference(typeof (IEnumerable)))) { var elementType = parentVar.VariableType; if (elementType.FullName != "Xamarin.Forms.ResourceDictionary" && elementType.Resolve().BaseType.FullName != "Xamarin.Forms.ResourceDictionary") @@ -152,8 +149,7 @@ namespace Xamarin.Forms.Build.Tasks if (parentNode is IElementNode && ((IElementNode)parentNode).SkipProperties.Contains (propertyName)) return; Context.IL.Append(SetPropertyValue(Context.Variables[(IElementNode)parentNode], name, node, Context, node)); - } else - throw new XamlParseException($"Can not set the content of {((IElementNode)parentNode).XmlType.Name} as it doesn't have a ContentPropertyAttribute", node); + } } else if (IsCollectionItem(node, parentNode) && parentNode is ListNode) { @@ -725,7 +721,7 @@ namespace Xamarin.Forms.Build.Tasks if (CanAdd(parent, localName, valueNode, context)) return Add(parent, localName, valueNode, iXmlLineInfo, context); - throw new XamlParseException($"No property, bindable property, or event found for '{localName}', or mismatching type between value and property.", iXmlLineInfo); + throw new XamlParseException($"No property, bindable property, or event found for '{localName}'", iXmlLineInfo); } static FieldReference GetBindablePropertyReference(VariableDefinition parent, string namespaceURI, ref string localName, out bool attached, ILContext context, IXmlLineInfo iXmlLineInfo) @@ -846,7 +842,6 @@ namespace Xamarin.Forms.Build.Tasks { var module = context.Body.Method.Module; var varValue = context.Variables [elementNode]; - var implicitOperator = varValue.VariableType.GetImplicitOperatorTo(module.Import(typeof(BindingBase)), module); //TODO: check if parent is a BP var setBinding = typeof(BindableObject).GetMethod("SetBinding", new [] { typeof(BindableProperty), typeof(BindingBase) }); |