/// <inheritdoc/>
            public override void VisitInvocationExpression(InvocationExpression syntax)
            {
                var methodToEval = GetMethodToEval(syntax, _context, _declaringTypeFilter);

                if (methodToEval == null)
                {
                    throw new NotSupportedException($"Encountered syntax that is unable to be evaluated: {syntax}");
                }

                var arguments = syntax.Arguments
                                .Select(arg =>
                {
                    var visitor = new EvaluationVisitor(_context, _visitedMethods);
                    arg.AcceptVisitor(visitor);

                    return(visitor.Result);
                })
                                .ToArray();

                Result = _context.Invoke(methodToEval, arguments);
            }
        /// <summary>
        /// Attempts to visit an <see cref="InvocationExpression"/> node
        /// </summary>
        /// <param name="syntax">The node to evaluate</param>
        /// <returns>True if it was visited, otherwise false</returns>
        public bool TryVisit(InvocationExpression syntax)
        {
            var methodToEval = GetMethodToEval(syntax, _context, _declaringTypeFilter);

            if (methodToEval != null)
            {
                var arguments = syntax.Arguments
                                .Select(arg =>
                {
                    // allow all methods
                    var visitor = new EvaluationVisitor(_context, _visitedMethods, t => true);
                    arg.AcceptVisitor(visitor);

                    return(visitor.Result);
                })
                                .ToArray();

                Result = _context.Invoke(methodToEval, arguments);
                return(true);
            }

            return(false);
        }