private StatementSyntax GenerateParantIfs(AutoSelectedWith autoSelectedWith, StatementSyntax blockStatement, int parentDepth) { var generatedIf = Statement.Selection.If(GetBinaryExpression(autoSelectedWith, true, parentDepth), BodyGenerator.Create(blockStatement)); if (autoSelectedWith.Parent != null) { return(GenerateParantIfs(autoSelectedWith.Parent, generatedIf, parentDepth + 1)); } return(generatedIf); }
private IBinaryExpression GetBinaryExpression(AutoSelectedWith autoSelected, bool isParent, int parentDepth) { var binaryExpressions = new List <ConditionalBinaryExpression>(); foreach (var attributeTagse in autoSelected.Withs) { VariableReference leftReference; if (isParent) { var name = new StringBuilder(); for (int n = 0; n < parentDepth; n++) { name.Append("Parent?."); } name = name.Remove(name.Length - 1, 1); leftReference = new VariableReference( "n", new MemberReference(name.ToString(), new MemberReference(Enum.GetName(typeof(AttributeTags), attributeTagse)))); } else { leftReference = new VariableReference("n", new MemberReference(Enum.GetName(typeof(AttributeTags), attributeTagse))); } binaryExpressions.Add(new ConditionalBinaryExpression( leftReference, new ConstantReference(GetNodeValue(autoSelected.Node, attributeTagse)), ConditionalStatements.Equal)); } IBinaryExpression finalBinaryExpression; if (binaryExpressions.Count > 1) { finalBinaryExpression = new AndBinaryExpression(binaryExpressions.First(), binaryExpressions.Last()); } else { finalBinaryExpression = binaryExpressions.First(); } return(finalBinaryExpression); }
private IEnumerable <IArgument> GenerateAutoSelectedWiths(AutoSelectedWith autoSelected) { // If it's only one parent create a simple lambda expression without block if (autoSelected.Parent.Parent == null) { return(new List <IArgument> { new LambdaArgument( new AndBinaryExpression( GetBinaryExpression(autoSelected.Parent, true, 1), GetBinaryExpression(autoSelected, false, 0)).GetBinaryExpression(), "n") }); } var generatedIf = Statement.Selection.If( GetBinaryExpression(autoSelected, false, 0), BodyGenerator.Create(Statement.Jump.ReturnTrue())); return(new List <IArgument> { new LambdaArgument(BodyGenerator.Create(GenerateParantIfs(autoSelected.Parent, generatedIf, 1), Statement.Jump.ReturnFalse()), "n") }); }