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 9 #include "UnnamedNamespaceInHeaderCheck.h" 10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 12 #include "clang/ASTMatchers/ASTMatchers.h" 13 14 using namespace clang::ast_matchers; 15 16 namespace clang::tidy::google::build { 17 UnnamedNamespaceInHeaderCheck(StringRef Name,ClangTidyContext * Context)18UnnamedNamespaceInHeaderCheck::UnnamedNamespaceInHeaderCheck( 19 StringRef Name, ClangTidyContext *Context) 20 : ClangTidyCheck(Name, Context), 21 HeaderFileExtensions(Context->getHeaderFileExtensions()) {} 22 registerMatchers(ast_matchers::MatchFinder * Finder)23void UnnamedNamespaceInHeaderCheck::registerMatchers( 24 ast_matchers::MatchFinder *Finder) { 25 Finder->addMatcher(namespaceDecl(isAnonymous()).bind("anonymousNamespace"), 26 this); 27 } 28 check(const MatchFinder::MatchResult & Result)29void UnnamedNamespaceInHeaderCheck::check( 30 const MatchFinder::MatchResult &Result) { 31 const auto *N = Result.Nodes.getNodeAs<NamespaceDecl>("anonymousNamespace"); 32 SourceLocation Loc = N->getBeginLoc(); 33 if (!Loc.isValid()) 34 return; 35 36 if (utils::isPresumedLocInHeaderFile(Loc, *Result.SourceManager, 37 HeaderFileExtensions)) 38 diag(Loc, "do not use unnamed namespaces in header files"); 39 } 40 41 } // namespace clang::tidy::google::build 42