diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-12-04 22:08:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-04 22:08:11 +0100 |
commit | 39f2deb5e04886374e720013782c751a4bb7675d (patch) | |
tree | 64f2df7230760c26533730e73821a6dc5c7607da /Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs | |
parent | fb76107f4f3294a9d32c6983bc742ce8dff60cd8 (diff) | |
download | xamarin-forms-39f2deb5e04886374e720013782c751a4bb7675d.tar.gz xamarin-forms-39f2deb5e04886374e720013782c751a4bb7675d.tar.bz2 xamarin-forms-39f2deb5e04886374e720013782c751a4bb7675d.zip |
[Xaml] support arrays as x:Arguments (#545)
* [Xaml] port some FactoryMethod tests to XamlC
* [Xaml] support array parameters in factory ctors
* [XamlC] support arrays as x:Arguments
* fix build
Diffstat (limited to 'Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs b/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs index 4e1372c5..ac530216 100644 --- a/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs @@ -64,7 +64,7 @@ namespace Xamarin.Forms.Build.Tasks if (typeref.FullName == "Xamarin.Forms.Xaml.StaticExtension") { var markupProvider = new StaticExtension(); - var il = markupProvider.ProvideValue(node, Module, out typeref); + var il = markupProvider.ProvideValue(node, Module, Context, out typeref); var vardef = new VariableDefinition(typeref); Context.Variables [node] = vardef; @@ -180,7 +180,6 @@ namespace Xamarin.Forms.Build.Tasks Context.IL.Emit(OpCodes.Initobj, Module.Import(typedef)); } - //if/when we land the compiled converters, those 2 blocks could be greatly simplified if (typeref.FullName == "Xamarin.Forms.Xaml.TypeExtension") { var visitor = new SetPropertiesVisitor(Context); foreach (var cnode in node.Properties.Values.ToList()) @@ -212,6 +211,30 @@ namespace Xamarin.Forms.Build.Tasks Context.Body.Variables.Add(vardefref.VariableDefinition); } } + + if (typeref.FullName == "Xamarin.Forms.Xaml.ArrayExtension") + { + var visitor = new SetPropertiesVisitor(Context); + foreach (var cnode in node.Properties.Values.ToList()) + cnode.Accept(visitor, node); + foreach (var cnode in node.CollectionItems) + cnode.Accept(visitor, node); + + var markupProvider = new ArrayExtension(); + + var il = markupProvider.ProvideValue(node, Module, Context, out typeref); + + vardef = new VariableDefinition(typeref); + Context.Variables[node] = vardef; + Context.Body.Variables.Add(vardef); + + Context.IL.Append(il); + Context.IL.Emit(OpCodes.Stloc, vardef); + + //clean the node as it has been fully exhausted + node.Properties.Remove(new XmlName("","Type")); + node.CollectionItems.Clear(); + } } } @@ -316,8 +339,10 @@ namespace Xamarin.Forms.Build.Tasks static bool IsXaml2009LanguagePrimitive(IElementNode node) { - if (node.NamespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml") - return true; + if (node.NamespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml") { + var n = node.XmlType.Name.Split(':') [1]; + return n != "Array"; + } if (node.NamespaceURI != "clr-namespace:System;assembly=mscorlib") return false; var name = node.XmlType.Name.Split(':')[1]; |