diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-11-17 20:31:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-17 20:31:05 +0100 |
commit | 054ecf2704ac5d736ffb97c2932e1e078041008a (patch) | |
tree | 6e11e80a370b9ed96c473a03ecc4bbdfefa62cbe /Xamarin.Forms.Build.Tasks | |
parent | 122f0e3e6060711d6c3b2b8523236b8a057434df (diff) | |
download | xamarin-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.cs | 8 | ||||
-rw-r--r-- | Xamarin.Forms.Build.Tasks/XamlGTask.cs | 8 | ||||
-rw-r--r-- | Xamarin.Forms.Build.Tasks/XmlTypeExtensions.cs | 66 |
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(); } |