///////////////////////////////////////////////////////////////////////////////// public static Expression Rewrite(ExprBinOp binOp, Expression[] listOfParameters) { ExpressionTreeCallRewriter rewriter = new ExpressionTreeCallRewriter(listOfParameters); // We should have a ExprBinOp that's an EK_SEQUENCE. The RHS of our sequence // should be a call to PM_EXPRESSION_LAMBDA. The LHS of our sequence is the // set of declarations for the parameters that we'll need. // Assert all of these first, and then unwrap them. Debug.Assert(binOp != null); Debug.Assert(binOp.Kind == ExpressionKind.Sequence); Debug.Assert(binOp.OptionalRightChild is ExprCall); Debug.Assert(((ExprCall)binOp.OptionalRightChild).PredefinedMethod == PREDEFMETH.PM_EXPRESSION_LAMBDA); Debug.Assert(binOp.OptionalLeftChild != null); // Visit the left to generate the parameter construction. rewriter.Visit(binOp.OptionalLeftChild); ExprCall call = (ExprCall)binOp.OptionalRightChild; ExpressionExpr e = rewriter.Visit(call) as ExpressionExpr; return(e.Expression); }
///////////////////////////////////////////////////////////////////////////////// public static Expression Rewrite(TypeManager typeManager, EXPR pExpr, IEnumerable<Expression> listOfParameters) { ExpressionTreeCallRewriter rewriter = new ExpressionTreeCallRewriter(typeManager, listOfParameters); // We should have a EXPRBINOP thats an EK_SEQUENCE. The RHS of our sequence // should be a call to PM_EXPRESSION_LAMBDA. The LHS of our sequence is the // set of declarations for the parameters that we'll need. // Assert all of these first, and then unwrap them. Debug.Assert(pExpr != null); Debug.Assert(pExpr.isBIN()); Debug.Assert(pExpr.kind == ExpressionKind.EK_SEQUENCE); Debug.Assert(pExpr.asBIN().GetOptionalRightChild() != null); Debug.Assert(pExpr.asBIN().GetOptionalRightChild().isCALL()); Debug.Assert(pExpr.asBIN().GetOptionalRightChild().asCALL().PredefinedMethod == PREDEFMETH.PM_EXPRESSION_LAMBDA); Debug.Assert(pExpr.asBIN().GetOptionalLeftChild() != null); // Visit the left to generate the parameter construction. rewriter.Visit(pExpr.asBIN().GetOptionalLeftChild()); EXPRCALL call = pExpr.asBIN().GetOptionalRightChild().asCALL(); ExpressionEXPR e = rewriter.Visit(call) as ExpressionEXPR; return e.Expression; }