diff options
author | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 13:58:24 +0300 |
---|---|---|
committer | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 14:11:53 +0300 |
commit | 11a895b7e15d1c5a1f52706396b82e3f9db953cb (patch) | |
tree | fabc6d883b0f946151f61ae7865cee9f529a1fdd /contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h | |
parent | 9685917341315774aad5733b1793b1e533a88bbb (diff) | |
download | ydb-11a895b7e15d1c5a1f52706396b82e3f9db953cb.tar.gz |
Export clang-format16 via ydblib project
6e6be3a95868fde888d801b7590af4044049563f
Diffstat (limited to 'contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h')
-rw-r--r-- | contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h b/contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h new file mode 100644 index 0000000000..f15026ea50 --- /dev/null +++ b/contrib/libs/clang16/tools/extra/clang-tidy/abseil/AbseilMatcher.h @@ -0,0 +1,59 @@ +//===- 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 |