Subject: bug#65578: Eglot with mouse

From: Dmitry Gutov <[email-masked]>
Date: Mon, 28 Aug 2023 20:00:12 +0300

On 28/08/2023 19:42, Juri Linkov wrote:
>>> xref-find-definitions-at-mouse uses save-excursion with
>>> mouse-set-point before calling xref-backend-identifier-at-point.
>>> But the same save-excursion with mouse-set-point can't be added
>>> around xref-find-definitions because save-excursion will restore
>>> the original position after visiting the found identifier.
>> Could we do that without additional save-excursion?
>>
>> diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
>> index 0666b18cba1..0c3e34fe0a5 100644
>> --- a/lisp/progmodes/xref.el
>> +++ b/lisp/progmodes/xref.el
>> @@ -1637,7 +1637,9 @@ xref-find-definitions-at-mouse
>>              (mouse-set-point event)
>>              (xref-backend-identifier-at-point (xref-find-backend)))))
>>       (if identifier
>> -        (xref-find-definitions identifier)
>> +        (progn
>> +          (mouse-set-point event)
>> +          (xref-find-definitions identifier))
>>         (user-error "No identifier here"))))
> The problem with this solution is that when it doesn't find
> the identifier then it leaves point at the wrong place.

I'm not sure is a big problem, but we could save the original position 
and restore it in case of error too:

diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 0666b18cba1..fb7380dee77 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1635,9 +1635,18 @@ xref-find-definitions-at-mouse
    (let ((identifier
           (save-excursion
             (mouse-set-point event)
-           (xref-backend-identifier-at-point (xref-find-backend)))))
+           (xref-backend-identifier-at-point (xref-find-backend))))
+        (buf (current-buffer))
+        (pos (point)))
      (if identifier
-        (xref-find-definitions identifier)
+        (condition-case err
+          (progn
+            (mouse-set-point event)
+            (xref-find-definitions identifier))
+          (user-error
+           (set-buffer buf)
+           (goto-char pos)
+           (user-error (message (error-message-string err)))))
        (user-error "No identifier here"))))

  ;;;###autoload