コード例 #1
0
            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;
            }
コード例 #2
0
            /// <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());
                }
            }
コード例 #3
0
 /// <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);
 }