ilya-biryukov accepted this revision.
ilya-biryukov marked an inline comment as done.
ilya-biryukov added a comment.
This revision is now accepted and ready to land.

LGTM



================
Comment at: clang/lib/Index/IndexingAction.cpp:77
+    IndexCtx->getDataConsumer().setPreprocessor(PP);
+    PP->addPPCallbacks(std::make_unique<IndexPPCallbacks>(IndexCtx));
+  }
----------------
jkorous wrote:
> gribozavr wrote:
> > ilya-biryukov wrote:
> > > The fact that we call `addPPCallbacks` **after** creating `ASTContext` is 
> > > a bit concerning.
> > > 
> > > This wouldn't probably cause any problems in practice, but generally 
> > > changing preprocessor by the time `ASTContext` is already created seems 
> > > dangerous (what if something there ever starts depending on the state of 
> > > the preprocessor?)
> > > 
> > > I think this concern is easily elevated if we change Preprocessor and 
> > > call addPPCallbacks on `CreateASTConsumer(CompilerInvocation& CI)`. That 
> > > would mean we have a separate function that sets up the preprocessor and 
> > > creates `IndexASTConsumer` and it should be exposed to the clients.
> > > 
> > > Have you considered this approach? Would it work?
> > It does feel a bit weird, but we shouldn't have started parsing before 
> > calling `Initialize` on the `ASTConsumer`. Therefore I agree with you that 
> > it won't cause problems in practice.
> > 
> > Calling `addPPCallbacks` in `FrontendAction` is against the goal of this 
> > patch set. The goal is to encapsulate as much as possible in the 
> > `IndexASTConsumer`, because they compose well, unlike `FrontendAction`s. 
> > Therefore, requiring customization in `FrontendAction` is not possible.
> We could also move the preprocessor setup to constructor and check/add 
> asserts that `ASTContext` has been provided to `IndexingContext` and 
> `IndexDataConsumer` implementations.
LG, let's keep it like this and hope this won't break in the future too.
And if it will, we would probably be able to fix this by setting up 
`PPCallbacks` at the time when we create the `ASTConsumer`, i.e.
```
std::unique_ptr<ASTConsumer> createIndexASTConsumer(CompilerInvocation &CI) {
  CI.getPreprocessor().addPPCallback();
  return llvm::make_unique<IndexASTConsumer>(...);
}
```

That would reduce the gap between `FrontendAction::BeginSourceFile` and 
`addPPCallbacks` to just a few instructions, and the chances of breaking stuff 
would be even less.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D66877



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

Reply via email to