private void AddUnboundDefaultMemberReference(
            DictionaryAccessExpression expression,
            QualifiedModuleName module,
            Declaration scope,
            Declaration parent,
            bool isAssignmentTarget,
            bool hasExplicitLetStatement,
            bool isSetAssignment)
        {
            var callSiteContext = expression.DefaultMemberContext;
            var identifier      = expression.Context.GetText();
            var selection       = callSiteContext.GetSelection();
            var callee          = expression.ReferencedDeclaration;
            var reference       = new IdentifierReference(
                module,
                scope,
                parent,
                identifier,
                selection,
                callSiteContext,
                callee,
                isAssignmentTarget,
                hasExplicitLetStatement,
                FindIdentifierAnnotations(module, selection.StartLine),
                isSetAssignment,
                isIndexedDefaultMemberAccess: true,
                defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);

            _declarationFinder.AddUnboundDefaultMemberAccess(reference);
        }
        private void Visit(
            DictionaryAccessExpression expression,
            QualifiedModuleName module,
            Declaration scope,
            Declaration parent,
            bool isAssignmentTarget,
            bool hasExplicitLetStatement,
            bool isSetAssignment)
        {
            Visit(expression.LExpression, module, scope, parent, hasExplicitLetStatement: hasExplicitLetStatement);

            var containedExpression = expression.ContainedDefaultMemberRecursionExpression;

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

            switch (expression.Classification)
            {
            case ExpressionClassification.ResolutionFailed:
                AddFailedIndexedDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement);
                break;

            case ExpressionClassification.Unbound:
                AddUnboundDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
                break;

            default:
                if (expression.ReferencedDeclaration != null)
                {
                    AddDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
                }

                break;
            }

            // Argument List not affected by being unbound.
            foreach (var argument in expression.ArgumentList.Arguments)
            {
                if (argument.ReferencedParameter != null)
                {
                    AddArgumentReference(argument, module, scope, parent);
                }

                if (argument.Expression != null)
                {
                    Visit(argument.Expression, module, scope, parent);
                }
                if (argument.NamedArgumentExpression != null)
                {
                    Visit(argument.NamedArgumentExpression, module, scope, parent);
                }
            }
        }
示例#3
0
 private void Visit(DictionaryAccessExpression expression, Declaration parent, IBoundExpression withExpression)
 {
     Visit(expression.LExpression, parent, withExpression);
 }