anchor.diff:      return node;
     }
   
  -  visitTopLevelVariableDeclaration(ast.TopLevelVariableDeclaration node) {
  -    return node;
  -  }
  -
  -  visitFunctionDeclaration(ast.FunctionDeclaration node) {
  -    return new ast.FunctionDeclaration(
  -        node.documentationComment,
  -        node.metadata,
  -        node.externalKeyword,
  -        node.returnType,
  -        node.propertyKeyword,
  -        node.name,
  -        new ast.FunctionExpression(
  -            node.functionExpression.parameters,
  -            visit(node.functionExpression.body)));
  -  }
  -
  +  // ---- FunctionBodies ----
     visitBlockFunctionBody(ast.BlockFunctionBody node) {
  -    if (node.keyword == null) return node;
  -    if (node.star != null) {
  -      throw 'TODO(${node.keyword}${node.star})';
  -    }
  +    if (node.isSynchronous || node.isGenerator) return node;
  +
       counter = 0;
       currentBlock = emptyBlock();
       breakTargets = <ast.Expression>[];
       continueTargets = <ast.Expression>[];
  -    var result = newName('result');
  +    var result = newName('completer');
       visit(node.block)((e) {
         addStatement(methodInvocation(result, 'completeError', [e]));
       }, (v) {
  
positive.code:         node.endToken);
    }
  
    visitClassDeclaration(ast.ClassDeclaration node) {
      return new ast.ClassDeclaration(
          node.documentationComment,
  
negative.code:   bool visit(ast.AstNode node) => node.accept(this);
  
    bool visitNode(ast.AstNode node) {
      throw 'Unimplemented(${node.runtimeType})';
    }
  
    bool visitCompilationUnit(ast.CompilationUnit node) {
  