anchor.diff:      return result;
     }
   
  +  /// Flattens the [TextSpan] tree into a single string.
  +  ///
  +  /// Styles are not honored in this process.
     String toPlainText() {
       assert(debugAssertValid());
       StringBuffer buffer = new StringBuffer();
  
positive.code:     return buffer.toString();
    }
  
    bool debugAssertValid() {
      assert(() {
        if (!visitTextSpan((TextSpan span) {
  
negative.code:     this.recognizer
    });
  
    /// The style to apply to the [text] and the [children].
    final TextStyle style;
  
    /// The text contained in the span.
    ///
    /// If both [text] and [children] are non-null, the text will preceed the
    /// children.
    final String text;
  
    /// Additional spans to include as children.
    ///
    /// If both [text] and [children] are non-null, the text will preceed the
    /// children.
    ///
    /// Modifying the list after the [TextSpan] has been created is not
    /// supported and may have unexpected results.
    ///
    /// The list must not contain any nulls.
    final List<TextSpan> children;
  
    /// A gesture recognizer that will receive events that hit this text span.
    ///
    /// [TextSpan] itself does not implement hit testing or event
    /// dispatch. The owner of the [TextSpan] tree to which the object
    /// belongs is responsible for dispatching events.
    ///
    /// For an example, see [RenderParagraph] in the Flutter rendering library.
    final GestureRecognizer recognizer;
  
    /// Apply the [style], [text], and [children] of this object to the
    /// given [ParagraphBuilder], from which a [Paragraph] can be obtained.
    /// [Paragraph] objects can be drawn on [Canvas] objects.
    ///
    /// Rather than using this directly, it's simpler to use the
    /// [TextPainter] class to paint [TextSpan] objects onto [Canvas]
    /// objects.
    void build(ui.ParagraphBuilder builder) {
      assert(debugAssertValid());
      final bool hasStyle = style != null;
  