public override Expression VisitMethodCall(MethodCall call)
        {
            MemberBinding mb = call.Callee as MemberBinding;

            if (mb == null)
            {
                return(call);
            }

            Method calledMethod = mb.BoundMember as Method;

            if (calledMethod == null)
            {
                return(call);
            }

            Method template = calledMethod.Template;

            if (contractNodes.IsOldMethod(template))
            {
                OldExpression oe = new OldExpression(ExtractOldExpression(call));
                oe.Type = call.Type;
                return(oe);
            }

            if (contractNodes.IsValueAtReturnMethod(template))
            {
                return(new AddressDereference(call.Operands[0], calledMethod.TemplateArguments[0], call.SourceContext));
            }

            if (contractNodes.IsResultMethod(template))
            {
                // check if we are in an Task returning method
                if (this.declaringMethod != null && this.declaringMethod.ReturnType != null)
                {
                    var rt    = this.declaringMethod.ReturnType;
                    var templ = rt.Template;

                    if (templ != null && templ.Name.Name == "Task`1" && rt.TemplateArguments != null &&
                        rt.TemplateArguments.Count == 1)
                    {
                        var targ = rt.TemplateArguments[0];
                        if (calledMethod.TemplateArguments[0] == targ)
                        {
                            // use of ReturnValue<T>() instead of ReturnValue<Task<T>>().Result
                            var retExp     = new ReturnValue(rt, call.SourceContext);
                            var resultProp = rt.GetProperty(Identifier.For("Result"));
                            if (resultProp != null && resultProp.Getter != null)
                            {
                                return(new MethodCall(new MemberBinding(retExp, resultProp.Getter), new ExpressionList()));
                            }
                        }
                    }
                }

                return(new ReturnValue(calledMethod.ReturnType, call.SourceContext));
            }

            return(base.VisitMethodCall(call));
        }