UnnamedNamespaceInHeaderCheck.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //===--- UnnamedNamespaceInHeaderCheck.cpp - clang-tidy ---------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "UnnamedNamespaceInHeaderCheck.h"
  9. #include "clang/AST/ASTContext.h"
  10. #include "clang/ASTMatchers/ASTMatchFinder.h"
  11. #include "clang/ASTMatchers/ASTMatchers.h"
  12. using namespace clang::ast_matchers;
  13. namespace clang::tidy::google::build {
  14. UnnamedNamespaceInHeaderCheck::UnnamedNamespaceInHeaderCheck(
  15. StringRef Name, ClangTidyContext *Context)
  16. : ClangTidyCheck(Name, Context),
  17. RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
  18. "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
  19. if (!utils::parseFileExtensions(RawStringHeaderFileExtensions,
  20. HeaderFileExtensions,
  21. utils::defaultFileExtensionDelimiters())) {
  22. this->configurationDiag("Invalid header file extension: '%0'")
  23. << RawStringHeaderFileExtensions;
  24. }
  25. }
  26. void UnnamedNamespaceInHeaderCheck::storeOptions(
  27. ClangTidyOptions::OptionMap &Opts) {
  28. Options.store(Opts, "HeaderFileExtensions", RawStringHeaderFileExtensions);
  29. }
  30. void UnnamedNamespaceInHeaderCheck::registerMatchers(
  31. ast_matchers::MatchFinder *Finder) {
  32. Finder->addMatcher(namespaceDecl(isAnonymous()).bind("anonymousNamespace"),
  33. this);
  34. }
  35. void UnnamedNamespaceInHeaderCheck::check(
  36. const MatchFinder::MatchResult &Result) {
  37. const auto *N = Result.Nodes.getNodeAs<NamespaceDecl>("anonymousNamespace");
  38. SourceLocation Loc = N->getBeginLoc();
  39. if (!Loc.isValid())
  40. return;
  41. if (utils::isPresumedLocInHeaderFile(Loc, *Result.SourceManager,
  42. HeaderFileExtensions))
  43. diag(Loc, "do not use unnamed namespaces in header files");
  44. }
  45. } // namespace clang::tidy::google::build