usaxena95 added inline comments.

================
Comment at: clang/include/clang/Tooling/Syntax/Tokens.h:372
+  // useful while finding expanded tokens in a 'token range'.
+  llvm::DenseMap<SourceLocation, unsigned> ExpandedTokIndex;
   llvm::DenseMap<FileID, MarkedFile> Files;
----------------
kadircet wrote:
> this definitely makes sense, but most of the users of `TokenBuffers` are 
> currently invoking `expandedTokens(Range)` only once, so i am not sure if 
> this is a huge benefit on their-side, whereas they'll likely end up seeing 
> some short-lived memory consumption (and an extra traversal of all the 
> expanded tokens).
> 
> Any reasons for not moving this logic to the application? `expandedTokens()` 
> endpoint will return all the tokens, no questions asked. Then the application 
> can build whatever acceleration structure it wants. If you think there are 
> in-tree use cases that can benefit from this caching, maybe even provide that 
> as a separate helper?
> this definitely makes sense, but most of the users of TokenBuffers are 
> currently invoking expandedTokens(Range) only once
I didn't get that users are invoking it only once. This is not caching the 
results of `expandedTokens(Range)`. We are precomputing these to completely 
avoid a binary search which uses `isBeforeInTranslationUnit` (considerably 
slower). Doing an extra traversal of expandedTokens is not noticeable as 
compared to `isBeforeInTranslationUnit` latency. Users like SelectionTree 
(GoToDefinition, Hover,..) can directly benefit from this even though they 
query this only once per some range.

Umm. If you meant use cases like: build token buffer -> use 
expandedTokens(Range) -> destroy TokenBuffer.
I don't immediately see such use cases. But I think it is still better than 
using isBeforeInTranslationUnit.
My mental model is that TokenBuffer is a long lived object (example in 
ParsedAST in clangd). And using it only once and then discarding it is 
expensive in itself.

> Any reasons for not moving this logic to the application?
> If you think there are in-tree use cases that can benefit from this caching, 
> maybe even provide that as a separate helper?
This can basically benefit all users of `expandedToken(Range)`. Since 
expandedToken(Range) is provided by TokenBuffer, the optimization must also 
remain in the TokenBuffer as compared to the application.
Although users which only use this for non-token ranges will pay additional 
cost. We can potentially make this precomputation optional for such cases.





Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D99086

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

Reply via email to