private static ParameterExpression[] CreateParametersForMethod(MethodNode parseTree) { ParameterExpression[] args = new ParameterExpression[parseTree.Arguments.Count + 2]; Dictionary <string, ParameterExpression> argsMap = new Dictionary <string, ParameterExpression>(); string name = MethodCompiler.GetUniqueName(argsMap, "self"); ParameterExpression param = Expression.Parameter(typeof(object), name); // All our args are Object argsMap.Add(name, param); args[0] = param; for (int i = 0; i < parseTree.Arguments.Count; i++) { MethodArgumentNode arg = parseTree.Arguments[i]; name = MethodCompiler.GetUniqueName(argsMap, arg.Token.Value); param = Expression.Parameter(typeof(object), name); // All our args are Object argsMap.Add(name, param); args[i + 2] = param; } // Those are not used by code, and we define them last, just in case there are naming conflicts - the name of those is unimportant. name = MethodCompiler.GetUniqueName(argsMap, "$executionContext"); param = Expression.Parameter(typeof(ExecutionContext), name); argsMap.Add(name, param); args[1] = param; return(args); }
/// <summary> /// Visits the Method Argument node. /// </summary> /// <param name="node">The node to visit.</param> public override bool VisitMethodArgument(MethodArgumentNode node) { if (node.Parent == null) { return(false); } if (node.Token == null) { return(false); } return(true); }
/// <summary> /// Visits the Method Argument node. /// </summary> /// <param name="node">The node to visit.</param> public virtual TResult VisitMethodArgument(MethodArgumentNode node) { throw new NotImplementedException(); }
/// <summary> /// Visits the Method Argument node. /// </summary> /// <param name="node">The node to visit.</param> public virtual TResult VisitMethodArgument(MethodArgumentNode node) { return(default(TResult)); // The default naive implementation }