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;
                      }
                    }
                      }
                }
Пример #3
0
 // ConditionalExpression
 private void DefaultWalk(ConditionalExpression node)
 {
     if (Walk(node)) {
         WalkNode(node.Test);
         WalkNode(node.IfTrue);
         WalkNode(node.IfFalse);
     }
     PostWalk(node);
 }