public override LambdaExpression CompileExpression(ExpressionToCompile expressionToCompile) { var options = ScriptOptions.Default .AddReferences(MetadataReferences) .AddImports(expressionToCompile.ImportedNamespaces); var untypedExpressionScript = Create(expressionToCompile.Code, options); var compilation = untypedExpressionScript.GetCompilation(); var syntaxTree = compilation.SyntaxTrees.First(); var identifiers = GetIdentifiers(syntaxTree); var resolvedIdentifiers = identifiers .Select(name => (Name: name, Type: expressionToCompile.VariableTypeGetter(name))) .Where(var => var.Type != null) .ToArray(); const string Comma = ", "; var names = string.Join(Comma, resolvedIdentifiers.Select(var => var.Name)); var types = string.Join(Comma, resolvedIdentifiers .Select(var => var.Type) .Concat(new[] { expressionToCompile.LambdaReturnType }) .Select(GetTypeName)); var finalCompilation = compilation.ReplaceSyntaxTree(syntaxTree, syntaxTree.WithChangedText(SourceText.From( CreateExpressionCode(types, names, expressionToCompile.Code)))); var results = ScriptingAotCompiler.BuildAssembly(finalCompilation); if (results.HasErrors) { throw FxTrace.Exception.AsError(new SourceExpressionException(SR.CompilerErrorSpecificExpression(expressionToCompile.Code, results), results.CompilerMessages)); } return((LambdaExpression)results.ResultType.GetMethod("CreateExpression").Invoke(null, null)); }
public abstract LambdaExpression CompileExpression(ExpressionToCompile compilerRequest);