diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-04-17 23:59:44 +0200 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-04-17 14:59:44 -0700 |
commit | cdd6d4defc844b605890e7ad731e27e373b09bf4 (patch) | |
tree | ddf897b6bf475273a247891898a6c7daf7fb2079 /Xamarin.Forms.Build.Tasks | |
parent | 0b10ab0c130c814b4ab1595c8d13c4c6c9c9d5df (diff) | |
download | xamarin-forms-cdd6d4defc844b605890e7ad731e27e373b09bf4.tar.gz xamarin-forms-cdd6d4defc844b605890e7ad731e27e373b09bf4.tar.bz2 xamarin-forms-cdd6d4defc844b605890e7ad731e27e373b09bf4.zip |
Merged ResourceDictionary (#97)
* [X] Support Merged RD
* [X] Support RD as xaml roots
* [XamlC] I have no idea how that used to work before
* [C] Remove debugging statements
* fix docs
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 6 | ||||
-rw-r--r-- | Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs | 37 |
2 files changed, 37 insertions, 6 deletions
diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs index 5470a3c8..692ef8b5 100644 --- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs @@ -118,7 +118,7 @@ namespace Xamarin.Forms.Build.Tasks if (parentVar.VariableType.ImplementsInterface(Module.Import(typeof (IEnumerable)))) { var elementType = parentVar.VariableType; - if (elementType.FullName != "Xamarin.Forms.ResourceDictionary") + if (elementType.FullName != "Xamarin.Forms.ResourceDictionary" && elementType.Resolve().BaseType.FullName != "Xamarin.Forms.ResourceDictionary") { var adderTuple = elementType.GetMethods(md => md.Name == "Add" && md.Parameters.Count == 1, Module).First(); var adderRef = Module.Import(adderTuple.Item1); @@ -213,7 +213,7 @@ namespace Xamarin.Forms.Build.Tasks return parentList.CollectionItems.Contains(node); } - static string GetContentProperty(TypeReference typeRef) + internal static string GetContentProperty(TypeReference typeRef) { var typeDef = typeRef.Resolve(); var attributes = typeDef.CustomAttributes; @@ -461,7 +461,7 @@ namespace Xamarin.Forms.Build.Tasks context.IL.Emit(OpCodes.Ldloc, parent); context.IL.Append(vnode.PushConvertedValue(context, propertyType, - new ICustomAttributeProvider[] { propertyType.Resolve() }, + new ICustomAttributeProvider[] { property, propertyType.Resolve() }, valueNode.PushServiceProvider(context), false, true)); context.IL.Emit(OpCodes.Callvirt, propertySetterRef); diff --git a/Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs index c054117c..d09c4b00 100644 --- a/Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Linq; using Mono.Cecil; using Mono.Cecil.Cil; @@ -36,6 +37,33 @@ namespace Xamarin.Forms.Build.Tasks public void Visit(ValueNode node, INode parentNode) { + XmlName propertyName; + if (!SetPropertiesVisitor.TryGetPropertyName(node, parentNode, out propertyName)) + { + if (!IsCollectionItem(node, parentNode)) + return; + string contentProperty; + if (!Context.Variables.ContainsKey((IElementNode)parentNode)) + return; + var parentVar = Context.Variables[(IElementNode)parentNode]; + if ((contentProperty = SetPropertiesVisitor.GetContentProperty(parentVar.VariableType)) != null) + propertyName = new XmlName(((IElementNode)parentNode).NamespaceURI, contentProperty); + else + return; + } + + if (node.SkipPrefix((node.NamespaceResolver ?? parentNode.NamespaceResolver)?.LookupPrefix(propertyName.NamespaceURI))) + return; + if (propertyName.NamespaceURI == "http://schemas.openxmlformats.org/markup-compatibility/2006" && + propertyName.LocalName == "Ignorable") + { + (parentNode.IgnorablePrefixes ?? (parentNode.IgnorablePrefixes = new List<string>())).AddRange( + (node.Value as string).Split(',')); + return; + } + if (propertyName.LocalName != "MergedWith") + return; + SetPropertiesVisitor.SetPropertyValue(Context.Variables[(IElementNode)parentNode], propertyName, node, Context, node); } public void Visit(MarkupNode node, INode parentNode) @@ -52,7 +80,8 @@ namespace Xamarin.Forms.Build.Tasks var parentVar = Context.Variables[(IElementNode)parentNode]; if (parentVar.VariableType.ImplementsInterface(Module.Import(typeof (IEnumerable)))) { - if (parentVar.VariableType.FullName == "Xamarin.Forms.ResourceDictionary" && + if ((parentVar.VariableType.FullName == "Xamarin.Forms.ResourceDictionary" || + parentVar.VariableType.Resolve().BaseType.FullName == "Xamarin.Forms.ResourceDictionary") && !node.Properties.ContainsKey(XmlName.xKey)) { node.Accept(new SetPropertiesVisitor(Context), parentNode); @@ -79,7 +108,8 @@ namespace Xamarin.Forms.Build.Tasks .Resolve() .Methods.Single(md => md.Name == "Add" && md.Parameters.Count == 1))); } - else if (parentVar.VariableType.FullName == "Xamarin.Forms.ResourceDictionary" && + else if ((parentVar.VariableType.FullName == "Xamarin.Forms.ResourceDictionary" || + parentVar.VariableType.Resolve().BaseType.FullName == "Xamarin.Forms.ResourceDictionary") && node.Properties.ContainsKey(XmlName.xKey)) { node.Accept(new SetPropertiesVisitor(Context), parentNode); @@ -118,7 +148,8 @@ namespace Xamarin.Forms.Build.Tasks XmlName propertyName; if (SetPropertiesVisitor.TryGetPropertyName(node, parentNode, out propertyName) && (propertyName.LocalName == "Resources" || propertyName.LocalName.EndsWith(".Resources", StringComparison.Ordinal)) && - Context.Variables[node].VariableType.FullName == "Xamarin.Forms.ResourceDictionary") + (Context.Variables[node].VariableType.FullName == "Xamarin.Forms.ResourceDictionary" || + Context.Variables[node].VariableType.Resolve().BaseType.FullName == "Xamarin.Forms.ResourceDictionary")) SetPropertiesVisitor.SetPropertyValue(Context.Variables[(IElementNode)parentNode], propertyName, node, Context, node); } |