2018-08-28 15:48:28 +08:00
|
|
|
//===- AbseilMatcher.h - clang-tidy ---------------------------------------===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// 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
|
2018-08-28 15:48:28 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2018-08-30 20:42:19 +08:00
|
|
|
|
2018-08-28 15:48:28 +08:00
|
|
|
#include "clang/AST/ASTContext.h"
|
|
|
|
#include "clang/ASTMatchers/ASTMatchFinder.h"
|
2018-08-30 20:42:19 +08:00
|
|
|
#include <algorithm>
|
2018-08-28 15:48:28 +08:00
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace 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>
|
2018-08-30 20:42:19 +08:00
|
|
|
AST_POLYMORPHIC_MATCHER(
|
|
|
|
isInAbseilFile, AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc,
|
|
|
|
NestedNameSpecifierLoc)) {
|
2018-08-28 15:48:28 +08:00
|
|
|
auto &SourceManager = Finder->getASTContext().getSourceManager();
|
2018-09-07 17:25:23 +08:00
|
|
|
SourceLocation Loc = SourceManager.getSpellingLoc(Node.getBeginLoc());
|
2018-08-28 15:48:28 +08:00
|
|
|
if (Loc.isInvalid())
|
|
|
|
return false;
|
|
|
|
const FileEntry *FileEntry =
|
|
|
|
SourceManager.getFileEntryForID(SourceManager.getFileID(Loc));
|
|
|
|
if (!FileEntry)
|
|
|
|
return false;
|
2018-08-30 20:42:19 +08:00
|
|
|
// Determine whether filepath contains "absl/[absl-library]" substring, where
|
|
|
|
// [absl-library] is AbseilLibraries list entry.
|
|
|
|
StringRef Path = FileEntry->getName();
|
2018-09-11 18:37:08 +08:00
|
|
|
static constexpr llvm::StringLiteral AbslPrefix("absl/");
|
2018-08-30 20:42:19 +08:00
|
|
|
size_t PrefixPosition = Path.find(AbslPrefix);
|
|
|
|
if (PrefixPosition == StringRef::npos)
|
|
|
|
return false;
|
|
|
|
Path = Path.drop_front(PrefixPosition + AbslPrefix.size());
|
2021-09-10 03:10:36 +08:00
|
|
|
static const char *AbseilLibraries[] = {
|
|
|
|
"algorithm", "base", "container", "debugging", "flags",
|
|
|
|
"hash", "iterator", "memory", "meta", "numeric",
|
|
|
|
"profiling", "random", "status", "strings", "synchronization",
|
|
|
|
"time", "types", "utility"};
|
2020-08-18 22:52:37 +08:00
|
|
|
return llvm::any_of(AbseilLibraries, [&](const char *Library) {
|
|
|
|
return Path.startswith(Library);
|
|
|
|
});
|
2018-08-28 15:48:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace ast_matchers
|
|
|
|
} // namespace clang
|