Пример #1
0
        internal static void ParseXaml(TextReader xaml, out string rootType, out string rootNs, out CodeTypeReference baseType,
                                       out IDictionary <string, CodeTypeReference> namesAndTypes)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(xaml);

            var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);

            nsmgr.AddNamespace("__f__", "http://xamarin.com/schemas/2014/forms");

            var root = xmlDoc.SelectSingleNode("/*", nsmgr);

            if (root == null)
            {
                Console.Error.WriteLine("{0}: No root node found");
                rootType      = null;
                rootNs        = null;
                baseType      = null;
                namesAndTypes = null;
                return;
            }

            foreach (XmlAttribute attr in root.Attributes)
            {
                if (attr.Name == "xmlns")
                {
                    nsmgr.AddNamespace("", attr.Value);                     //Add default xmlns
                }
                if (attr.Prefix != "xmlns")
                {
                    continue;
                }
                nsmgr.AddNamespace(attr.LocalName, attr.Value);
            }

            var rootClass = root.Attributes["Class", XAML2006]
                            ?? root.Attributes["Class", XAML2009];

            if (rootClass == null)
            {
                rootType      = null;
                rootNs        = null;
                baseType      = null;
                namesAndTypes = null;
                return;
            }

            string rootAsm, targetPlatform;

            XmlnsHelper.ParseXmlns(rootClass.Value, out rootType, out rootNs, out rootAsm, out targetPlatform);
            namesAndTypes = GetNamesAndTypes(root, nsmgr);

            var typeArgsAttr = root.Attributes["TypeArguments", XAML2006]
                               ?? root.Attributes["TypeArguments", XAML2009];

            var xmlType = new XmlType(root.NamespaceURI, root.LocalName, typeArgsAttr != null ? TypeArgumentsParser.ParseExpression(typeArgsAttr.Value, nsmgr, null): null);

            baseType = GetType(xmlType, root.GetNamespaceOfPrefix);
        }
Пример #2
0
        internal static void ParseXaml(TextReader xaml, out string rootType, out string rootNs, out CodeTypeReference baseType,
                                       out IEnumerable <CodeMemberField> namedFields)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(xaml);

            var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);

            nsmgr.AddNamespace("__f__", XamlParser.XFUri);

            var root = xmlDoc.SelectSingleNode("/*", nsmgr);

            if (root == null)
            {
                Console.Error.WriteLine("{0}: No root node found");
                rootType    = null;
                rootNs      = null;
                baseType    = null;
                namedFields = null;
                return;
            }

            foreach (XmlAttribute attr in root.Attributes)
            {
                if (attr.Name == "xmlns")
                {
                    nsmgr.AddNamespace("", attr.Value);                     //Add default xmlns
                }
                if (attr.Prefix != "xmlns")
                {
                    continue;
                }
                nsmgr.AddNamespace(attr.LocalName, attr.Value);
            }

            var rootClass = root.Attributes["Class", XamlParser.X2006Uri]
                            ?? root.Attributes["Class", XamlParser.X2009Uri];

            if (rootClass == null)
            {
                rootType    = null;
                rootNs      = null;
                baseType    = null;
                namedFields = null;
                return;
            }

            string rootAsm, targetPlatform;

            XmlnsHelper.ParseXmlns(rootClass.Value, out rootType, out rootNs, out rootAsm, out targetPlatform);
            namedFields = GetCodeMemberFields(root, nsmgr);

            var typeArguments = GetAttributeValue(root, "TypeArguments", XamlParser.X2006Uri, XamlParser.X2009Uri);
            var xmlType       = new XmlType(root.NamespaceURI, root.LocalName, typeArguments != null ? TypeArgumentsParser.ParseExpression(typeArguments, nsmgr, null): null);

            baseType = GetType(xmlType, root.GetNamespaceOfPrefix);
        }
