MichelleCDjunaidi wrote:

> > maintaining the name of the matched classes in a vector and checking for 
> > every other class if it inherits from `::std::enable_shared_from_this` or 
> > classes in the vector.
> 
> You wouldn't want to save the name, because then you would do a lot of string 
> comparisons when you could do pointer comparisons (which would require using 
> `RDecl->getCanonical()` to ensure you get the same record decl, I believe). 
> Instead of a vector, you could use a set. Then checking the base classes 
> would simply be a call to `contains` (`llvm::SmallPtrSet`?).
> 
> > Wouldn't this necessitate changing the matchers and the check to instead 
> > allow RecursiveASTVisitor to handle the context instead?
> 
> Kind of. In this case, you would match the translation unit and call 
> `TraverseTranslationUnitDecl` on it. Then you implement `bool 
> VisitCXXRecordDecl(CXXRecordDecl* RDecl)` and check if `RDecl` is of type 
> `std::enable_shared_from_this` and adding that to the set if it is. 
> Otherwise, checking if it publicly inherits from any class that is contained 
> in the set, and adding it to the set if it is. If the inheritance is not 
> public, then you can issue a diagnostic. You can save a pointer to the check 
> (`ClangTidyCheck* Check`) to do that (`Check->diag(...)`).

Thanks for the pointers! It's really helpful to have a starting point to learn 
the best practices, I'll try to figure this out and report back.

https://github.com/llvm/llvm-project/pull/102299
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to