unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Spencer Baugh <sbaugh@catern.com>
To: emacs-devel@gnu.org
Subject: Re: Adding support for xref jumping to headers/interfaces
Date: Sat, 11 Nov 2023 08:00:43 -0500	[thread overview]
Message-ID: <87cywg8mx0.fsf@catern.com> (raw)
In-Reply-To: 4b0b05a2-8c83-7026-4310-327d595dfd8a@gutov.dev

Dmitry Gutov <dmitry@gutov.dev> writes:
>>>> If you mean something a non-default version of xref-find-definitions, or
>>>> another binding for another basically-identical command, sure, I think
>>>> that would be good.  We can have both that command *and* have a command
>>>> which prompts for KIND and defaults to "all".
>>>
>>> We could indeed, if we decide what to call it. "extras" seems out
>>> (since it would include both definitions and additional reference
>>> kinds). Just "xref-find-by-kind"? Then it's less obvious to have the
>>> default behavior showing all.
>> Actually, maybe this should be a backend-specific thing.  The
>> backend
>> could specify a default along with its list of kinds.  And if we request
>> that default kind (which might be 'all), then the backend will decide
>> what kinds to send us.
>
> If the backend specifies the default behavior of xref-find-by-kind,
> then it's what, another generic method to override?

The default could just be the first in the list of kinds returned by the
backend.

>> Actually, it occurs to me that if we had an xref-find-implementations
>> command from the start, with a convenient binding, maybe
>> xref-find-definitions would just only show the cl-defgeneric, and jump
>> to it right away.  And only if you hit xref-find-implementations would
>> you jump to the cl-defmethods.  We can't make that change now, but I
>> don't think it would be worse!  And if a backend wants a design like
>> that, I think the backend should be able to have it.
>
> Not sure I would like the result that you are describing, but indeed,
> if a backend wants to do it like this, nothing will be stopping it.
>
> Are LSP servers behaving like this? E.g. jdt-ls jumping to the method
> definition in an interface, even when the owner type is a statically
> known class?

I don't know about jdt-ls or indeed about LSP servers, but the xref
backend for Merlin (used for OCaml) by default has xref-find-definitions
jump to the signature of a function, not its implementation.

There's a user customization to toggle whether it jumps to the signature
or the implementation.  And if the customization is in "implementation"
mode, there's no way (through xref) to jump to the signature, and vice
versa.  Adding a way for xref to support jumping to the signature in
cases like that is in fact why I made this thread in the first place. :)

>>>> Maybe the backend could decide what kinds get included in "all".  Then
>>>> it could deliberately avoid including anything "reference-like".
>>>
>>> Could we want several such commands? E.g. one for "all definition-like
>>> hits" and another for "all reference-like hits"? With separate sets of
>>> kinds for definitions and references?
>> Possibly, but my suggestion is that "all definition-like hits" and
>> "all
>> reference-like hits" should just be kinds exposed by the backend.
>
> Two different generics returning lists of kinds, or just one? If two,
> then could one give an example of a "reference-like" kind except for
> "references"? I've taken a couple of guesses, but I'm exactly sure of
> them.

One generic.  Just "all-references" is a kind, and "all-definitions" is
another kind.

>>> It is less flexible because any time a backend wants to use a new
>>> "kind", it will need to expend some effort and add it to the core
>>> somehow. Define a new command or two and assign them to the said
>>> prefix map. This could also lead to conflicts if backend authors don't
>>> do this carefully enough.
>> No, I suggest that xref-backend-extra-kinds should be able to return
>> whatever arbitrary symbols it wants.  Just, if its "kinds" match the
>> kinds used in the core, then it will benefit from the commands and
>> bindings defined by the core.
>> Perfectly extensible, but still benefiting from standardization.
>
> Would the user be able to input/use the kinds that are in the list
> returned by the backend but are not in the set of "kinds used in the
> core"? If yes, how? Using a backend-provided command?

With xref-find-extras, which prompts for a kind.

