[PATCH] D50542: [clang-tidy] Add abseil-no-internal-deps check
Hugo Gonzalez via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 20 10:05:28 PDT 2018
hugoeg marked an inline comment as done.
hugoeg added inline comments.
================
Comment at: clang-tidy/abseil/NoInternalDepsCheck.cpp:20
+
+bool IsInAbseilFile(const SourceManager& manager, SourceLocation loc){
+ if (loc.isInvalid()) {
----------------
hokein wrote:
> hugoeg wrote:
> > hokein wrote:
> > > I think we can make it as an ASTMatcher instead of a function like:
> > >
> > > ```
> > > AST_POLYMORPHIC_MATCHER_P(isInAbseilFile,
> > > AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc)) {
> > > // your code here.
> > > }
> > > ```
> > Unfortunately, I do not think we can. That was the way I originally tried to implement it. It worked on no-namespace-check, but not in this one. This is because as an AST_POLYMORPHIC_MATCHER_P, we are trying to match an usage of a Decl, not the Decl itself and since we are matching a TypeLoc in no-internal-deps-check, not really the usage, it doesn't work.
> >
> > As a result, I modified my original implementation, which you will see in no-namespace-check and turned it into IsInAbseilFile(SourceManager&, SourceLocation), which is just takes a source location and returns whether the location we matched is in an Abseil file
> Could you explain a bit more why it won't work? I don't understand why it doesn't work.
>
> Basically you define the matcher like:
>
> ```
> AST_POLYMORPHIC_MATCHER(
> isInAbseilFile, AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc,
> NestedNameSpecifierLoc)) {
> auto &SourceManager = Finder->getASTContext().getSourceManager();
> SourceLocation loc = Node.getBeginLoc();
> if (loc.isInvalid()) return false;
> const FileEntry *FileEntry =
> SourceManager.getFileEntryForID(SourceManager.getFileID(loc));
> if (!FileEntry) return false;
> StringRef Filename = FileEntry->getName();
> llvm::Regex RE("absl/(base|container|debugging|memory|meta|numeric|strings|"
> "synchronization|types|utiliy)");
> return RE.match(Filename);
> }
> ```
>
> And use it for example in your check
>
> ```
> Finder->addMatcher(nestedNameSpecifierLoc(
> loc(specifiesNamespace(namespaceDecl(
> matchesName("internal"),
> hasParent(namespaceDecl(hasName("absl")))))),
> unless(isInAbseilFile()))
> .bind("InternalDep"),
> this);
> ```
You're right, this implementation seems to work, I seemed to have a simple logic error in my original implementation, the new diff will include this version
https://reviews.llvm.org/D50542
More information about the cfe-commits
mailing list