/// <summary>
        /// Generate an declaration mock form the given parameters.
        /// </summary>
        /// <param name="nameSpace">The declaration name space.</param>
        /// <param name="name">The declaration name.</param>
        /// <param name="setup">The action delegate to do additional setup on the mock.</param>
        /// <returns>The mocked declaration.</returns>
        public static TDeclaration SetupDeclaration <TDeclaration>(string nameSpace, string name, Action <Mock <TDeclaration> > setup = null)
            where TDeclaration : class, IDeclaration <SyntaxNode>
        {
            var declarationMock = new Mock <TDeclaration>();

            declarationMock.SetupGet(d => d.Name).Returns(name);
            declarationMock.SetupGet(d => d.DeclarationNameSpace).Returns(nameSpace);
            declarationMock.SetupGet(d => d.FullName).Returns(ADeclaration <SyntaxNode> .GetFullName(nameSpace, name));

            setup?.Invoke(declarationMock);

            return(declarationMock.Object);
        }
        public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
        {
            var currentNameSpace = this.nameSpace.Peek();

            this.nameSpace.Push(ADeclaration <SyntaxNode> .GetFullName(currentNameSpace, node.Name.ToString()));

            var currentUsingDirectives = this.usingDirectives.Peek();

            this.usingDirectives.Push(new List <string>(currentUsingDirectives));

            base.VisitNamespaceDeclaration(node);

            this.usingDirectives.Pop();
            this.nameSpace.Pop();
        }
        private void Setup(IEnumerable <IDeclaration <SyntaxNode> > declarations)
        {
            foreach (var declaration in declarations)
            {
                var fullName = ADeclaration <SyntaxNode> .GetFullName(declaration.DeclarationNameSpace, declaration.Name);

                if (!this.declarationMap.TryGetValue(fullName, out var list))
                {
                    list = new List <IDeclaration <SyntaxNode> >();
                    this.declarationMap.Add(fullName, list);
                }

                list.Add(declaration);
            }
        }