Пример #3
0
        internal static void ParseXaml(TextReader xaml, out string rootType, out string rootNs, out CodeTypeReference baseType,
                                       out IDictionary <string, CodeTypeReference> namesAndTypes)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(xaml);

            var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);

            nsmgr.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
            nsmgr.AddNamespace("x2009", "http://schemas.microsoft.com/winfx/2009/xaml");
            nsmgr.AddNamespace("f", "http://xamarin.com/schemas/2014/forms");

            var root = xmlDoc.SelectSingleNode("/*", nsmgr);

            if (root == null)
            {
                Console.Error.WriteLine("{0}: No root node found");
                rootType      = null;
                rootNs        = null;
                baseType      = null;
                namesAndTypes = null;
                return;
            }

            var rootClass = root.Attributes["Class", "http://schemas.microsoft.com/winfx/2006/xaml"] ??
                            root.Attributes["Class", "http://schemas.microsoft.com/winfx/2009/xaml"];

            if (rootClass == null)
            {
                rootType      = null;
                rootNs        = null;
                baseType      = null;
                namesAndTypes = null;
                return;
            }

            string rootAsm, targetPlatform;

            XmlnsHelper.ParseXmlns(rootClass.Value, out rootType, out rootNs, out rootAsm, out targetPlatform);
            namesAndTypes = GetNamesAndTypes(root, nsmgr);

            var typeArguments = root.Attributes["TypeArguments", "http://schemas.microsoft.com/winfx/2009/xaml"];

            baseType = GetType(root.NamespaceURI, root.LocalName, typeArguments == null ? null : typeArguments.Value.Split(','),
                               root.GetNamespaceOfPrefix);
        }
Пример #4
0
        internal bool ParseXaml(TextReader xaml)
        {
            var xmlDoc = new XmlDocument();

            xmlDoc.Load(xaml);

            // if the following xml processing instruction is present
            //
            // <?xaml-comp compile="true" ?>
            //
            // we will generate a xaml.g.cs file with the default ctor calling InitializeComponent, and a XamlCompilation attribute
            var hasXamlCompilationProcessingInstruction = GetXamlCompilationProcessingInstruction(xmlDoc);

            var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);

            nsmgr.AddNamespace("__f__", XamlParser.XFUri);

            var root = xmlDoc.SelectSingleNode("/*", nsmgr);

            if (root == null)
            {
                Logger?.LogMessage(MessageImportance.Low, " No root node found");
                return(false);
            }

            foreach (XmlAttribute attr in root.Attributes)
            {
                if (attr.Name == "xmlns")
                {
                    nsmgr.AddNamespace("", attr.Value);                     //Add default xmlns
                }
                if (attr.Prefix != "xmlns")
                {
                    continue;
                }
                nsmgr.AddNamespace(attr.LocalName, attr.Value);
            }

            var rootClass = root.Attributes["Class", XamlParser.X2006Uri]
                            ?? root.Attributes["Class", XamlParser.X2009Uri];

            if (rootClass != null)
            {
                string rootType, rootNs, rootAsm, targetPlatform;
                XmlnsHelper.ParseXmlns(rootClass.Value, out rootType, out rootNs, out rootAsm, out targetPlatform);
                RootType         = rootType;
                RootClrNamespace = rootNs;
            }
            else if (hasXamlCompilationProcessingInstruction)
            {
                RootClrNamespace            = "__XamlGeneratedCode__";
                RootType                    = $"__Type{Guid.NewGuid().ToString("N")}";
                GenerateDefaultCtor         = true;
                AddXamlCompilationAttribute = true;
                HideFromIntellisense        = true;
            }
            else                           // rootClass == null && !hasXamlCompilationProcessingInstruction) {
            {
                XamlResourceIdOnly = true; //only generate the XamlResourceId assembly attribute
                return(true);
            }

            NamedFields = GetCodeMemberFields(root, nsmgr);
            var typeArguments = GetAttributeValue(root, "TypeArguments", XamlParser.X2006Uri, XamlParser.X2009Uri);
            var xmlType       = new XmlType(root.NamespaceURI, root.LocalName, typeArguments != null ? TypeArgumentsParser.ParseExpression(typeArguments, nsmgr, null) : null);

            BaseType = GetType(xmlType, root.GetNamespaceOfPrefix);

            return(true);
        }
