public override ExpressionKind Eat(ISnapshot snapshot, IElementAccessExpression expression)
        {
            _argumentsEater.Eat(snapshot, expression.Arguments);

            // TODO : cover by functional tests
            // TODO : what if array of results or targets
            Eater.Eat(snapshot, expression.Operand);

            return(ExpressionKind.StubCandidate);
        }
        public override ExpressionKind Eat(ISnapshot snapshot, IInvocationExpression expression)
        {
            var invokedName = _expressionHelper.GetInvokedElementName(expression);

            if (invokedName.StartsWith("Method:Moq.Mock.Of"))
            {
                _mockOfInvocationEater.Eat(snapshot, expression);
                return(ExpressionKind.Stub);
            }

            _argumentsEater.Eat(snapshot, expression.Arguments);

            var parentKind = _parentReferenceEater.Eat(snapshot, expression);

            if (invokedName.StartsWith("Method:NUnit.Framework.Assert"))
            {
                snapshot.Add(ExpressionKind.Assert, expression);
                return(ExpressionKind.Assert);
            }

            if (invokedName.StartsWith("Method:Moq.Mock.Verify"))
            {
                snapshot.Add(ExpressionKind.Assert, expression);
                return(ExpressionKind.Assert);
            }

            var invoked = _expressionHelper.GetInvokedElement(expression);

            if (invoked is IMethod)
            {
                var invokedMethod = invoked as IMethod;
                if (snapshot.IsInTestScope(invokedMethod.Module.Name))
                {
                    snapshot.Add(ExpressionKind.TargetCall, expression);
                    return(ExpressionKind.TargetCall);
                }
            }

            if (parentKind == ExpressionKind.None)
            {
                return(ExpressionKind.StubCandidate);
            }

            var basedOnParentKind = _expressionKindHelper.InvocationKindByParentReferenceKind(parentKind);

            if (basedOnParentKind == ExpressionKind.TargetCall)
            {
                snapshot.Add(ExpressionKind.TargetCall, expression);
                return(ExpressionKind.TargetCall);
            }

            return(basedOnParentKind);
        }
        public override ExpressionKind Eat(ISnapshot snapshot, IObjectCreationExpression expression)
        {
            _argumentsEater.Eat(snapshot, expression.Arguments);

            if (expression.Initializer != null)
            {
                foreach (IMemberInitializer memberInitializer in expression.Initializer.InitializerElements)
                {
                    var kind = Eater.Eat(snapshot, memberInitializer.Expression);
                    snapshot.Add(kind, memberInitializer);
                }
            }

            return(GetCreationObjectKind(snapshot, expression));
        }
        public FakeOptionType EatOption(ISnapshot snapshot, IInvocationExpression invocationExpression)
        {
            _argumentsEater.Eat(snapshot, invocationExpression.Arguments);

            if (invocationExpression.ExtensionQualifier == null)
            {
                throw new MoqStubWrongSyntaxException("Moq-stub invocation-option has not parent reference", this,
                                                      invocationExpression);
            }

            var extensionArgumentInfo =
                invocationExpression.ExtensionQualifier.ManagedConvertible as ExtensionArgumentInfo;

            if (extensionArgumentInfo == null || extensionArgumentInfo.Expression == null)
            {
                throw new MoqStubWrongSyntaxException("Moq-stub invocation-option has not parent reference", this,
                                                      invocationExpression);
            }

            var parentReference = extensionArgumentInfo.Expression;

            if (parentReference is IInvocationExpression)
            {
                return(EatOption(snapshot, parentReference as IInvocationExpression));
            }

            if (parentReference is IReferenceExpression)
            {
                var declaredElement = _eatExpressionHelper.GetReferenceElement(parentReference as IReferenceExpression);
                if (declaredElement is ILambdaParameterDeclaration)
                {
                    return(FakeOptionType.Method);
                }

                return(EatOption(snapshot, parentReference as IReferenceExpression));
            }

            throw new MoqStubOptionTargetWrongTypeException(this, parentReference);
        }