public override Node Visit(NamespaceDeclaration node)
 {
     try
     {
         var root = new NamespaceDeclarationNode(node.Identifiers);
         foreach (var m in node.Members)
         {
             if (m is TypeDeclaration td)
             {
                 var  visitor = Context?.VisitFactory?.GetVisitor(nameof(TypeDeclaration)) as ICILVisitor <TypeDeclaration>;
                 Node outNode = td.AcceptVisitor(visitor);
                 if (!(outNode is MemberDeclarationNode member))
                 {
                     throw new VisitorException($"{nameof(TypeDeclaration)} visitor returned {outNode.Type}.");
                 }
                 root.Members.Add(member);
             }
             else if (m is DelegateDeclaration dd)
             {
                 var  visitor = Context?.VisitFactory?.GetVisitor(nameof(DelegateDeclaration)) as ICILVisitor <DelegateDeclaration>;
                 Node outNode = dd.AcceptVisitor(visitor);
                 if (!(outNode is FunctionEntityDeclarationNode delegateNode))
                 {
                     throw new VisitorException($"{nameof(DelegateDeclaration)} visitor returned {outNode.Type}.");
                 }
                 root.Members.Add(delegateNode);
             }
             else
             {
                 throw new NotImplementedException($"{m.GetType()} is not supported in namespaces.");
             }
         }
         foreach (var c in node.Children.Except(node.Members).Except(new AstNode[] { node.NamespaceName }))
         {
             Node outNode = Context?.VisitFactory?.GetVisitor(c)?.Visit(c);
             if (outNode != null)
             {
                 root.Children.Add(outNode);
             }
         }
         return(root);
     }
     catch (Exception e)
     {
         throw new VisitorException(e);
     }
 }
        // TODO: check if this works
        private NamespaceWrapper Split(IEnumerable <NamespaceWrapper> parent, int level)
        {
            NamespaceWrapper         bottom = parent.SingleOrDefault(p => p.Identifiers.Length == level + 1);
            NamespaceDeclarationNode node;
            NamespaceDeclarationNode declaration;
            List <NamespaceWrapper>  deeper;

            if (bottom != null)
            {
                declaration = new NamespaceDeclarationNode(bottom.Identifiers[level]);
                node        = bottom.Node;

                foreach (var c in node.Members)
                {
                    declaration.Members.Add(c);
                }
                foreach (var c in node.Children)
                {
                    declaration.Children.Add(c);
                }
                deeper = parent.Except(new NamespaceWrapper[] { bottom }).ToList();
            }
            else
            {
                NamespaceWrapper first = parent.First();
                declaration = new NamespaceDeclarationNode(first.Identifiers[level]);
                node        = first.Node;
                deeper      = parent.ToList();
            }

            while (deeper.Count > 0)
            {
                var commonParent = deeper.Where(d => d.Identifiers[level + 1] == deeper[0].Identifiers[level + 1]).ToArray();
                var split        = Split(commonParent, level + 1);
                declaration.Members.Add(split.Node);

                foreach (var w in commonParent)
                {
                    deeper.Remove(w);
                }
            }

            return(new NamespaceWrapper(declaration));
        }
 public NamespaceWrapper(NamespaceDeclarationNode node)
 {
     Node        = node;
     Identifiers = node.Identifiers.ToArray();
 }
 object IVisitor.Visit(NamespaceDeclarationNode node)
 {
     return(Visit((Node)node));
 }
 /// <inheritdoc/>
 public override void VisitNamespaceDeclarationNode(NamespaceDeclarationNode node)
 {
     VisitList <ParseTreeNode>(node.NamespaceMemberDeclarations);
 }
 public object Visit(NamespaceDeclarationNode node)
 {
     return(Visit((Node)node));
 }