public LambdaExpression Resolve(out ParsedLambda parsedLambda) { var body = ((LambdaExpression)Visit(this.parsedLambda.Lambda)).Body; if (this.parsedLambda.ClosureParameter != null) { body = Expression.Block(new[] { this.parsedLambda.ClosureParameter }, closureBuilder.Init(this.parsedLambda.ClosureParameter), body); } var parameters = (this.parsedLambda.ConstantsParameter == null ? this.parsedLambda.Lambda.Parameters : new[] { this.parsedLambda.ConstantsParameter }.Concat(this.parsedLambda.Lambda.Parameters)).ToArray(); var delegateType = Extensions.GetDelegateType(parameters.Select(parameter => parameter.Type).ToArray(), this.parsedLambda.Lambda.ReturnType); parsedLambda = new ParsedLambda { ClosureBuilder = closureBuilder, ClosureType = this.parsedLambda.ClosureType, ClosureParameter = this.parsedLambda.ClosureParameter, ConstantsBuilder = constantsBuilder, ConstantsType = this.parsedLambda.ConstantsType, ConstantsParameter = this.parsedLambda.ConstantsParameter, DelegatesFieldId = this.parsedLambda.DelegatesFieldId, Constants = this.parsedLambda.Constants, ParsedConstants = this.parsedLambda.ParsedConstants, ParsedParameters = this.parsedLambda.ParsedParameters, ParsedSwitches = this.parsedLambda.ParsedSwitches }; return(Expression.Lambda(delegateType, body, this.parsedLambda.Lambda.Name, this.parsedLambda.Lambda.TailCall, parameters)); }
public void MergeAsNew_SameSourcesOfNodes_ReturnsMerged() { var nodesOne = new INode[] { new TestNode(1), new TestNode(2) }; var parsedLambdaOne = new ParsedLambda(nodesOne); var parsedLambdaTwo = new ParsedLambda(nodesOne); var mergedParsedLambda = parsedLambdaOne.MergeAsNew(parsedLambdaTwo); CollectionAssert.AreEquivalent(nodesOne, mergedParsedLambda.Nodes); }
public void MergeAsNew_TwoDifferentSourcesOfDifferentNodes_ReturnsMerged() { var nodesOne = new INode[] { new TestNode(1) }; var nodesTwo = new INode[] { new TestNode(1) }; var parsedLambdaOne = new ParsedLambda(nodesOne); var parsedLambdaTwo = new ParsedLambda(nodesTwo); var mergedParsedLambda = parsedLambdaOne.MergeAsNew(parsedLambdaTwo); CollectionAssert.AreEquivalent(nodesOne.Union(nodesTwo), mergedParsedLambda.Nodes); }