summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2016-04-17 23:59:44 +0200
committerJason Smith <jason.smith@xamarin.com>2016-04-17 14:59:44 -0700
commitcdd6d4defc844b605890e7ad731e27e373b09bf4 (patch)
treeddf897b6bf475273a247891898a6c7daf7fb2079 /Xamarin.Forms.Build.Tasks
parent0b10ab0c130c814b4ab1595c8d13c4c6c9c9d5df (diff)
downloadxamarin-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.cs6
-rw-r--r--Xamarin.Forms.Build.Tasks/SetResourcesVisitor.cs37
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);
}