>>>> I do think that if we go with an API which has any notion of "kinds", we
>>>> should have some standard "kinds" in the core like implementation,
>>>> declaration, type-definition.  I don't see any reason not to do that.
>>>
>>> We could have a "registry" of kinds, associating each of them with a
>>> key. Then the result could be more dynamic, e.g. M-' could be bound to
>>> a command that reads the key and performs the dispatch to the
>>> corresponding search (similar to project-switch-project).
>>>
>>> And the users (though probably not packages) would later be able to
>>> customize that mapping, adding new kinds or modifying the keys.
>>>
>>> With this approach we don't end up with many xref-find-xyz commands,
>>> most of which just clutter the namespace, staying unused for a large
>>> proportion of the users. OTOH, one wouldn't be able to examine the
>>> prefix map and its contents and definitions with (M-' C-h) -- that's a
>>> minor reduction in usability.
>> The only difference between this and a regular keymap which maps
>> keys to
>> commands is:
>> 
>>> we don't end up with many xref-find-xyz commands
>> But we can also avoid that by just... not defining many such
>> commands
>> and kinds.  A mode will always have the ability to define its own
>> mode-specific kinds in the mode's own namespace, which don't clutter
>> xref-*.
>
> Indeed.
>
> But if we don't define a dynamic dispatcher at all, it seems we won't
> need the backend to tell us about the supported kinds either. It would
> just support some and perhaps return error for unknown kinds.

True, in theory we could do that.  We could even provide some way to ask
the backend, "do you support kind X?" which could be useful to avoid
making bindings for something not supported by the backend.

So we could start without xref-backend-extra-kinds, and probably could
get decently far.

However, I think the dynamic dispatcher is useful for one very important
thing: when the backend adds support for a new kind which the major-mode
and/or core has not yet added support for.  Users will definitely want
to be able to use features of the backend that their major-mode/the core
doesn't know about.

>>>> Actually, this example has just convinced me that I definitely want
>>>> "kind-specific commands", even for Elisp.  That would be great.
>>>> For functions without separate declarations, find-implementation and
>>>> find-declaration could jump to the same place.  In some languages, maybe
>>>> that's just always what happens.
>>>
>>> Aren't find-implementation included in find-definition anyway? Or
>>> *are* the same as find-definition, for example, in LSP's approach?
>>> Aside from the fact that the latter also works for variables and other
>>> symbols.
>> No, find-implementation shows all the implementations of a generic
>> function/interface method.  (e.g. cl-defmethod)
>> find-definition (as I understand it) jumps to the interface
>> definition
>> itself (e.g. cl-defgeneric).  Which in my experience in Elisp, is
>> usually what I want; I want to see the documentation and default
>> implementation and surrounding code, before I look at a specific
>> implementation.
>
> I usually want to jump to where the function is
> implemented. Preferably, for the given type (though we don't support
> that). Perhaps I would use the proposed xref-find-implementations for
> this purpose, but it's bound to have a more complex key sequence than
> 'M-.'.
>
>> I think that's a pretty reasonable way for it to work.  Actually, maybe
>> we could add a customization point for the Elisp backend so that a user
>> can choose to make find-definition work that way, if we do add a
>> find-implementation command.
>
> We could.
>
>> There's also find-declaration - for Elisp, I think that one *is* the
>> mostly same as find-definition, since Elisp doesn't have separate
>> declarations.  (declare-function is kind of a different thing.  Maybe
>> find-declaration should jump to the declare-function instance in the
>> current file, if it can, but for now it's fine.)
>
> Yep. Though for cases where there is no corresponding meaningful
> implementation, I would rather abort with an error. Doing otherwise
> seems misleading (like we have special handing of this case, but we
> don't).

BTW, talking with Joao has convinced me that actually these should be
major-mode specific.  So we can have emacs-lisp-find-generic or
whatever, and that can have all kinds of special behavior and a useful
docstring that takes about Elisp things, but ultimately it calls into
the xref backend with a specific kind.




  reply	other threads:[~2023-11-11 13:00 UTC|newest]

Thread overview: 204+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-24 19:56 Adding support for xref jumping to headers/interfaces Spencer Baugh
2023-02-24 20:04 ` Eli Zaretskii
2023-02-24 21:29   ` Dmitry Gutov
2023-02-27 23:12     ` Stephen Leake
2023-02-27 23:34       ` Dmitry Gutov
2023-02-28  0:18         ` Yuan Fu
2023-02-28 16:05           ` Filipp Gunbin
2023-03-01  4:33             ` Richard Stallman
2023-03-01 12:50               ` Eli Zaretskii
2023-03-01 17:51                 ` John Yates
2023-03-04 18:54                   ` Stephen Leake
2023-03-04 22:24                     ` Dmitry Gutov
2023-03-05  6:11                       ` Eli Zaretskii
2023-03-05 12:06                         ` Dmitry Gutov
2023-03-07 22:41                           ` Dmitry Gutov
2023-03-08 14:58                             ` Eli Zaretskii
2023-03-08 18:23                               ` Dmitry Gutov
2023-03-08 19:49                                 ` Eli Zaretskii
2023-03-08 20:15                                   ` Dmitry Gutov
2023-03-09  6:13                                     ` Eli Zaretskii
2023-03-09 13:04                                       ` Dmitry Gutov
2023-03-09 15:36                                         ` Eli Zaretskii
2023-03-09 16:53                                           ` Dmitry Gutov
2023-03-09 17:31                                             ` Eli Zaretskii
2023-03-09 17:37                                               ` Dmitry Gutov
2023-05-16 21:10                                                 ` Spencer Baugh
2023-05-17 11:46                                                   ` Eli Zaretskii
2023-06-17  1:53                                                   ` Dmitry Gutov
2023-06-20 15:31                                                     ` João Távora
2023-06-22 19:22                                                       ` Spencer Baugh
2023-06-23  5:52                                                         ` Eli Zaretskii
2023-06-23 14:37                                                           ` Spencer Baugh
2023-06-23 14:53                                                             ` Eli Zaretskii
2023-06-23 15:03                                                         ` João Távora
2023-06-28 13:31                                                           ` Spencer Baugh
2023-11-04 22:43                                                           ` Dmitry Gutov
2023-11-04 22:00                                                       ` Dmitry Gutov
2023-11-04 22:24                                                         ` João Távora
2023-11-04 22:29                                                           ` Dmitry Gutov
2023-11-04 22:36                                                             ` João Távora
2023-11-04 23:20                                                               ` Dmitry Gutov
2023-11-04 23:16                                                   ` Dmitry Gutov
2023-11-04 23:21                                                     ` Dmitry Gutov
2023-11-04 23:24                                                     ` João Távora
2023-11-04 23:27                                                       ` Dmitry Gutov
     [not found]                                                         ` <CALDnm51sWvw4wiipYkJRB8za_8zpWg2-0jpoJDy_5urEa5okzQ@mail.gmail.com>
     [not found]                                                           ` <2752892c-4d27-1249-ca0a-6c24abbf1078@yandex.ru>
     [not found]                                                             ` <CALDnm51P5kfWNofybvxbzVZNnF9DwV5f2ZDGx9ziToBF7cJR6w@mail.gmail.com>
     [not found]                                                               ` <e043f63b-e997-805b-7f9a-64dcc0a9062e@yandex.ru>
     [not found]                                                                 ` <87zfzrybl1.fsf@gmail.com>
     [not found]                                                                   ` <57e53aae-bef9-d267-f7da-d4936fc37153@yandex.ru>
2023-11-07  9:36                                                                     ` João Távora
2023-11-07 22:56                                                                       ` Dmitry Gutov
2023-11-08  0:14                                                                         ` João Távora
2023-11-05  8:16                                                     ` Eshel Yaron
2023-11-07  2:12                                                       ` Dmitry Gutov
2023-11-07 17:09                                                         ` Spencer Baugh
2023-11-07 23:02                                                           ` Dmitry Gutov
2023-11-07 21:30                                                         ` Eshel Yaron
2023-11-07 23:17                                                           ` Dmitry Gutov
2023-11-08  0:21                                                             ` João Távora
2023-11-08  0:33                                                               ` Dmitry Gutov
2023-11-08  1:19                                                                 ` João Távora
2023-11-08 22:58                                                                   ` Dmitry Gutov
2023-11-08 23:22                                                                     ` João Távora
2023-11-08 23:34                                                                       ` Dmitry Gutov
2023-11-09  0:50                                                                         ` João Távora
2023-11-09 16:59                                                                           ` Spencer Baugh
2023-11-09 20:44                                                                             ` João Távora
2023-11-09 21:11                                                                               ` Spencer Baugh
2023-11-10 10:06                                                                                 ` João Távora
2023-11-10 12:02                                                                                   ` Spencer Baugh
2023-11-10 13:59                                                                                     ` João Távora
2023-11-10 17:36                                                                                       ` Spencer Baugh
2023-11-11 10:45                                                                                         ` Dmitry Gutov
2023-11-11 11:17                                                                                         ` João Távora
2023-11-11 12:38                                                                                           ` Spencer Baugh
2023-11-11 20:49                                                                                             ` Dmitry Gutov
2023-11-15 21:32                                                                                               ` Spencer Baugh
2023-11-24  1:37                                                                                                 ` Dmitry Gutov
2023-11-24 21:43                                                                                                   ` Felician Nemeth
2023-11-25  2:20                                                                                                     ` Dmitry Gutov
2023-11-26 16:08                                                                                                       ` Felician Nemeth
2023-11-26 20:15                                                                                                         ` Dmitry Gutov
2023-11-26 20:37                                                                                                           ` João Távora
2023-11-27 14:35                                                                                                             ` Dmitry Gutov
2023-11-27 15:03                                                                                                               ` João Távora
2023-11-27 15:45                                                                                                                 ` Dmitry Gutov
2023-11-27 16:04                                                                                                                   ` João Távora
2023-11-27 16:23                                                                                                                     ` Dmitry Gutov
2023-11-27 16:41                                                                                                                       ` João Távora
2023-11-27 17:05                                                                                                                         ` Dmitry Gutov
2023-11-27 17:09                                                                                                                           ` João Távora
2023-11-26 20:40                                                                                                         ` João Távora
2023-11-27 14:43                                                                                                           ` Dmitry Gutov
2023-11-27 14:49                                                                                                             ` João Távora
2023-11-27 15:01                                                                                                               ` Dmitry Gutov
2023-11-27 15:19                                                                                                                 ` João Távora
2023-11-28  0:18                                                                                                                   ` Dmitry Gutov
2023-11-28  9:51                                                                                                                     ` João Távora
2023-11-28 12:45                                                                                                                       ` Dmitry Gutov
2023-11-28 15:02                                                                                                                         ` João Távora
2023-11-28 16:32                                                                                                                           ` Dmitry Gutov
2023-11-28 17:16                                                                                                                             ` João Távora
2023-11-28 17:25                                                                                                                               ` Dmitry Gutov
2023-11-28 18:38                                                                                                                                 ` João Távora
2023-11-27 15:28                                                                                                                 ` Eli Zaretskii
2023-11-27 16:37                                                                                                                   ` Dmitry Gutov
2023-11-27 16:45                                                                                                                     ` João Távora
2023-11-27 17:40                                                                                                                     ` Eli Zaretskii
2023-11-27 18:26                                                                                                                       ` Dmitry Gutov
2023-11-27 20:50                                                                                                                         ` Eli Zaretskii
2023-11-27 20:53                                                                                                                           ` Dmitry Gutov
2023-11-26 20:30                                                                                                   ` João Távora
2023-11-27 15:17                                                                                                     ` Dmitry Gutov
2023-11-27 15:45                                                                                                       ` João Távora
2023-11-27 16:04                                                                                                         ` Dmitry Gutov
2023-11-27 16:27                                                                                                           ` João Távora
2023-11-27 17:22                                                                                                             ` Dmitry Gutov
2023-11-27 17:46                                                                                                               ` João Távora
2023-11-27 18:12                                                                                                                 ` Dmitry Gutov
2023-11-27 23:25                                                                                                                   ` João Távora
2023-11-28  0:30                                                                                                                     ` Dmitry Gutov
2023-11-28  0:43                                                                                                                       ` João Távora
2023-11-11  1:01                                                                                     ` Dmitry Gutov
2023-11-11  1:04                                                                                   ` Dmitry Gutov
2023-11-11 11:30                                                                                     ` João Távora
2023-11-11 21:01                                                                                       ` Dmitry Gutov
2023-11-12 18:40                                                                                         ` João Távora
2023-11-13  0:27                                                                                           ` Dmitry Gutov
2023-11-13  1:03                                                                                             ` João Távora
2023-11-13  1:05                                                                                               ` Dmitry Gutov
2023-11-13  1:16                                                                                                 ` João Távora
2023-11-13  1:41                                                                                                   ` electric-pair-mode vs paredit, was: " Dmitry Gutov
2023-11-13  1:53                                                                                                     ` João Távora
2023-11-11  0:58                                                                               ` Dmitry Gutov
2023-11-11 11:44                                                                                 ` João Távora
2023-11-11 21:37                                                                                   ` Dmitry Gutov
2023-11-12 18:59                                                                                     ` João Távora
2023-11-13  1:37                                                                                       ` Dmitry Gutov
2023-11-11  1:08                                                                               ` Dmitry Gutov
2023-11-11 11:22                                                                                 ` João Távora
2023-11-11 20:54                                                                                   ` Dmitry Gutov
2023-11-08 16:11                                                               ` Spencer Baugh
2023-11-08 17:20                                                                 ` João Távora
2023-11-08 17:40                                                                   ` Spencer Baugh
2023-11-08 23:08                                                                     ` João Távora
2023-11-09 16:52                                                                       ` CCing thread participants through gnus+gmane Spencer Baugh
2023-11-10 15:51                                                                         ` Eric Abrahamsen
2023-11-10 16:18                                                                         ` Visuwesh
2023-11-09 17:07                                                                       ` Adding support for xref jumping to headers/interfaces Spencer Baugh
2023-11-11  0:07                                                                         ` Dmitry Gutov
2023-11-11 12:39                                                                           ` Spencer Baugh
2023-11-11 20:45                                                                             ` Dmitry Gutov
2023-11-08 23:06                                                                 ` Dmitry Gutov
2023-11-07 16:51                                                     ` Spencer Baugh
2023-11-07 23:30                                                       ` Dmitry Gutov
2023-11-08 17:25                                                         ` Spencer Baugh
2023-11-09  0:08                                                           ` Dmitry Gutov
2023-11-09  0:26                                                             ` Dmitry Gutov
2023-11-09  1:06                                                               ` João Távora
2023-11-11  0:16                                                                 ` Dmitry Gutov
2023-11-09 17:57                                                             ` Spencer Baugh
2023-11-11  0:42                                                               ` Dmitry Gutov
2023-11-11 13:00                                                                 ` Spencer Baugh [this message]
2023-11-12  1:50                                                                   ` Dmitry Gutov
2023-11-12  2:08                                                                     ` João Távora
2023-11-12  2:09                                                                       ` Dmitry Gutov
2023-11-12  2:25                                                                         ` João Távora
2023-11-13  1:02                                                                           ` Dmitry Gutov
2023-11-13  1:24                                                                             ` João Távora
2023-03-01 15:00               ` [External] : " Drew Adams
2023-02-28 21:40           ` John Yates
2023-02-28 21:53             ` Dmitry Gutov
2023-02-28 22:44               ` Konstantin Kharlamov
2023-03-05  9:59 ` Helmut Eller
2023-03-05 12:03   ` Dmitry Gutov
2023-03-05 15:57     ` Helmut Eller
2023-03-05 16:33       ` Dmitry Gutov
2023-03-05 17:19         ` Stephen Leake
2023-03-05 20:10   ` João Távora
2023-03-05 20:32     ` João Távora
2023-03-05 20:40       ` Dmitry Gutov
2023-03-05 21:04         ` João Távora
2023-03-05 21:21           ` Dmitry Gutov
2023-03-05 21:48             ` João Távora
2023-03-05 22:08               ` Dmitry Gutov
2023-03-05 23:00                 ` João Távora
2023-03-05 23:40                 ` John Yates
2023-03-06 12:22                   ` Felician Nemeth
2023-03-06 13:15                     ` João Távora
2023-03-06 13:23                       ` Dmitry Gutov
2023-03-06 13:38                         ` João Távora
2023-03-06 13:46                           ` Dmitry Gutov
2023-03-06 13:52                             ` João Távora
2023-03-06 13:50                           ` Dmitry Gutov
2023-03-07  7:15                             ` Yuan Fu
2023-03-07 19:58                               ` Felician Nemeth
2023-03-07 20:44                                 ` Yuan Fu
2023-03-07 21:03                                 ` Dmitry Gutov
2023-03-06 14:09                   ` Dmitry Gutov
2023-03-06 14:15                     ` John Yates
2023-03-06 14:23                       ` Dmitry Gutov
2023-03-06 14:43                         ` John Yates
2023-03-10  0:57                     ` Ergus
2023-03-10 21:55                       ` Dmitry Gutov
2023-03-10 22:18                         ` João Távora
2023-03-10 22:25                           ` Dmitry Gutov
2023-03-11 11:50                             ` João Távora
2023-03-10 23:45                         ` Ergus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87cywg8mx0.fsf@catern.com \
    --to=sbaugh@catern.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).