[clangd-dev] Prototyping a "type hierarchy" request
Simon Marchi via clangd-dev
clangd-dev at lists.llvm.org
Tue Aug 28 07:53:14 PDT 2018
On 2018-08-28 02:21, Sam McCall wrote:
> On Mon, Aug 27, 2018, 22:22 Simon Marchi via clangd-dev <
> clangd-dev at lists.llvm.org> wrote:
>
>> Hi all,
>>
>> There is no request to obtain the type hierarchy starting from a
>> particular type in the LSP specification yet, but there are some
>> proposals [1] and some other language servers have their own extension
>> to the protocol to support that. I thought I would start prototyping
>> the feature in clangd to see how we can retrieve this information, so
>> that once the specification is modified to include such a request, we
>> are not too far from supporting it. It can also help steer the
>> proposed
>> changes to the specification to make sure it supports what we need for
>> the C++ language.
>>
>> The scope of my prototype is: given a type or variable, recursively
>> find
>> the base classes of that type (or the type of that variable). I am
>> not
>> considering derived classes right now, because it would require
>> dealing
>> with the index. Here is my work so far:
>>
>> https://reviews.llvm.org/D51311
>
> Haven't looked at the patch yet, but this sounds awesome and you're
> right
> about the index needing work to support this.
> One approach would be to use the XRefs APIs that are landing, make
> "overrides" a role, and allow the payload to be a symbol ID rather than
> a
> location.
>
> One extra feature I would really like to have is to be able to use the
>> "type hierarchy" request on a method (definition, declaration or
>> call).
>> The result would tell you which nodes of the type hierarchy have an
>> implementation of this method (possibly with some more details, is it
>> virtual, is it pure, etc). It would allow implementing UIs such as
>> the
>> one in this screenshot, which I find very useful:
>>
>>
>> https://github.com/Microsoft/vscode-languageserver-node/pull/346#issuecomment-416256239
>>
>> I'm a bit stuck at this point: given a CXXMethodDecl representing the
>> method the user targeted, how can I tell if some base class (a
>> CXXRecordDecl) has a method matching this one. I saw
>> CXXMethodDecl::overridden_methods, but it only concerns virtual
>> methods,
>> whereas for type hierarchy we would also want non-virtual overrides.
>>
> Dumb question, what are non-virtual overrides? I'm thinking CRTP, but
> I'm
> probably overthinking this :-)
Not sure I understand you question. But simply, if you have this:
struct A
{
void method ();
};
struct B : A
{};
struct C : B
{
void me^thod ();
};
I think that doing a type hierarchy request at the caret should still
tell you that a definition of the method you are targeting is present in
A and not in B, even if they are not marked virtual.
Simon
More information about the clangd-dev
mailing list