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)); }