public Node VisitExpression(IronPython.Compiler.Ast.ConstantExpression node) { var changed = false; Node newCode = node; foreach (var edit in _edits) { if (edit.CanApply(node)) { changed = true; if (edit is Update) { newCode = edit.ModifiedNode.InnerNode; } else if (edit is Insert) { throw new NotImplementedException(); } else { throw new NotImplementedException(); } } } if (changed) { return(newCode); } return(node); }
public Node VisitExpression(IronPython.Compiler.Ast.BinaryExpression node) { var changed = false; Node newCode = node; foreach (var edit in _edits) { if (edit.CanApply(node)) { changed = true; if (edit is Update) { newCode = edit.ModifiedNode.InnerNode; } else if (edit is Delete) { var deleted = new IronPython.Compiler.Ast.ConstantExpression("Tutor:deletedNode"); if (edit.ModifiedNode.InnerNode.Equals(node.Left)) { var binary = newCode as IronPython.Compiler.Ast.BinaryExpression; newCode = new IronPython.Compiler.Ast.BinaryExpression(binary.Operator, VisitExpression(binary.Right), deleted); } else { var binary = newCode as IronPython.Compiler.Ast.BinaryExpression; newCode = new IronPython.Compiler.Ast.BinaryExpression(binary.Operator, VisitExpression(binary.Left), deleted); } } else { switch (((Insert)edit).Index) { case 0: var binary = newCode as IronPython.Compiler.Ast.BinaryExpression; newCode = new IronPython.Compiler.Ast.BinaryExpression(binary.Operator, (IronPython.Compiler.Ast.Expression)edit.ModifiedNode.InnerNode, VisitExpression(binary.Right)); break; case 1: binary = newCode as IronPython.Compiler.Ast.BinaryExpression; newCode = new IronPython.Compiler.Ast.BinaryExpression(binary.Operator, VisitExpression(binary.Left), (IronPython.Compiler.Ast.Expression)edit.ModifiedNode.InnerNode); break; } } } } if (changed) { return(newCode); } var left = VisitExpression(node.Left); var right = VisitExpression(node.Right); return(new IronPython.Compiler.Ast.BinaryExpression(node.Operator, left, right)); }