anchor.diff:        }
       }
       changes += innerPlan._getChanges(parensNeeded);
  +    // Note: we use innerPlan.sourceNode.end here instead of innerPlan.end,
  +    // because what we care about is the input grammar, so we don't want to be
  +    // fooled by any whitespace or comments included in the innerPlan.
       if (endsInCascade == null && innerPlan.sourceNode.end == node.end) {
         endsInCascade = !parensNeeded && innerPlan.endsInCascade;
       }
  
positive.code: 
    NodeProducingEditPlan._(this.sourceNode) : super._();
  
    /// If the result of executing this [EditPlan] will be an expression,
    /// indicates whether the expression will end in an unparenthesized cascade.
    @visibleForTesting
    bool get endsInCascade;
  
    @override
    AstNode get parentNode => sourceNode.parent;
  
negative.code:     // Extract the inner expression.
      // TODO(paulberry): don't remove comments
      changes = _removeCode(
              offset,
              innerPlan.offset,
              _planner.removeViaComments
                  ? _RemovalStyle.commentSpace
                  : _RemovalStyle.delete,
              _infoBefore) +
          changes +
          _removeCode(
              innerPlan.end,
              end,
              _planner.removeViaComments
                  ? _RemovalStyle.spaceComment
                  : _RemovalStyle.delete,
  