<div dir="ltr">Hi Simon, <div><br></div><div>This is likely a bug in the go-to-definition code path. clangd should always return URIs with absolute paths. There have also been some recent changes that make clangd produce canonical URIs. I think your example would actually cause assertion failure in a newer build of clangd. I'll look into this.<div><br></div><div>Cheers,</div><div>Eric</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, Jan 28, 2018 at 3:11 AM Simon Marchi via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I have a question regarding how clangd returns URIs.  Let's say I have a file compiled<br>
with a relative path like this (something that can easily happen when you build<br>
outside the source directory)<br>
<br>
  clang++ -c ../src/repro.cpp -o repro.o -g3 -O0<br>
<br>
The compile_commands.json (as generated with Bear) will contain this:<br>
<br>
  "directory": "/home/simark/src/repro/build",<br>
  "file": "../src/repro.cpp"<br>
<br>
If I make some "goto definition" requests, clangd may return a relative URI or a non-canonical<br>
URI:<br>
<br>
<-- {"id":124,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":3,"line":9},"textDocument":{"uri":"file:///home/simark/src/repro/src/repro.cpp"}}}<br>
--> {"id":124,"jsonrpc":"2.0","result":[{"range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"uri":"file://../src/repro.cpp"}]}<br>
<-- {"id":125,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":3,"line":4},"textDocument":{"uri":"file:///home/simark/src/repro/src/repro.cpp"}}}<br>
--> {"id":125,"jsonrpc":"2.0","result":[{"range":{"end":{"character":5,"line":1},"start":{"character":0,"line":0}},"uri":"file:///home/simark/src/repro/build/../src/repro.h"}]}<br>
<br>
In the first case, is it expected for clangd to return the URI "file://../src/repro.cpp"?<br>
First, is it even allowed to have relative URIs?  If so, what is it relative to?  There was<br>
a discussion here about relative/absolute URIs, the conclusion seems to be that absolute<br>
URIs are the way to go:<br>
<br>
  <a href="https://github.com/Microsoft/language-server-protocol/issues/27" rel="noreferrer" target="_blank">https://github.com/Microsoft/language-server-protocol/issues/27</a><br>
<br>
In the second case, the returned URI is not normalized.  Should clangd make sure to return<br>
only normalized URIs, to avoid possibly referring to the same file using different paths?<br>
<br>
I am attaching a simple reproducer with this message (hopefully the mailing list accepts it).<br>
The instructions for building are in the README.<br>
<br>
Thanks,<br>
<br>
Simon<br>
<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>