Beispiel #1
0
        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));
        }
Beispiel #2
0
 public abstract LambdaExpression CompileExpression(ExpressionToCompile compilerRequest);