private CodeExpression RewriteLambdaExpression(CodeLambdaExpression lambdaExpression, ref bool didRewrite) { // This is a workaround for CodeDomTreeRewriter which does not handle CodeLambdaExpression in the case when // expressions further down the tree have been rewritten. (the lambda is rewritten as an empty CodeObject). var body = this.Rewrite(lambdaExpression.Body, ref didRewrite); if (didRewrite) { var parameters = lambdaExpression.Parameters.Cast<CodeParameterDeclarationExpression>().Select(e => e.Name).ToArray(); var result = new CodeLambdaExpression().WithParameters(parameters).WithBody(body); return result; } return lambdaExpression; }
/// <summary> /// Rewrites the lambda expression. /// </summary> /// <param name="lambdaExpression">The lambda expression to rewrite.</param> /// <returns>Expression rewritten as code snippet</returns> private CodeSnippetExpression RewriteLambdaExpression(CodeLambdaExpression lambdaExpression) { using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) { if (lambdaExpression.Parameters.Count == 1 && lambdaExpression.Parameters[0].Type is CodeImplicitTypeReference) { sw.Write(this.generator.CreateEscapedIdentifier(lambdaExpression.Parameters[0].Name)); } else { sw.Write("("); string separator = string.Empty; foreach (CodeParameterDeclarationExpression cpde in lambdaExpression.Parameters) { sw.Write(separator); separator = ", "; if (!(cpde.Type is CodeImplicitTypeReference)) { this.generator.GenerateCodeFromExpression(cpde, sw, null); } else { sw.Write(this.generator.CreateEscapedIdentifier(cpde.Name)); } } sw.Write(")"); } sw.Write(" => "); bool didRewrite = false; if (lambdaExpression.BodyStatements.Count > 0) { sw.WriteLine(); this.WriteIndentation(sw); sw.WriteLine("{"); this.nestingLevel++; foreach (CodeStatement stat in lambdaExpression.BodyStatements) { this.WriteIndentation(sw); this.generator.GenerateCodeFromStatement(this.Rewrite(stat, ref didRewrite), sw, null); } this.nestingLevel--; this.WriteIndentation(sw); sw.Write("}"); didRewrite = true; } else { this.generator.GenerateCodeFromExpression(this.Rewrite(lambdaExpression.Body, ref didRewrite), sw, null); } return new CodeSnippetExpression(sw.ToString()); } }
/// <summary> /// Begins the new scope which will add statements to given lambda body. /// </summary> /// <param name="lambda">The lambda.</param> public override void BeginLambda(CodeLambdaExpression lambda) { this.blockStack.Push(this.currentBlock); this.currentBlock = new BlockInformation(null, BlockType.Lambda, lambda.BodyStatements, false); }