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 )); }
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); }
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)); }
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); }
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 ))); }