Exemplo n.º 1
0
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <Scope> getScope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            if (node.NsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                node.NsPrefix = scope.NsPrefix;
            }

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);
            var moduleMember = GetModuleMember((Node)node);
            var member       = moduleMember as ModuleMember;

            if (member != null)
            {
                //Resolving ns first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == moduleMember);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = member.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }
Exemplo n.º 2
0
        INsNode GetNode(INsNode parent, TypeMapping tm, string oldName, bool preserve = false)
        {
            return(parent.GetOrAddNode(oldName, () =>
            {
                string newName;
                if (preserve)
                {
                    newName = oldName;
                }
                else
                {
                    newName = NameGenerator(parent, tm?.Source, oldName,
                                            n => parent.NewName == n || parent.MembersByNewName.ContainsKey(n));
                }

                return newName;
            }));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Resolves namespace and prefix for <see cref="INsNode"/>.
        /// </summary>
        /// <param name="node">Target <see cref="INsNode"/>.</param>
        /// <param name="document">Current <see cref="Document"/>.</param>
        /// <param name="currentModuleMember">Current module member.</param>
        /// <param name="scope">Current <see cref="Scope"/>.</param>
        /// <param name="prefix">Output namespace prefix parameter.</param>
        /// <param name="ns">Output namespace parameter.</param>
        public void GetPrefixAndNs(INsNode node, DOM.Document document, ModuleMember currentModuleMember, Scope scope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            var nsPrefix = node.NsPrefix;

            if (nsPrefix == null)
            {
                if (scope == null)
                {
                    return;
                }
                nsPrefix = scope.NsPrefix;
            }
            GetPrefixAndNs(nsPrefix, node, document, currentModuleMember, out prefix, out ns);
        }
Exemplo n.º 4
0
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <Scope> getScope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            var nsPrefix = node.NsPrefix;

            if (nsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                nsPrefix = scope.NsPrefix;
            }

            GetPrefixAndNs(nsPrefix, node, document, out prefix, out ns);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Resolves namespace and prefix for <see cref="INsNode"/>.
        /// </summary>
        /// <param name="nsPrefix">Effective namespace prefix of the node. Could be different than the actual prefix.</param>
        /// <param name="node">Target <see cref="INsNode"/>.</param>
        /// <param name="document">Current <see cref="Document"/>.</param>
        /// <param name="currentModuleMember"></param>
        /// <param name="prefix">Output namespace prefix parameter.</param>
        /// <param name="ns">Output namespace parameter.</param>
        public void GetPrefixAndNs(string nsPrefix, INsNode node, DOM.Document document, ModuleMember currentModuleMember, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);
            var moduleMember = currentModuleMember;// GetModuleMember((Pair)node); _

            if (moduleMember is ModuleMember member)
            {
                //Resolving namespace first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == moduleMember);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == nsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = member.Module.NamespaceDefinitions.FirstOrDefault(n => n.Name == nsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }
Exemplo n.º 6
0
        INsNode GetNode(TypeMapping mapping)
        {
            return(_ns.GetOrAddNode(mapping, tm =>
            {
                var source = tm.Source;
                var uniqueInScopeOldName = tm.UniqueName;
                var toMangle = _options.Type & ~_ns.Preserved(tm) & MetaType.NamespaceAndType;
                var preserveType = (toMangle & MetaType.Type) == 0;
                var preserveNs = (toMangle & MetaType.Namespace) == 0;
                INsNode scope;
                if (source.DeclaringType != null)
                {
                    var parent = GetNode(Context.MappedTypes[source.DeclaringType.CreateKey()]);
                    scope = GetNode(parent, tm, uniqueInScopeOldName, preserveType);
                }
                else
                {
                    INsNode node = _root;
                    if (preserveNs)
                    {
                        node = GetNode(node, null, tm.Source.Namespace, true);
                    }
                    else
                    {
                        var nsfolding = _options.NamespaceMangling;
                        switch (nsfolding)
                        {
                        // root -> types
                        case NamespaceMangling.Empty:
                            if (preserveType)
                            {
                                if (node.MembersByNewName.ContainsKey(uniqueInScopeOldName))
                                {
                                    goto case NamespaceMangling.Fold;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            if (tm.Source.Namespace.Length > 0)
                            {
                                // this will serve as a key only to prevent duplicates, it will be replaced by mangled name
                                uniqueInScopeOldName = tm.Source.Namespace + "." + uniqueInScopeOldName;
                            }
                            break;

                        // root -> namespaces -> types
                        case NamespaceMangling.Fold:
                            node = GetNode(node, null, tm.Source.Namespace);
                            break;

                        // root -> namespaces[0] -> namespaces[1] -> namespaces[...n] -> types
                        case NamespaceMangling.Parts:
                            foreach (var part in tm.Source.Namespace.ToString().Split('.'))
                            {
                                node = GetNode(node, null, part);
                            }
                            break;

                        case NamespaceMangling.Distribute:
                            node = (INsNode)node.Members.RandomElementOrDefault(_rng);
                            goto case NamespaceMangling.Empty;
                        }

                        if (tm.Target.Namespace != node.FullNewName)
                        {
                            tm.Target.Namespace = node.FullNewName;
                        }
                    }

                    scope = GetNode(node, tm, uniqueInScopeOldName, preserveType);
                }

                if (tm.Target.Name != scope.NewName)
                {
                    tm.Target.Name = scope.NewName;
                }
                return scope;
            }));
        }
Exemplo n.º 7
0
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <DOM.AliasDefinition> getAliasDef, Func <Scope> getScope, out string prefix, out string ns)
        {
            prefix = null;
            ns     = null;

            if (node.NsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                node.NsPrefix = scope.NsPrefix;
            }

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);

            var aliasDef = getAliasDef();

            if (aliasDef == null)
            {//Resolving based on document's NsInfo
                var domNamespace = targetNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                if (domNamespace != null)
                {
                    prefix = domNamespace.Name;
                    ns     = domNamespace.Value;
                }
                else
                {
                    //Prefix is defined in Module. Resolving using module namespaces
                    //Finding uri first
                    var moduleNamespace = document.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;

                        //Finding effective prefix in the Document Namespace
                        domNamespace = targetNsInfo.Namespaces.First(n => n.Value == moduleNamespace.Value);
                        prefix       = domNamespace.Name;
                    }
                }
            }
            else
            {
                //Resolving ns first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == aliasDef);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = aliasDef.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }