vscode-clangd
vscode-clangd copied to clipboard
GoTo Definition for marked template type not working as expected
In the term std::optional<types::nr_rrc::BandList>
, I mark BandList
and hit Go to Definition.
I would expect that this jumps to types::nr_rrc::BandList
, but it jumps to std::optional
.
Do I miss something here?
The Language Server Protocol currently only accepts a single position as input for the go-to-definition request, not a range.
Assuming you've selected the range BandList
in the forward direction, such that your cursor is between the t
and >
, it's this cursor position that's sent.
Clangd then needs to decide whether to use the >
or the t
for targeting. It tries the character to the right of the cursor first, i.e. the >
, which is associated with the class template, so it navigates to the class template.
I agree this behaviour is suboptimal. Hopefully, LSP can add support for sending the entire range in https://github.com/microsoft/language-server-protocol/issues/1029.
I don't think MS is likely to fix this. I think we should probably add an extension client capability to control the behavior and set it in the VSCode plugin. For ibeam-editors bias-toward-identifier is better than bias-right.
Last time i thought about this i got stuck on the idea that this might not be fixed for an editor (e.g. vim mode for VSCode) or even vary over time (modal editing). But this is probably perfect-as-enemy-of-the-good.
I don't think MS is likely to fix this.
I'm all for making the clangd-only fix you describe, but I'm also curious why you don't think this will be fixed in LSP. Range inputs seem useful independent of this specific issue; are you expecting resistance to them for a particular reason, rather than just being a matter of someone doing the work of a fleshed-out proposal with spec and vscode client changes?
I am wondering how CLion does this, since AFAIK they also use clang. There, the Go to Definition works as intuitevly expected.
I have encountered similiar problems.
Thanks for @HighCommander4 's explanation, I have found the reason and known how to a workaround it.
Assuming you've selected the range BandList in the forward direction, such that your cursor is between the t and >, it's this cursor position that's sent.
Clangd then needs to decide whether to use the > or the t for targeting. It tries the character to the right of the cursor first, i.e. the >, which is associated with the class template, so it navigates to the class template.
For me, the "go to definition" doesn't work correctly since I have a habit of double clicking on the BandList
, then the cursor is automatically placed at the end of BandList
. For my case, the workaround is just to put the cursor in the middle of BandList
and don't double click.