kadircet accepted this revision.
kadircet added a comment.
This revision is now accepted and ready to land.

sorry for the long turn around here, LGTM. let's ship it!



================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:233
+  // Sadly we can't use IndexOpts.FileFilter to restrict indexing scope.
+  // Files from outside the location may define true std symbols anyway.
+  // We end up "blessing" such headers, and can only do that by indexing
----------------
sammccall wrote:
> kadircet wrote:
> > what does `the location` refer to here? I think we should also stress the 
> > fact that even when indexing the same file, we have a good chance of seeing 
> > different symbols due to PP directives (and different std versions)
> > what does the location refer to here? 
> 
> It refers to the StdLibLocation Loc, made that explicit.
> 
> > I think we should also stress the fact that even when indexing the same 
> > file, we have a good chance of seeing different symbols due to PP 
> > directives (and different std versions)
> 
> Different than what? Do you mean "why might different calls to 
> indexStandardLibrary see different symbols" from the same file?
> Different than what? Do you mean "why might different calls to 
> indexStandardLibrary see different symbols" from the same file?
yes, i meant compared to a previous runs. but i don't think it's as relevant 
here. i believe i was thinking about caching indexing status across runs and 
using that cache to implement filefilter, so that we don't index the same file 
twice (as we normally do in bgindex).


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:256
+  if (HadErrors) {
+    log("Errors when generating the standard library index, index may be "
+        "incomplete");
----------------
sammccall wrote:
> kadircet wrote:
> > i'd make this part of the next log
> Can you say why? I generally like one thought per line. Scanning vertically 
> through familiar lines, it's easy to miss something unfamiliar tacked onto 
> the end. This message should be rare, and log lines aren't precious.
> 
> (I reordered them, which seems a bit more natural)
i was rather implying to add it as a `(in)complete` field into the current log 
line you have. usually when clangd is printing lots of logs across threads it 
might be hard to correlate these. hence having them printed as a single log 
would help.


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:313
+    llvm::StringRef DirPath = llvm::sys::path::parent_path(HeaderPath);
+    if (!HS.getFileMgr().getVirtualFileSystem().getRealPath(DirPath, Path))
+      SearchPaths.emplace_back(Path);
----------------
sammccall wrote:
> sammccall wrote:
> > kadircet wrote:
> > > why do we resolve the symlinks ?
> > Oops, because I read the documentation of getCanonicalPath() instead of the 
> > implementation, and they diverged in 
> > https://github.com/llvm/llvm-project/commit/dd67793c0c549638cd93cad1142d324b979ba682
> >  :-D
> > 
> > Ultimately we're forming URIs to lexically compare with the ones emitted by 
> > the indexer, which uses getCanonicalPath(). Today getCanonicalPath() wants 
> > a FileEntry and we don't have one, but I think there's no fundamental 
> > reason for that, I can fix it.
> > 
> > (I'll do it as a separate patch, for now it's just calling getCanonicalPath 
> > with the wrong arguments)
> Actually, nevermind, the code is correct and I'd just forgotten why :-) Added 
> a comment to StdLibLocation.
> 
> getCanonicalPath() does actually resolve symlinks and so on: it asks the 
> FileManager for the directory entry and grabs the its "canonical name" which 
> is just FS->getRealPath behind a cache.
> So the strings are going to match the indexer after all.
> 
> It'd be possible to modify getCanonicalPath() so we can call it here, but I 
> don't think it helps. Calling it with (path, filemanager) is inconvenient for 
> the (many) existing callsites, so it'd have to be a new overload just for 
> this case. And the FileManager caching we'd gain doesn't matter here.
> I can still do it if you like, though.
> 
> (Also, relevant to your interests, realpath is probably taking care of case 
> mismatches too!)
>So the strings are going to match the indexer after all.

thanks, this makes sense.

> It'd be possible to modify getCanonicalPath() so we can call it here, but I 
> don't think it helps. Calling it with (path, filemanager) is inconvenient for 
> the (many) existing callsites, so it'd have to be a new overload just for 
> this case. And the FileManager caching we'd gain doesn't matter here.
> I can still do it if you like, though.

No need. We can take a look at that if the logic is likely to change (or get 
more complicated) in the future.


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:66
+  // This function is threadsafe.
+  llvm::Optional<StdLibLocation> add(const LangOptions &, const HeaderSearch 
&);
+
----------------
sammccall wrote:
> kadircet wrote:
> > maybe drop the optinal and bail out in indexing when `Paths` are empty ?
> Why? This would definitely be using an empty vector as a sentinel value:
>  - 2 paths -> index
>  - 1 path -> index
>  - 0 paths -> don't index
> And it's not as if "probe for a standard library" is the main point of this 
> function so the interpretation of the return value is obvious - that's only 
> one of three criteria.
> 
> None seems to be a clearer way to communicate this than {}, and performance 
> doesn't seem to be an issue here.
okay, makes sense.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115232/new/

https://reviews.llvm.org/D115232

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to