private IEnumerable <IDeclaration <SyntaxNode> > FindDeclarations(
            string identifier, IDeclaration <SyntaxNode> declarationContext)
        {
            List <IDeclaration <SyntaxNode> > declarations;

            if (declarationContext != null)
            {
                foreach (var usingDirective in declarationContext.UsingDirectives)
                {
                    var lookupName = ADeclaration <SyntaxNode> .GetFullName(usingDirective, identifier);

                    if (this.declarationMap.TryGetValue(lookupName, out declarations))
                    {
                        return(declarations);
                    }
                }

                foreach (var nameSpace in NameSpaceHelper.GetParentNameSpaces(declarationContext.DeclarationNameSpace))
                {
                    if (this.declarationMap.TryGetValue(
                            ADeclaration <SyntaxNode> .GetFullName(nameSpace, identifier),
                            out declarations))
                    {
                        return(declarations);
                    }
                }
            }

            if (this.declarationMap.TryGetValue(identifier, out declarations))
            {
                return(declarations);
            }

            return(null);
        }
        /// <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);
            }
        }