protected override ExpressionBody Transform(IndexOfMatchExpression mx)
        {
            var rx     = LX.Constant(mx.Regex);
            var target = Transform(mx.Corpus);

            return(LX.Call(IndexOfMatchMethod, target, rx));
        }
        protected override Expression Transform(IndexOfMatchExpression mx)
        {
            if (!TryTransform(mx.Corpus, out var corpus))
            {
                return(mx);
            }

            return(new IndexOfMatchExpression(corpus, mx.Regex));
        }
 protected virtual TResult Transform(Expression expression)
 {
     return(expression switch
     {
         CallExpression call => Transform(call),
         ConstantExpression constant => Transform(constant),
         AccessorExpression accessor => Transform(accessor),
         AmbientPropertyExpression property => Transform(property),
         LambdaExpression lambda => Transform(lambda),
         ParameterExpression parameter => Transform(parameter),
         IndexerWildcardExpression wildcard => Transform(wildcard),
         ArrayExpression array => Transform(array),
         ObjectExpression obj => Transform(obj),
         IndexerExpression indexer => Transform(indexer),
         IndexOfMatchExpression match => Transform(match),
         null => throw new ArgumentNullException(nameof(expression)),
         // Non-exhaustive because `InternalsVisibleTo` is applied to the assembly.
         _ => throw new NotSupportedException($"{expression} is not supported.")
     });
        Expression TryCompileLikeExpression(bool ignoreCase, Expression corpus, Expression like)
        {
            if (like is ConstantExpression cx &&
                cx.Constant is ScalarValue scalar &&
                scalar.Value is string s)
            {
                var regex = LikeToRegex(s);
                var opts  = RegexOptions.Compiled | RegexOptions.ExplicitCapture;
                if (ignoreCase)
                {
                    opts |= RegexOptions.IgnoreCase;
                }
                var compiled = new Regex(regex, opts, TimeSpan.FromMilliseconds(100));
                var indexof  = new IndexOfMatchExpression(Transform(corpus), compiled);
                return(new CallExpression(ignoreCase, Operators.RuntimeOpNotEqual, indexof, new ConstantExpression(new ScalarValue(-1))));
            }

            SelfLog.WriteLine($"Serilog.Expressions: `like` requires a constant string argument; found ${like}.");
            return(new CallExpression(false, Operators.OpUndefined));
        }
 protected override IndexerExpression?Transform(IndexOfMatchExpression mx)
 {
     return(Transform(mx.Corpus));
 }