public override ICodeNode VisitMethodInvocationExpression(MethodInvocationExpression node)
        {
            ICodeNode newNode = typeOfStep.VisitMethodInvocationExpression(node);

            if (newNode != null)
            {
                return(newNode);
            }
            replaceThisWithBaseStep.VisitMethodInvocationExpression(node);

            newNode = operatorStep.VisitMethodInvocationExpression(node);

            if (newNode != null)
            {
                return(base.Visit(newNode));
            }

            newNode = replaceDelegateInvokeStep.VisitMethodInvocationExpression(node);

            if (newNode != null)
            {
                return(base.VisitDelegateInvokeExpression(newNode as DelegateInvokeExpression));
            }
            newNode = propertyStep.VisitMethodInvocationExpression(node);

            if (newNode != null)
            {
                PropertyReferenceExpression propertyReference = newNode as PropertyReferenceExpression;

                if (propertyReference != null) // if it was a getter
                {
                    newNode = this.VisitPropertyReferenceExpression(propertyReference);
                }
                if (newNode is BinaryExpression)                 // if it was a setter
                {
                    newNode = this.VisitBinaryExpression(newNode as BinaryExpression);
                }
                return(newNode);
            }

            newNode = rebuildEventsStep.VisitMethodInvocationExpression(node);

            if (newNode != null)
            {
                if (newNode is BinaryExpression)
                {
                    return(VisitBinaryExpression(newNode as BinaryExpression));
                }
                return(newNode);
            }
            return(base.VisitMethodInvocationExpression(node));
        }