protected override void PostWalk(ConditionalExpression node) { base.PostWalk(node); if (node.Test is MethodCallExpression) { var mce = (MethodCallExpression)node.Test; if (mce.Method == typeof(IronScheme.Runtime.Builtins).GetMethod("IsTrue")) { if (mce.Arguments[0].Type == typeof(bool)) { node.Test = mce.Arguments[0]; } } } }
protected override void PostWalk(ConditionalExpression node) { base.PostWalk(node); if (node.Test is UnaryExpression && node.Test.NodeType == AstNodeType.Not) { var tmp = node.IfFalse; node.IfFalse = node.IfTrue; node.IfTrue = tmp; var ue = node.Test as UnaryExpression; node.Test = ue.Operand; } var truetype = node.IfTrue.Type; var falsetype = node.IfFalse.Type; // the type gets fixed later in removeuseless conversions if (truetype != falsetype && (truetype.IsValueType || falsetype.IsValueType)) { if (node.IfTrue is UnaryExpression && node.IfTrue.NodeType == AstNodeType.Convert) { var ue = (UnaryExpression)node.IfTrue; if (ue.Operand.Type == falsetype) { node.IfTrue = ue.Operand; node.SetType(falsetype); return; } } if (node.IfFalse is UnaryExpression && node.IfFalse.NodeType == AstNodeType.Convert) { var ue = (UnaryExpression)node.IfFalse; if (ue.Operand.Type == truetype) { node.IfFalse = ue.Operand; node.SetType(truetype); return; } } } }
// ConditionalExpression private void DefaultWalk(ConditionalExpression node) { if (Walk(node)) { WalkNode(node.Test); WalkNode(node.IfTrue); WalkNode(node.IfFalse); } PostWalk(node); }