anchor.diff:      return visit(node.target)(ek, (expr) {
         return sk(make.propertyAccess(expr, node.propertyName));
       });
  +  };
  +
  +  // `rethrow` is not an expression but a statement in Dart.  The analyzer
  +  // however parses it as an expression inside an expression statement.
  +  visitRethrowExpression(ast.RethrowExpression node) => (ek, sk) {
  +    assert(currentExceptionName != null);
  +    return sk(make.throwExpression(make.identifier(currentExceptionName)));
     };
   
     visitSuperExpression(ast.SuperExpression node) => (ek, sk) {
  
positive.code:   List<JumpTarget> breakTargets;
    List<JumpTarget> continueTargets;
  
    visit(ast.AstNode node) => node.accept(this);
  
    Map<String, int> nameCounters;
  
negative.code:       // names.  Otherwise, choose fresh names to avoid shadowing anything.
        if (clauses.length == 1) {
          var only = clauses.first;
          exceptionName = currentExceptionName = only.exceptionParameter.name;
          stackTraceName = only.stackTraceParameter == null
              ? newName('s')
              : only.stackTraceParameter.name;
        } else {
          exceptionName = currentExceptionName = newName('e');
          stackTraceName = newName('s');
        }
        // Build a chain of if/else statements nested in the else blocks.
  