anchor.diff:        : super(inner);
   
     @override
  -  EditPlan apply(AstNode node, EditPlan Function(AstNode) gather) {
  -    var innerPlan = _inner.apply(node, gather);
  +  EditPlan apply(AstNode node, FixAggregator aggregator) {
  +    var innerPlan = _inner.apply(node, aggregator);
       return EditPlan.surround(innerPlan,
           suffix: [InsertText(' as $type')],
           outerPrecedence: Precedence.relational,
  
positive.code:   const NodeChange();
  
    /// Applies this change to the given [node], producing an [EditPlan].  The
    /// [gather] callback is used to gather up any edits to the node's descendants
    /// into their own [EditPlan].
    ///
    /// Note: the reason the caller can't just gather up the edits and pass them
    /// in is that some changes don't preserve all of the structure of the nodes
    /// below them (e.g. dropping an unnecessary cast), so those changes need to
    /// be able to call [gather] just on the nodes they need.
    /// TODO(paulberry): can we just do the gather prior to the call?
    EditPlan apply(AstNode node, EditPlan Function(AstNode) gather);
  }
  
  /// Implementation of [NodeChange] representing the addition of a null check to
  
negative.code:   const MakeNullable([NodeChange inner = const NoChange()]) : super(inner);
  
    @override
    EditPlan apply(AstNode node, FixAggregator aggregator) {
      var innerPlan = _inner.apply(node, aggregator);
      return EditPlan.surround(innerPlan, suffix: [const InsertText('?')]);
    }
  }
  