internal static Expression ToExpression(string templateName, JinjaEnvironment environment, ASTNode node, out NewASTCompiler compiler, CompiledScope rootScope) { compiler = new NewASTCompiler(environment, rootScope); compiler.PushScope(SCOPE_NAME_INTERNAL); var internalVariableAssignments = new Expression[] { CreateVariable(compiler, VARNAME_STRING_BUILDER, Expression.New(typeof(StringBuilder))), CreateVariable(compiler, VARNAME_STRING_SELF, Expression.New(typeof(CompiledSelf))) }; compiler.PushScope(string.Format(CultureInfo.InvariantCulture, SCOPE_NAME_TEMPLATE, templateName)); var compiledNodes = node.Transform(compiler); var contentBlock = compiler.PopScope(string.Format(CultureInfo.InvariantCulture, SCOPE_NAME_TEMPLATE, templateName), compiledNodes); var toString = ExpressionEx.Object.ToStringEx(compiler.StringBuilderVar); var internalContent = internalVariableAssignments .Concat(contentBlock) .Concat(toString); var internalBlock = compiler.PopScope(SCOPE_NAME_INTERNAL, internalContent); return(internalBlock);
static BinaryExpression CreateVariable(NewASTCompiler localCompiler, string name, Expression createExpression) { localCompiler.CurrentScope.DefineAndSetVariable(name, createExpression, out var assignExpression); return(assignExpression); }