Пример #1
0
        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);
        }