Пример #5
0
        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;

            var lookupAssemblies = new List <XmlnsDefinitionAttribute>();

            var lookupNames = new List <string>();

            foreach (var xmlnsDef in s_xmlnsDefinitions)
            {
                if (xmlnsDef.XmlNamespace != namespaceURI)
                {
                    continue;
                }
                lookupAssemblies.Add(xmlnsDef);
            }

            if (lookupAssemblies.Count == 0)
            {
                string ns;
                string typename;
                string asmstring;
                string targetPlatform;

                XmlnsHelper.ParseXmlns(namespaceURI, out typename, out ns, out asmstring, out targetPlatform);
                asmstring = asmstring ?? module.Assembly.Name.Name;
                lookupAssemblies.Add(new XmlnsDefinitionAttribute(namespaceURI, ns)
                {
                    AssemblyName = asmstring
                });
            }

            lookupNames.Add(elementName);
            lookupNames.Add(elementName + "Extension");

            for (var i = 0; i < lookupNames.Count; i++)
            {
                var name = lookupNames[i];
                if (name.Contains(":"))
                {
                    name = name.Substring(name.LastIndexOf(':') + 1);
                }
                if (typeArguments != null)
                {
                    name += "`" + typeArguments.Count;                     //this will return an open generic Type
                }
                lookupNames[i] = name;
            }

            TypeReference type = null;

            foreach (var asm in lookupAssemblies)
            {
                if (type != null)
                {
                    break;
                }
                foreach (var name in lookupNames)
                {
                    if (type != null)
                    {
                        break;
                    }

                    var clrNamespace = asm.ClrNamespace;
                    var typeName     = name.Replace('+', '/');                 //Nested types
                    var idx          = typeName.LastIndexOf('.');
                    if (idx >= 0)
                    {
                        clrNamespace += '.' + typeName.Substring(0, typeName.LastIndexOf('.'));
                        typeName      = typeName.Substring(typeName.LastIndexOf('.') + 1);
                    }
                    var assemblydefinition = module.Assembly.Name.Name == asm.AssemblyName ?
                                             module.Assembly :
                                             module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(asm.AssemblyName));

                    type = assemblydefinition.MainModule.GetType(clrNamespace + "." + typeName);
                    if (type == null)
                    {
                        var exportedtype =
                            assemblydefinition.MainModule.ExportedTypes.FirstOrDefault(
                                (ExportedType arg) => arg.IsForwarder && arg.Namespace == clrNamespace && arg.Name == typeName);
                        if (exportedtype != null)
                        {
                            type = exportedtype.Resolve();
                        }
                    }
                }
            }

            if (type != null && typeArguments != null && type.HasGenericParameters)
            {
                type =
                    module.ImportReference(type)
                    .MakeGenericInstanceType(typeArguments.Select(x => GetTypeReference(x, module, xmlInfo)).ToArray());
            }

            if (type == null)
            {
                throw new XamlParseException(string.Format("Type {0} not found in xmlns {1}", elementName, namespaceURI), xmlInfo);
            }

            return(module.ImportReference(type));
        }
