private void AddDefaultMemberReference(
            RecursiveDefaultMemberAccessExpression expression,
            QualifiedModuleName module,
            Declaration scope,
            Declaration parent,
            bool hasExplicitLetStatement,
            bool isInnerRecursiveDefaultMemberAccess)
        {
            var callSiteContext = expression.Context;
            var identifier      = callSiteContext.GetText();
            var selection       = callSiteContext.GetSelection();
            var callee          = expression.ReferencedDeclaration;

            expression.ReferencedDeclaration.AddReference(
                module,
                scope,
                parent,
                callSiteContext,
                identifier,
                callee,
                selection,
                FindIdentifierAnnotations(module, selection.StartLine),
                hasExplicitLetStatement: hasExplicitLetStatement,
                isNonIndexedDefaultMemberAccess: true,
                defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth,
                isInnerRecursiveDefaultMemberAccess: isInnerRecursiveDefaultMemberAccess);
        }
        private void Visit(
            RecursiveDefaultMemberAccessExpression expression,
            QualifiedModuleName module,
            Declaration scope,
            Declaration parent,
            bool hasExplicitLetStatement,
            bool hasArrayAccess)
        {
            var containedExpression = expression.ContainedDefaultMemberRecursionExpression;

            if (containedExpression != null)
            {
                Visit(containedExpression, module, scope, parent, hasExplicitLetStatement: hasExplicitLetStatement);
            }

            if (expression.Classification != ExpressionClassification.Unbound &&
                expression.ReferencedDeclaration != null)
            {
                AddDefaultMemberReference(expression, module, parent, scope, hasExplicitLetStatement, !hasArrayAccess);
            }
        }