deannagarcia created this revision. deannagarcia added reviewers: alexfh, hokein. deannagarcia added a project: clang-tools-extra. Herald added subscribers: xazax.hun, mgorny.
This check ensures that users of Abseil do not open namespace absl in their code, as that violates our compatibility guidelines. We are aware that this test will cause warnings on users code through their dependencies on abseil. However, from what we know it seems like these warnings are normally suppressed. If anyone has a good idea on how to avoid this/has insight on whether this will be a problem for the average user, please let me know! https://reviews.llvm.org/D50580 Files: clang-tidy/abseil/AbseilTidyModule.cpp clang-tidy/abseil/CMakeLists.txt clang-tidy/abseil/NoNamespaceCheck.cpp clang-tidy/abseil/NoNamespaceCheck.h docs/ReleaseNotes.rst docs/clang-tidy/checks/list.rst test/clang-tidy/abseil-no-namespace.cpp
Index: test/clang-tidy/abseil-no-namespace.cpp =================================================================== --- test/clang-tidy/abseil-no-namespace.cpp +++ test/clang-tidy/abseil-no-namespace.cpp @@ -0,0 +1,17 @@ +// RUN: %check_clang_tidy %s abseil-no-namespace %t + +namespace absl {} +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: namespace 'absl' is reserved for +// implementation of the Abseil library and should not be opened in the user +// code [abseil-no-namespace] + +namespace absl { +int i = 5; +} +// CHECK-MESSAGES: :[[@LINE-3]]:11: warning: namespace 'absl' is reserved for +// implementation of the Abseil library and should not be opened in the user +// code + +// Things that shouldn't trigger the check +int i = 5; +namespace std {} Index: docs/clang-tidy/checks/list.rst =================================================================== --- docs/clang-tidy/checks/list.rst +++ docs/clang-tidy/checks/list.rst @@ -4,6 +4,7 @@ ================= .. toctree:: + abseil-no-namespace abseil-string-find-startswith android-cloexec-accept android-cloexec-accept4 Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -59,6 +59,12 @@ The improvements are... +- New :doc:`abseil-no-namespace + <clang-tidy/checks/abseil-no-namespace>` check. + + Checks to ensure user did not open namespace absl as that + violates abseil's compatibility guidelines. + Improvements to include-fixer ----------------------------- Index: clang-tidy/abseil/NoNamespaceCheck.h =================================================================== --- clang-tidy/abseil/NoNamespaceCheck.h +++ clang-tidy/abseil/NoNamespaceCheck.h @@ -0,0 +1,37 @@ +//===--- NoNamespaceCheck.h - clang-tidy-------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_NONAMESPACECHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_NONAMESPACECHECK_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace abseil { + +/// This test ensures users don't open namespace absl, as that violates +/// our compatibility guidelines. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/abseil-no-namespace.html +class NoNamespaceCheck : public ClangTidyCheck { + public: + NoNamespaceCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace abseil +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_NONAMESPACECHECK_H + Index: clang-tidy/abseil/NoNamespaceCheck.cpp =================================================================== --- clang-tidy/abseil/NoNamespaceCheck.cpp +++ clang-tidy/abseil/NoNamespaceCheck.cpp @@ -0,0 +1,38 @@ +//===--- NoNamespaceCheck.cpp - clang-tidy---------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "NoNamespaceCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace abseil { + +void NoNamespaceCheck::registerMatchers(MatchFinder *Finder) { + if (!getLangOpts().CPlusPlus) return; + + Finder->addMatcher(namespaceDecl(hasName("absl")).bind("absl_namespace"), + this); +} + +void NoNamespaceCheck::check(const MatchFinder::MatchResult &Result) { + const auto *decl = Result.Nodes.getNodeAs<NamespaceDecl>("absl_namespace"); + + diag(decl->getLocation(), + "namespace 'absl' is reserved for implementation of the Abseil library " + "and should not be opened in the user code"); +} + +} // namespace abseil +} // namespace tidy +} // namespace clang + Index: clang-tidy/abseil/CMakeLists.txt =================================================================== --- clang-tidy/abseil/CMakeLists.txt +++ clang-tidy/abseil/CMakeLists.txt @@ -2,6 +2,7 @@ add_clang_library(clangTidyAbseilModule AbseilTidyModule.cpp + NoNamespaceCheck.cpp StringFindStartswithCheck.cpp LINK_LIBS Index: clang-tidy/abseil/AbseilTidyModule.cpp =================================================================== --- clang-tidy/abseil/AbseilTidyModule.cpp +++ clang-tidy/abseil/AbseilTidyModule.cpp @@ -10,6 +10,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "NoNamespaceCheck.h" #include "StringFindStartswithCheck.h" namespace clang { @@ -19,6 +20,7 @@ class AbseilModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck<NoNamespaceCheck>("abseil-no-namespace"); CheckFactories.registerCheck<StringFindStartswithCheck>( "abseil-string-find-startswith"); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits