Subject: bug#73041: 30.0.90; track-changes-mode logs warnings (#70541 regression? not actually fixed?)

From: Morgan Willcock <[email-masked]>
Date: Wed, 29 Jan 2025 18:31:25 +0000

Stefan Monnier <[email-masked]> writes:

>> I haven't figured out a way to reproduce it yet, but I've set
>> track-changes-record-errors to 'trace to try and get more information
>> the next time that it occurs.
>
> Thanks.  Send us the contents of `track-changes--error-log` (but note
> that it can contain sensitive information) next time it occurs.

I encountered the issue again while doing a query-replace in a buffer
narrowed to a single function, after moving to the beginning of the
buffer.

Here is the relevant part of my messages buffer:

  Beginning of buffer
  track-changes--after: Assertion failed: (or track-changes--before-no (<= track-changes--before-beg (track-changes--state-beg track-changes--state) beg end (track-changes--state-end track-changes--state) track-changes--before-end))
  Mark set
  track-changes-fetch: Assertion failed: (not (memq id track-changes--clean-trackers))
  Undo
  Saving file /home/mwillcock/path/to/file/UserChooser.php...
  Use C-x 4 s to update shadows.
  Wrote /home/mwillcock/path/to/file/UserChooser.php
  track-changes-fetch: Assertion failed: (not (memq id track-changes--clean-trackers))

The undo was because I had tried to answer "y" to the next replacement,
but I imagine that the track-changes error had exited the query-replace
process because the "y" was inserted into the buffer.

Here is the value of track-changes--error-log:

  (("UserChooser.php" #1=(buffer-size 3999 4001)
    ((t track-changes--recover-from-error (#1#) nil)
     (t track-changes-fetch
        (#2=
         #s(track-changes--tracker :signal eglot--track-changes-signal
                                   :state
                                   #s(track-changes--state :beg 1156
                                                           :end 1858
                                                           :before error
                                                           :next nil)
                                   :nobefore nil :immediate nil)
         #<subr F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_135>)
        nil)
     (t eglot--track-changes-fetch (#2#) nil)
     (t eglot--track-changes-signal (#2# 112) nil)
     (t track-changes--before (1292 1298) nil)
     (t replace-match-maybe-edit
        (#3="is_null" nil t nil (1292 1298 #<buffer UserChooser.php>)
            nil)
        nil)
     (t perform-replace
        (#4="!isset" #3# t nil nil nil nil nil nil nil nil) nil)
     (t query-replace (#4# #3# nil nil nil nil nil) nil)
     (t funcall-interactively
        (query-replace #4# #3# nil nil nil nil nil) nil)
     (t command-execute (query-replace) nil))
    [110 (nil . self-insert-command) 117 (nil . self-insert-command) 108
         (nil . self-insert-command) 108 (nil . self-insert-command) 108
         (nil . self-insert-command) backspace
         (nil . c-electric-backspace) 59 (nil . c-electric-semi&comma)
         134217765 (nil . query-replace) return (nil . exit-minibuffer)
         121 121]))

If it is relevant, I have also seen this being logged by Eglot in a
previous Emacs session:

  [eglot] Server reports (type=2): Diagnostic provider "php" errored with "Col number cannot be less than 1 (got "0")", removing from pool

The Eglot version is 1.18.
The LSP server is Phpactor version "2024.11.28.1".
The major-mode is php-ts-mode, as supplied with Emacs 30.0.93.

-- 
Morgan Willcock