コード例 #1
0
        protected override IElement VisitIfThen(IfThenElement ifThen)
        {
            ifThen = (IfThenElement)base.VisitIfThen(ifThen);
            if (ifThen.Else.Count > 0)
            {
                return(ifThen);
            }

            if (ifThen.Then.Count > 1)
            {
                return(ifThen);
            }

            var thenAsIf = ifThen.Then[0] as IfThenElement;

            if (thenAsIf == null)
            {
                return(ifThen);
            }

            return(new IfThenElement(
                       Expression.AndAlso(ifThen.Condition, thenAsIf.Condition),
                       thenAsIf.Then, thenAsIf.Else
                       ));
        }
コード例 #2
0
        private static void TryInlineIfThenReturnFollowedByReturn(IfThenElement ifThen, IList <IElement> elements, int index)
        {
            if (index == elements.Count - 1)
            {
                return;
            }

            if (ifThen.Then.Count != 1 || ifThen.Else.Count > 0)
            {
                return;
            }

            var returnInIf    = ifThen.Then.Single() as ReturnElement;
            var returnAfterIf = elements[index + 1] as ReturnElement;

            if (returnInIf == null || returnAfterIf == null)
            {
                return;
            }

            if (returnInIf.Result == null || returnAfterIf.Result == null)
            {
                return;
            }

            elements[index] = new ReturnElement(Expression.Condition(
                                                    ifThen.Condition,
                                                    returnInIf.Result,
                                                    returnAfterIf.Result
                                                    ));

            elements.RemoveAt(index + 1);
        }
コード例 #3
0
        protected override IElement VisitIfThen(IfThenElement ifThen)
        {
            ifThen = (IfThenElement)base.VisitIfThen(ifThen);

            var cachingField = (FieldInfo)null;

            return(Matcher
                   .For(ifThen.Condition)
                   .OneOf(ExpressionType.Equal)
                   .AsBinary()
                   .LeftAndRight(
                       leftOrRight => leftOrRight.AsPropertyOrField().Field()
                       .Match(IsLambdaCachingField)
                       .AssignTo(out cachingField),

                       leftOrRight => leftOrRight.AsConstant().ValueIsNull()
                       )

                   .For(ifThen.Then)
                   .Count(1)
                   .For(list => list.Single()).As <MemberAssignmentElement>()
                   .Match(a => a.Member == cachingField)
                   .Do(a => collectedFieldValues.Add((FieldInfo)a.Member, a.Value))

                   .For(ifThen.Else).Count(0)

                   .IfMatched(() => null, ifThen));
        }
コード例 #4
0
        private bool TryExtractElseIfThenEndsWithReturn(IfThenElement ifThen, IList <IElement> elements, int index)
        {
            if (ifThen.Else.Count == 0 || !(ifThen.Then.Last() is ReturnElement))
            {
                return(false);
            }

            elements.InsertRange(index + 1, ifThen.Else);
            ifThen.Else.Clear();
            return(true);
        }
コード例 #5
0
        protected override IElement VisitIfThen(IfThenElement ifThen)
        {
            ifThen = (IfThenElement)base.VisitIfThen(ifThen);
            if (ifThen.Then.Count != 1 || ifThen.Else.Count != 1)
            {
                return(ifThen);
            }

            var thenAssignment = ifThen.Then[0] as VariableAssignmentElement;
            var elseAssignment = ifThen.Else[0] as VariableAssignmentElement;

            if (thenAssignment == null || elseAssignment == null || thenAssignment.VariableIndex != elseAssignment.VariableIndex)
            {
                return(ifThen);
            }

            return(new VariableAssignmentElement(thenAssignment.VariableIndex, Expression.Condition(
                                                     ifThen.Condition, thenAssignment.Value, elseAssignment.Value
                                                     )));
        }