[PATCH] D98710: [clang-tidy] Add --skip-headers, part 1 (use setTraversalScope)

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 23 07:39:13 PDT 2021


hokein added inline comments.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchFinder.h:148
+    /// Check if a Decl should be skipped.
+    std::shared_ptr<DeclFilter> Filter;
   };
----------------
chh wrote:
> sammccall wrote:
> > I don't think the filter belongs here.
> > The design of traversal scope is that it's a property of the AST that affects all traversals, so it shouldn't be a configuration property of particular traversals like ASTMatchFinder.
> > 
> > There's a question of what to do about `MatchFinder::newASTConsumer()`, which runs the finder immediately after an AST is created, and so covers the point at which we might set a scope. There are several good options, e.g.:
> >  - Don't provide any facility for setting traversal scope when newASTConsumer() is used - it's not commonly needed, and the ASTConsumer is trivial to reimplement where that's actually needed
> >  - Accept an optional `function<void(ASTContext&)>` which should run just before matching starts
> > 
> > This seems a bit subtle, but the difference between having this in MatchFinder proper vs just in newASTConsumer() is important I think, precisely because it's common to run the matchers directly on an existing AST.
> > 
> I have some similar concerns too.
> 
> clangd calls MatchFinder::matchAST explicitly after setTraversalScope,
> but clang-tidy uses MultiplexConsumer and MatchFinder::newASTConsumer
> is just one of the two consumers.
> (1) I am not sure if it would be safe or even work to make big changes in
> ClangTidy.cpp's CreateASTConsumer to call MatchFinder::matchAST explicitly.
> (2) Similarly, I wonder if setTraversalScope will work for both MatchFinder
> and other consumers in the same MultiplexConsumer.
> 
> Could you check if my current change to MatchFinder::HandleTranslationUnit
> is right, especially in the saving/restoring of traversal scope?
> 
> I am assuming that each consumer in a MultiplexConsumer will have its own
> chance to HandleTranslationUnit and HandleTopLevelDecl.
> If that's correct, it seems to me that changing those two handlers in
> MatchFinder is right for clang-tidy. Then they will need the optional
> MatchFinder::MatchFinderOptions::DeclFilter.
> 
> 
> but clang-tidy uses MultiplexConsumer and MatchFinder::newASTConsumer is just one of the two consumers.

Yeah, `MultiplexConsumer` is a separate interface in clang, and I don't think we have a strong reason to modify it. 

However, we could refine the bit in clang-tidy -- clang-tidy uses `MultiplexConsumer` to dispatch all events to two consumers: the MatcherFinder, the clang's static analyzer, we can get rid of the `MultiplexConsumer` by implementing a new ASTConsumer, so that we have enough flexibility to affect all traversals without touching all clang areas, so the API will look like

```
class ClangTidyASTConsumer : public ASTConsumer {

public:
  void HandleTopLevelDecl(...) override {
     // collect all main file decl
  }
  void HandleTranslationUnit(ASTContext &Context) override {
    // set traversal scope.
    MatcherFinderConsumer->HandleTranslationUnit(Context);
    StaticAnalyzer->HandleTranslationUnit(Context);
  }
  
  // implement other necessary Handle* overrides, and dispatch to StaticAnalyzer consumers;

private:
  std::unique_ptr<ASTConsumer> MatcherFinderConsumer;
  std::unique_ptr<...> StaticAnalyzer;
  ... MainFileDecl;
}; 
``` 


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

https://reviews.llvm.org/D98710



More information about the cfe-commits mailing list