summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2016-11-17 20:31:05 +0100
committerGitHub <noreply@github.com>2016-11-17 20:31:05 +0100
commit054ecf2704ac5d736ffb97c2932e1e078041008a (patch)
tree6e11e80a370b9ed96c473a03ecc4bbdfefa62cbe /Xamarin.Forms.Build.Tasks
parent122f0e3e6060711d6c3b2b8523236b8a057434df (diff)
downloadxamarin-forms-054ecf2704ac5d736ffb97c2932e1e078041008a.tar.gz
xamarin-forms-054ecf2704ac5d736ffb97c2932e1e078041008a.tar.bz2
xamarin-forms-054ecf2704ac5d736ffb97c2932e1e078041008a.zip
[Xaml] cleanup xmlns usage, add XmlnsDefinition (#531)
* [Xaml] cleanup xmlns usage, add XmlnsDefinition * docs
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r--Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs8
-rw-r--r--Xamarin.Forms.Build.Tasks/XamlGTask.cs8
-rw-r--r--Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs66
3 files changed, 52 insertions, 30 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs b/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs
index 6d6405e1..4e1372c5 100644
--- a/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs
+++ b/Xamarin.Forms.Build.Tasks/CreateObjectVisitor.cs
@@ -194,8 +194,12 @@ namespace Xamarin.Forms.Build.Tasks
ntype = node.CollectionItems [0];
var type = ((ValueNode)ntype).Value as string;
- var namespaceuri = type.Contains(":") ? node.NamespaceResolver.LookupNamespace(type.Split(':') [0].Trim()) : "";
- type = type.Contains(":") ? type.Split(':') [1].Trim() : type;
+ var prefix = "";
+ if (type.Contains(":")) {
+ prefix = type.Split(':') [0].Trim();
+ type = type.Split(':') [1].Trim();
+ }
+ var namespaceuri = node.NamespaceResolver.LookupNamespace(prefix);
Context.TypeExtensions [node] = new XmlType(namespaceuri, type, null).GetTypeReference(Module, node);
if (!node.SkipProperties.Contains(new XmlName("", "TypeName")))
diff --git a/Xamarin.Forms.Build.Tasks/XamlGTask.cs b/Xamarin.Forms.Build.Tasks/XamlGTask.cs
index ada6bb68..85a400a8 100644
--- a/Xamarin.Forms.Build.Tasks/XamlGTask.cs
+++ b/Xamarin.Forms.Build.Tasks/XamlGTask.cs
@@ -235,14 +235,14 @@ namespace Xamarin.Forms.Build.Tasks
{
foreach (var typeArg in typeArguments)
{
- var ns_uri = "";
+ var prefix = "";
var _type = typeArg;
if (typeArg.Contains(":"))
{
- var prefix = typeArg.Split(':')[0].Trim();
- ns_uri = getNamespaceOfPrefix(prefix);
+ prefix = typeArg.Split(':')[0].Trim();
_type = typeArg.Split(':')[1].Trim();
}
+ var ns_uri = getNamespaceOfPrefix(prefix);
returnType.TypeArguments.Add(GetType(ns_uri, _type, null, getNamespaceOfPrefix));
}
}
@@ -252,7 +252,7 @@ namespace Xamarin.Forms.Build.Tasks
static string GetNamespace(string namespaceuri)
{
- if (!XmlnsHelper.IsCustom(namespaceuri))
+ if (namespaceuri == "http://xamarin.com/schemas/2014/forms")
return "Xamarin.Forms";
if (namespaceuri == "http://schemas.microsoft.com/winfx/2009/xaml")
return "System";
diff --git a/Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs b/Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs
index db182847..185c2722 100644
--- a/Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs
+++ b/Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
@@ -15,29 +14,45 @@ namespace Xamarin.Forms.Build.Tasks
return new XmlType (namespaceURI, typename, null).GetTypeReference (module, xmlInfo);
}
+ static IList<XmlnsDefinitionAttribute> s_xmlnsDefinitions;
+
+ static void GatherXmlnsDefinitionAttributes()
+ {
+ //this could be extended to look for [XmlnsDefinition] in all assemblies
+ var assemblies = new [] {
+ typeof(View).Assembly,
+ typeof(XamlLoader).Assembly,
+ };
+
+ s_xmlnsDefinitions = new List<XmlnsDefinitionAttribute>();
+
+ foreach (var assembly in assemblies)
+ foreach (XmlnsDefinitionAttribute attribute in assembly.GetCustomAttributes(typeof(XmlnsDefinitionAttribute), false)) {
+ s_xmlnsDefinitions.Add(attribute);
+ attribute.AssemblyName = attribute.AssemblyName ?? assembly.FullName;
+ }
+ }
+
public static TypeReference GetTypeReference(this XmlType xmlType, ModuleDefinition module, IXmlLineInfo xmlInfo)
{
+ if (s_xmlnsDefinitions == null)
+ GatherXmlnsDefinitionAttributes();
+
var namespaceURI = xmlType.NamespaceUri;
var elementName = xmlType.Name;
var typeArguments = xmlType.TypeArguments;
- List<Tuple<string, string>> lookupAssemblies = new List<Tuple<string, string>>(); //assembly, namespace
- List<string> lookupNames = new List<string>();
+ var lookupAssemblies = new List<XmlnsDefinitionAttribute>();
- if (!XmlnsHelper.IsCustom(namespaceURI))
- {
- lookupAssemblies.Add(new Tuple<string, string>("Xamarin.Forms.Core", "Xamarin.Forms"));
- lookupAssemblies.Add(new Tuple<string, string>("Xamarin.Forms.Xaml", "Xamarin.Forms.Xaml"));
- }
- else if (namespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml" ||
- namespaceURI == "http://schemas.microsoft.com/winfx/2006/xaml")
- {
- lookupAssemblies.Add(new Tuple<string, string>("Xamarin.Forms.Xaml", "Xamarin.Forms.Xaml"));
- lookupAssemblies.Add(new Tuple<string, string>("mscorlib", "System"));
- lookupAssemblies.Add(new Tuple<string, string>("System", "System"));
+ var lookupNames = new List<string>();
+
+ foreach (var xmlnsDef in s_xmlnsDefinitions) {
+ if (xmlnsDef.XmlNamespace != namespaceURI)
+ continue;
+ lookupAssemblies.Add(xmlnsDef);
}
- else
- {
+
+ if (lookupAssemblies.Count == 0) {
string ns;
string typename;
string asmstring;
@@ -45,12 +60,14 @@ namespace Xamarin.Forms.Build.Tasks
XmlnsHelper.ParseXmlns(namespaceURI, out typename, out ns, out asmstring, out targetPlatform);
asmstring = asmstring ?? module.Assembly.Name.Name;
- lookupAssemblies.Add(new Tuple<string, string>(asmstring, ns));
+ lookupAssemblies.Add(new XmlnsDefinitionAttribute(namespaceURI, ns) {
+ AssemblyName = asmstring
+ });
}
lookupNames.Add(elementName);
- if (namespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml")
- lookupNames.Add(elementName + "Extension");
+ lookupNames.Add(elementName + "Extension");
+
for (var i = 0; i < lookupNames.Count; i++)
{
var name = lookupNames[i];
@@ -71,15 +88,16 @@ namespace Xamarin.Forms.Build.Tasks
if (type != null)
break;
- var assemblydefinition = module.Assembly.Name.Name == asm.Item1
- ? module.Assembly
- : module.AssemblyResolver.Resolve(asm.Item1);
- type = assemblydefinition.MainModule.GetType(asm.Item2, name);
+ var assemblydefinition = module.Assembly.Name.Name == asm.AssemblyName ?
+ module.Assembly :
+ module.AssemblyResolver.Resolve(asm.AssemblyName);
+
+ type = assemblydefinition.MainModule.GetType(asm.ClrNamespace, name);
if (type == null)
{
var exportedtype =
assemblydefinition.MainModule.ExportedTypes.FirstOrDefault(
- (ExportedType arg) => arg.IsForwarder && arg.Namespace == asm.Item2 && arg.Name == name);
+ (ExportedType arg) => arg.IsForwarder && arg.Namespace == asm.ClrNamespace && arg.Name == name);
if (exportedtype != null)
type = exportedtype.Resolve();
}