/// <summary>
        /// Load extends statement list.
        /// </summary>
        /// <param name="declaration">The declaration to load.</param>
        /// <param name="resolver">The resolver to resolve dependencies.</param>
        private void LoadExtends(
            AGenericDeclaration <TNode> declaration,
            IDeclarationResolver resolver)
        {
            BaseListSyntax baseListSyntax = BaseListGetter(declaration.SyntaxNodeProvider.SyntaxNode);

            if (baseListSyntax != null)
            {
                var baseWalker = new DeclarationUseWalker(resolver, declaration);
                var uses       = new List <IDeclarationUse <SyntaxNode> >();

                foreach (var node in baseListSyntax.ChildNodes())
                {
                    var use = baseWalker.Visit(node);

                    if (use.Declaration is IGenericDeclarationImpl genericDeclaration)
                    {
                        genericDeclaration.AddExtendedBy(declaration);
                    }

                    uses.Add(use);
                }

                declaration.Extends = uses;
            }
            else
            {
                declaration.Extends = Array.Empty <IDeclarationUse <SyntaxNode> >();
            }
        }
        public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
        {
            var identifier = node.Identifier.ToString();

            if (node.Modifiers.All(m => m.Kind() != SyntaxKind.PrivateKeyword))
            {
                var useWalker = new DeclarationUseWalker(this.resolver, this.genericDeclaration);
                var use       = useWalker.Visit(node.ReturnType);

                this.memberList.Add(new MethodDeclaration(
                                        identifier,
                                        use,
                                        new ParserSyntaxNodeProvider <MethodDeclarationSyntax>(node)));
            }
        }
        public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
        {
            var identifier = node.Identifier.ToString();

            var useWalker = new DeclarationUseWalker(this.resolver, this.genericDeclaration);
            var use       = useWalker.Visit(node.Type);

            var canRead  = node.AccessorList.Accessors.FirstOrDefault(a => a.Kind() == SyntaxKind.GetAccessorDeclaration) != null;
            var canWrite = node.AccessorList.Accessors.LastOrDefault(a => a.Kind() == SyntaxKind.SetAccessorDeclaration) != null;

            this.memberList.Add(new PropertyDeclaration(
                                    identifier,
                                    use,
                                    new ParserSyntaxNodeProvider <PropertyDeclarationSyntax>(node),
                                    canRead,
                                    canWrite));
        }