1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- //===- AbseilMatcher.h - clang-tidy ---------------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "clang/AST/ASTContext.h"
- #include "clang/ASTMatchers/ASTMatchFinder.h"
- #include <algorithm>
- namespace clang::ast_matchers {
- /// Matches AST nodes that were found within Abseil files.
- ///
- /// Example matches Y but not X
- /// (matcher = cxxRecordDecl(isInAbseilFile())
- /// \code
- /// #include "absl/strings/internal-file.h"
- /// class X {};
- /// \endcode
- /// absl/strings/internal-file.h:
- /// \code
- /// class Y {};
- /// \endcode
- ///
- /// Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>,
- /// Matcher<NestedNameSpecifierLoc>
- AST_POLYMORPHIC_MATCHER(
- isInAbseilFile, AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc,
- NestedNameSpecifierLoc)) {
- auto &SourceManager = Finder->getASTContext().getSourceManager();
- SourceLocation Loc = SourceManager.getSpellingLoc(Node.getBeginLoc());
- if (Loc.isInvalid())
- return false;
- const FileEntry *FileEntry =
- SourceManager.getFileEntryForID(SourceManager.getFileID(Loc));
- if (!FileEntry)
- return false;
- // Determine whether filepath contains "absl/[absl-library]" substring, where
- // [absl-library] is AbseilLibraries list entry.
- StringRef Path = FileEntry->getName();
- static constexpr llvm::StringLiteral AbslPrefix("absl/");
- size_t PrefixPosition = Path.find(AbslPrefix);
- if (PrefixPosition == StringRef::npos)
- return false;
- Path = Path.drop_front(PrefixPosition + AbslPrefix.size());
- static const char *AbseilLibraries[] = {
- "algorithm", "base", "container", "debugging", "flags",
- "hash", "iterator", "memory", "meta", "numeric",
- "profiling", "random", "status", "strings", "synchronization",
- "time", "types", "utility"};
- return llvm::any_of(AbseilLibraries, [&](const char *Library) {
- return Path.startswith(Library);
- });
- }
- } // namespace clang::ast_matchers
|