Пример #6
0
        public static TypeReference GetTypeReference(this XmlType xmlType, ModuleDefinition module, IXmlLineInfo xmlInfo)
        {
            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>();

            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"));
            }
            else
            {
                string ns;
                string typename;
                string asmstring;
                string targetPlatform;

                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));
            }

            lookupNames.Add(elementName);
            if (namespaceURI == "http://schemas.microsoft.com/winfx/2009/xaml")
            {
                lookupNames.Add(elementName + "Extension");
            }
            for (var i = 0; i < lookupNames.Count; i++)
            {
                var name = lookupNames[i];
                if (name.Contains(":"))
                {
                    name = name.Substring(name.LastIndexOf(':') + 1);
                }
                if (typeArguments != null)
                {
                    name += "`" + typeArguments.Count;                     //this will return an open generic Type
                }
                lookupNames[i] = name;
            }

            TypeReference type = null;

            foreach (var asm in lookupAssemblies)
            {
                if (type != null)
                {
                    break;
                }
                foreach (var name in lookupNames)
                {
                    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);
                    if (type == null)
                    {
                        var exportedtype =
                            assemblydefinition.MainModule.ExportedTypes.FirstOrDefault(
                                (ExportedType arg) => arg.IsForwarder && arg.Namespace == asm.Item2 && arg.Name == name);
                        if (exportedtype != null)
                        {
                            type = exportedtype.Resolve();
                        }
                    }
                }
            }

            if (type != null && typeArguments != null && type.HasGenericParameters)
            {
                type =
                    module.Import(type)
                    .MakeGenericInstanceType(typeArguments.Select(x => GetTypeReference(x, module, xmlInfo)).ToArray());
            }

            if (type == null)
            {
                throw new XamlParseException(string.Format("Type {0} not found in xmlns {1}", elementName, namespaceURI), xmlInfo);
            }

            return(module.Import(type));
        }
Пример #7
0
        public static TypeReference GetTypeReference(this XmlType xmlType, ModeOfGetType mode, ModuleDefinition module, IXmlLineInfo xmlInfo, bool fromAllAssembly = false)
        {
            if (s_xmlnsDefinitions == null)
            {
                GatherXmlnsDefinitionAttributes();
            }

            var namespaceURI  = xmlType.NamespaceUri;
            var elementName   = xmlType.Name;
            var typeArguments = xmlType.TypeArguments;

            if (elementName.Contains("-"))
            {
                elementName = elementName.Replace('-', '+');
            }

            var lookupAssemblies = new List <XmlnsDefinitionAttribute>();

            var lookupNames = new List <string>();

            if (true == fromAllAssembly)
            {
                foreach (var xmlnsDef in s_xmlnsDefinitions)
                {
                    lookupAssemblies.Add(xmlnsDef);
                }
            }
            else
            {
                foreach (var xmlnsDef in s_xmlnsDefinitions)
                {
                    if (xmlnsDef.XmlNamespace != namespaceURI)
                    {
                        continue;
                    }
                    lookupAssemblies.Add(xmlnsDef);
                }
            }

            if (lookupAssemblies.Count == 0)
            {
                string ns;
                string typename;
                string asmstring;
                string targetPlatform;

                XmlnsHelper.ParseXmlns(namespaceURI, out typename, out ns, out asmstring, out targetPlatform);
                asmstring = asmstring ?? module.Assembly.Name.Name;
                if (ns != null)
                {
                    lookupAssemblies.Add(new XmlnsDefinitionAttribute(namespaceURI, ns, 0)
                    {
                        AssemblyName = asmstring
                    });
                }
            }

            switch (mode)
            {
            case ModeOfGetType.OnlyGetType:
                lookupNames.Add(elementName);
                break;

            case ModeOfGetType.OnlyGetTypeExtension:
                lookupNames.Add(elementName + "Extension");
                break;

            case ModeOfGetType.Both:
                lookupNames.Add(elementName);
                lookupNames.Add(elementName + "Extension");
                break;
            }

            for (var i = 0; i < lookupNames.Count; i++)
            {
                var name = lookupNames[i];
                if (name.Contains(":"))
                {
                    name = name.Substring(name.LastIndexOf(':') + 1);
                }
                if (typeArguments != null)
                {
                    name += "`" + typeArguments.Count; //this will return an open generic Type
                }
                lookupNames[i] = name;
            }

            TypeReference type = null;

            foreach (var asm in lookupAssemblies)
            {
                if (type != null)
                {
                    break;
                }
                foreach (var name in lookupNames)
                {
                    if (type != null)
                    {
                        break;
                    }

                    var clrNamespace = asm.ClrNamespace;
                    var typeName     = name.Replace('+', '/'); //Nested types
                    var idx          = typeName.LastIndexOf('.');
                    if (idx >= 0)
                    {
                        clrNamespace += '.' + typeName.Substring(0, typeName.LastIndexOf('.'));
                        typeName      = typeName.Substring(typeName.LastIndexOf('.') + 1);
                    }
                    type = module.GetTypeDefinition((asm.AssemblyName, clrNamespace, typeName));
                }
            }

            if (type != null && typeArguments != null && type.HasGenericParameters)
            {
                type =
                    module.ImportReference(type)
                    .MakeGenericInstanceType(typeArguments.Select(x => GetTypeReference(x, mode, module, xmlInfo)).ToArray());
            }

            if (type == null)
            {
                throw new XamlParseException(string.Format("Type {0} not found in xmlns {1}", elementName, namespaceURI), xmlInfo);
            }

            return(module.ImportReference(type));
        }
