anchor.diff:        if (scriptSource.length < 500000) {
           final highlighted = script.highlighter.highlight(context);
   
  -        // Look for [TextSpan]s which only contain '\n' to manually break the
  +        // Look for [InlineSpan]s which only contain '\n' to manually break the
           // output from the syntax highlighter into individual lines.
  -        var currentLine = <TextSpan>[];
  +        var currentLine = <InlineSpan>[];
           highlighted.visitChildren((span) {
  -          // TODO(elliette): Switch to using TextSpans instead of InlineSpans so
  -          // type-casting isn't necessary.
  -          currentLine.add(span as TextSpan);
  +          currentLine.add(span);
             if (span.toPlainText() == '\n') {
               lines.add(
                 TextSpan(
  
positive.code:     return contentsWithMatch;
    }
  
    List<TextSpan>? _activeSearchAwareLineContents(
      List<TextSpan> startingContents,
    ) {
      final activeSearchMatch = widget.activeSearchMatch;
      if (activeSearchMatch == null) return startingContents;
  
negative.code:   }
  
    TextSpan searchAwareLineContents() {
      final children = widget.lineContents.children;
      if (children == null) return const TextSpan();
  
      final activeSearchAwareContents = _activeSearchAwareLineContents(children);
  