[PATCH] D87891: [clangd] findNearbyIdentifier(): guaranteed to give up after 2^N lines
Aleksandr Platonov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 28 00:31:39 PDT 2020
ArcsinX added inline comments.
================
Comment at: clang-tools-extra/clangd/XRefs.cpp:589
// but not things like disabled preprocessor sections.
if (!(tokenSpelledAt(Tok.location(), TB) || TB.expansionStartingAt(&Tok)))
return false;
----------------
here
================
Comment at: clang-tools-extra/clangd/XRefs.cpp:580
return false;
- // No point guessing the same location we started with.
- if (Tok.location() == Word.Location)
----------------
ArcsinX wrote:
> sammccall wrote:
> > ArcsinX wrote:
> > > sammccall wrote:
> > > > why can't this happen anymore?
> > > As I understand, we call `findNearbyIdentifier()` only when the word is not an identifier. And `Tok` is always identifier here.
> > >
> > > Btw, even if `findNearbyIdentifier()` could be called for an identifier, I could not get why it's bad to return current position here.
> > >
> > > Am I wrong?
> > > As I understand, we call findNearbyIdentifier() only when the word is not an identifier
> >
> > I'm not sure where you're getting that.
> > If you mean the bail-out inside the function itself:
> >
> > ```
> > // Don't use heuristics if this is a real identifier.
> > // Unlikely identifiers are OK if they were used as identifiers nearby.
> > if (Word.ExpandedToken)
> > return nullptr;
> > ```
> >
> > then "real identifier" here means it's an identifier after preprocessing.
> > We're still getting here if it's e.g. part of a macro body, or code that's `#ifdef`'d out.
> > The spelled token in those cases is an identifier, there's just no corresponding expanded token.
> >
> > (I'm surprised we don't have a test covering this though!)
> >
> > > Btw, even if findNearbyIdentifier() could be called for an identifier, I could not get why it's bad to return current position here.
> >
> > The point of this function is that *this* occurrence of the word can't be resolved, so let's try another one nearby.
> > If we just return the same occurrence, then we're certainly not going to be able to resolve it.
> Thanks for your clarification. I will revert this change (and will try to add a test as well).
I failed to create a test for this.
I can create a test for identifiers in a macro body or under `#ifdef`, but such a test passes without ` if (Tok.location() == Word.Location)` because of this check:
```
if (!(tokenSpelledAt(Tok.location(), TB) || TB.expansionStartingAt(&Tok)))
return false;
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D87891/new/
https://reviews.llvm.org/D87891
More information about the cfe-commits
mailing list