Пример #8
0
        public static TypeReference GetTypeReference(this XmlType xmlType, ModuleDefinition module, IXmlLineInfo xmlInfo)
        {
            IList <XmlnsDefinitionAttribute> xmlnsDefinitions = null;

            lock (_nsLock) {
                if (!s_xmlnsDefinitions.TryGetValue(module, out xmlnsDefinitions))
                {
                    xmlnsDefinitions = GatherXmlnsDefinitionAttributes(module);
                }
            }

            var namespaceURI  = xmlType.NamespaceUri;
            var elementName   = xmlType.Name;
            var typeArguments = xmlType.TypeArguments;

            var lookupAssemblies = new List <XmlnsDefinitionAttribute>();

            var lookupNames = new List <string>();

            foreach (var xmlnsDef in xmlnsDefinitions)
            {
                if (xmlnsDef.XmlNamespace != namespaceURI)
                {
                    continue;
                }
                lookupAssemblies.Add(xmlnsDef);
            }

            if (lookupAssemblies.Count == 0)
            {
                string ns;
                string typename;
                string asmstring;
                string targetPlatform;

                XmlnsHelper.ParseXmlns(namespaceURI, out typename, out ns, out asmstring, out targetPlatform);
                asmstring = asmstring ?? module.Assembly.Name.Name;
                if (ns != null)
                {
                    lookupAssemblies.Add(new XmlnsDefinitionAttribute(namespaceURI, ns)
                    {
                        AssemblyName = asmstring
                    });
                }
            }

            lookupNames.Add(elementName);
            lookupNames.Add(elementName + "Extension");

            for (var i = 0; i < lookupNames.Count; i++)
            {
                var name = lookupNames[i];
                if (name.Contains(":"))
                {
                    name = name.Substring(name.LastIndexOf(':') + 1);
                }
                if (typeArguments != null)
                {
                    name += "`" + typeArguments.Count;                     //this will return an open generic Type
                }
                lookupNames[i] = name;
            }

            TypeReference type = null;

            foreach (var asm in lookupAssemblies)
            {
                if (type != null)
                {
                    break;
                }
                foreach (var name in lookupNames)
                {
                    if (type != null)
                    {
                        break;
                    }

                    var clrNamespace = asm.ClrNamespace;
                    var typeName     = name.Replace('+', '/');                 //Nested types
                    var idx          = typeName.LastIndexOf('.');
                    if (idx >= 0)
                    {
                        clrNamespace += '.' + typeName.Substring(0, typeName.LastIndexOf('.'));
                        typeName      = typeName.Substring(typeName.LastIndexOf('.') + 1);
                    }
                    type = module.GetTypeDefinition((asm.AssemblyName, clrNamespace, typeName));
                }
            }

            if (type != null && typeArguments != null && type.HasGenericParameters)
            {
                type =
                    module.ImportReference(type)
                    .MakeGenericInstanceType(typeArguments.Select(x => GetTypeReference(x, module, xmlInfo)).ToArray());
            }

            if (type == null)
            {
                throw new XamlParseException(string.Format("Type {0} not found in xmlns {1}. Ensure third party control libraries are referenced in the code of your project and not just in XAML.", elementName, namespaceURI), xmlInfo);
            }

            return(module.ImportReference(type));
        }