// For performance testing public static ParseResult <object> ParseDelegate(string exprString, IFunctions <string> functions = null) { var parseResult = CSharpParser(functions).Parse(exprString); var expr = parseResult.Expression; var csharpExpr = expr.Evaluate(new CSharpObjectContext(ConcatStringMonad.Instance, Constants.DefaultContext)); var(type, emitResult) = CodeGenCSharpClass.Generate("VcelTesting", csharpExpr); if (type == null) { return(new ParseResult <object>(emitResult.Diagnostics.Select( x => new ParseError( x.GetMessage(), x.Id, x.Location.GetLineSpan().StartLinePosition.Line, x.Location.GetLineSpan().StartLinePosition.Line, x.Location.GetLineSpan().EndLinePosition.Line)).ToList())); } var method = type.GetMethod("Evaluate"); Debug.Assert(method != null, nameof(method) + " != null"); var func = (Func <object, object>)Delegate.CreateDelegate(typeof(Func <object, object>), null, method); return(new ParseResult <object>(new CSharpDelegateExpr(null, func))); }
// For functional testing public static ParseResult <object> ParseMethod(string exprString, IFunctions <string> functions = null) { var parseResult = CSharpParser(functions).Parse(exprString); if (!parseResult.Success) { return(new ParseResult <object>(parseResult.ParseErrors)); } var expr = parseResult.Expression; var csharpExpr = expr.Evaluate(new CSharpObjectContext(ConcatStringMonad.Instance, Constants.DefaultContext)); var(type, emitResult) = CodeGenCSharpClass.Generate("VcelTesting", csharpExpr); if (type == null) { return(new ParseResult <object>(emitResult.Diagnostics.Select( x => new ParseError( x.GetMessage(), x.Id, x.Location.GetLineSpan().StartLinePosition.Line, x.Location.GetLineSpan().StartLinePosition.Line, x.Location.GetLineSpan().EndLinePosition.Line)).ToList())); } var method = type.GetMethod("Evaluate"); return(new ParseResult <object>(new CSharpMethodExpr(null, method))); }