Subject: Re: bug#24585: 25.1; avoid hack in ggtags.el to run compilation-auto-jump timer

From: Lars Ingebrigtsen <[email-masked]>
Date: Fri, 04 Sep 2020 14:47:03 +0200

Leo Liu <[email-masked]> writes:

> On 2016-10-07 14:10 -0400, Stefan Monnier wrote:
>> Hmm... calling compilation--ensure-parse *should* help.
>> More specifically, if you call compilation--ensure-parse up to point-max
>> from compilation-finish-functions, I can't think of any reason why
>> compilation-error-properties should be called afterwards.  If you can
>> get a backtrace of when that happens, it would help.
>>
>> E.g. set a buffer-local var from compilation-finish-functions after
>> calling compilation--ensure-parse, and then add an assert in
>> compilation-error-properties to check that that var is not set yes.
>
> To the best of my knowledge that seems to work with change like this to
> compile.el:

[...]

This was the final message in this bug report, but looking at the patch
that supposedly fixes the problem, I don't understand how it makes a
difference: Putting (match-beginning) in a buffer-local variable
instead of passing it in directly seems like a no-op?

Checking whether the buffer is alive in compilation-auto-jump seems like
a good idea, though (any async function that switches to a buffer should
check whether it's alive first).

> -(defun compilation-auto-jump (buffer pos)
> -  (with-current-buffer buffer
> -    (goto-char pos)
> -    (let ((win (get-buffer-window buffer 0)))
> -      (if win (set-window-point win pos)))
> -    (if compilation-auto-jump-to-first-error
> -	(compile-goto-error))))
> +(defvar-local compilation-pending-auto-jump nil)
> +
> +(defun compilation-auto-jump (buffer)
> +  (when (buffer-live-p buffer)
> +    (with-current-buffer buffer
> +      (when compilation-pending-auto-jump
> +        (goto-char compilation-pending-auto-jump)
> +        (let ((win (get-buffer-window buffer 0)))
> +          (if win (set-window-point win compilation-pending-auto-jump)))
> +        (setq compilation-pending-auto-jump nil)
> +        (if compilation-auto-jump-to-first-error
> +            (compile-goto-error))))))
>
>  ;; This function is the central driver, called when font-locking to gather
>  ;; all information needed to later jump to corresponding source code.
> @@ -1126,8 +1131,8 @@ POS and RES.")
>      (when (and compilation-auto-jump-to-next
>                 (>= type compilation-skip-threshold))
>        (kill-local-variable 'compilation-auto-jump-to-next)
> -      (run-with-timer 0 nil 'compilation-auto-jump
> -                      (current-buffer) (match-beginning 0)))
> +      (setq compilation-pending-auto-jump (match-beginning 0))
> +      (run-with-timer 0 nil 'compilation-auto-jump (current-buffer)))
>
>      (compilation-internal-error-properties
>       file line end-line col end-col type fmt)))

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no