On Tue, Aug 28, 2018 at 10:48 AM, Haojian Wu via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: hokein > Date: Tue Aug 28 00:48:28 2018 > New Revision: 340800 > > URL: http://llvm.org/viewvc/llvm-project?rev=340800&view=rev > Log: > [clang-tidy] Abseil: no namepsace check > > This check ensures that users of Abseil do not open namespace absl in their > code, as that violates our compatibility guidelines. > > AbseilMatcher.h written by Hugo Gonzalez.
Would it please be possible to use the common notation of adding a line Differential Revision: https://reviews.llvm.org/D????? so that phabricator automatically properly associates the committed revision with the differential, and closes it? Roman. > Patch by Deanna Garcia! > > Added: > clang-tools-extra/trunk/clang-tidy/abseil/AbseilMatcher.h > clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.cpp > clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.h > clang-tools-extra/trunk/docs/clang-tidy/checks/abseil-no-namespace.rst > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/ > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/external-file.h > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/ > > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/internal-file.h > clang-tools-extra/trunk/test/clang-tidy/abseil-no-namespace.cpp > Modified: > clang-tools-extra/trunk/clang-tidy/abseil/AbseilTidyModule.cpp > clang-tools-extra/trunk/clang-tidy/abseil/CMakeLists.txt > clang-tools-extra/trunk/docs/ReleaseNotes.rst > clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > > Added: clang-tools-extra/trunk/clang-tidy/abseil/AbseilMatcher.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/AbseilMatcher.h?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/abseil/AbseilMatcher.h (added) > +++ clang-tools-extra/trunk/clang-tidy/abseil/AbseilMatcher.h Tue Aug 28 > 00:48:28 2018 > @@ -0,0 +1,51 @@ > +//===- AbseilMatcher.h - clang-tidy > ---------------------------------------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > +// > +#include "clang/AST/ASTContext.h" > +#include "clang/ASTMatchers/ASTMatchFinder.h" > + > +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> > + > +AST_POLYMORPHIC_MATCHER(isInAbseilFile, > + AST_POLYMORPHIC_SUPPORTED_TYPES( > + Decl, Stmt, TypeLoc, NestedNameSpecifierLoc)) { > + auto &SourceManager = Finder->getASTContext().getSourceManager(); > + SourceLocation Loc = Node.getBeginLoc(); > + if (Loc.isInvalid()) > + return false; > + const FileEntry *FileEntry = > + SourceManager.getFileEntryForID(SourceManager.getFileID(Loc)); > + if (!FileEntry) > + return false; > + StringRef Filename = FileEntry->getName(); > + llvm::Regex RE( > + "absl/(algorithm|base|container|debugging|memory|meta|numeric|strings|" > + "synchronization|time|types|utility)"); > + return RE.match(Filename); > +} > + > +} // namespace ast_matchers > +} // namespace clang > > Modified: clang-tools-extra/trunk/clang-tidy/abseil/AbseilTidyModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/AbseilTidyModule.cpp?rev=340800&r1=340799&r2=340800&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/abseil/AbseilTidyModule.cpp (original) > +++ clang-tools-extra/trunk/clang-tidy/abseil/AbseilTidyModule.cpp Tue Aug 28 > 00:48:28 2018 > @@ -12,6 +12,7 @@ > #include "../ClangTidyModuleRegistry.h" > #include "DurationDivisionCheck.h" > #include "FasterStrsplitDelimiterCheck.h" > +#include "NoNamespaceCheck.h" > #include "StringFindStartswithCheck.h" > > namespace clang { > @@ -25,6 +26,7 @@ public: > "abseil-duration-division"); > CheckFactories.registerCheck<FasterStrsplitDelimiterCheck>( > "abseil-faster-strsplit-delimiter"); > + CheckFactories.registerCheck<NoNamespaceCheck>("abseil-no-namespace"); > CheckFactories.registerCheck<StringFindStartswithCheck>( > "abseil-string-find-startswith"); > } > > Modified: clang-tools-extra/trunk/clang-tidy/abseil/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/CMakeLists.txt?rev=340800&r1=340799&r2=340800&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/abseil/CMakeLists.txt (original) > +++ clang-tools-extra/trunk/clang-tidy/abseil/CMakeLists.txt Tue Aug 28 > 00:48:28 2018 > @@ -4,6 +4,7 @@ add_clang_library(clangTidyAbseilModule > AbseilTidyModule.cpp > DurationDivisionCheck.cpp > FasterStrsplitDelimiterCheck.cpp > + NoNamespaceCheck.cpp > StringFindStartswithCheck.cpp > > LINK_LIBS > > Added: clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.cpp?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.cpp (added) > +++ clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.cpp Tue Aug 28 > 00:48:28 2018 > @@ -0,0 +1,42 @@ > +//===--- 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 "AbseilMatcher.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"), unless(isInAbseilFile())) > + .bind("abslNamespace"), > + this); > +} > + > +void NoNamespaceCheck::check(const MatchFinder::MatchResult &Result) { > + const auto *abslNamespaceDecl = > + Result.Nodes.getNodeAs<NamespaceDecl>("abslNamespace"); > + > + diag(abslNamespaceDecl->getLocation(), > + "namespace 'absl' is reserved for implementation of the Abseil > library " > + "and should not be opened in user code"); > +} > + > +} // namespace abseil > +} // namespace tidy > +} // namespace clang > > Added: clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.h?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.h (added) > +++ clang-tools-extra/trunk/clang-tidy/abseil/NoNamespaceCheck.h Tue Aug 28 > 00:48:28 2018 > @@ -0,0 +1,36 @@ > +//===--- 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 check ensures users don't open namespace absl, as that violates > +/// Abseil's 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 > > Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=340800&r1=340799&r2=340800&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) > +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Tue Aug 28 00:48:28 2018 > @@ -70,6 +70,12 @@ Improvements to clang-tidy > Finds instances of ``absl::StrSplit()`` or ``absl::MaxSplits()`` where the > delimiter is a single character string literal and replaces with a > character. > > +- New :doc:`abseil-no-namespace > + <clang-tidy/checks/abseil-no-namespace>` check. > + > + Ensures code does not open ``namespace absl`` as that violates Abseil's > + compatibility guidelines. > + > - New :doc:`readability-magic-numbers > <clang-tidy/checks/readability-magic-numbers>` check. > > > Added: clang-tools-extra/trunk/docs/clang-tidy/checks/abseil-no-namespace.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/abseil-no-namespace.rst?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/docs/clang-tidy/checks/abseil-no-namespace.rst > (added) > +++ clang-tools-extra/trunk/docs/clang-tidy/checks/abseil-no-namespace.rst > Tue Aug 28 00:48:28 2018 > @@ -0,0 +1,21 @@ > +.. title:: clang-tidy - abseil-no-namespace > + > +abseil-no-namespace > +=================== > + > +Ensures code does not open ``namespace absl`` as that violates Abseil's > +compatibility guidelines. Code should not open ``namespace absl`` as that > +conflicts with Abseil's compatibility guidelines and may result in breakage. > + > +Any code that uses: > + > +.. code-block:: c++ > + > + namespace absl { > + ... > + } > + > +will be prompted with a warning. > + > +See `the full Abseil compatibility guidelines <https:// > +abseil.io/about/compatibility>`_ for more information. > > Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=340800&r1=340799&r2=340800&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) > +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Tue Aug 28 > 00:48:28 2018 > @@ -6,6 +6,7 @@ Clang-Tidy Checks > .. toctree:: > abseil-duration-division > abseil-faster-strsplit-delimiter > + abseil-no-namespace > abseil-string-find-startswith > android-cloexec-accept > android-cloexec-accept4 > > Added: clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/external-file.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/external-file.h?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/external-file.h > (added) > +++ clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/external-file.h Tue > Aug 28 00:48:28 2018 > @@ -0,0 +1 @@ > +namespace absl {} > > Added: > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/internal-file.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/internal-file.h?rev=340800&view=auto > ============================================================================== > --- > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/internal-file.h > (added) > +++ > clang-tools-extra/trunk/test/clang-tidy/Inputs/absl/strings/internal-file.h > Tue Aug 28 00:48:28 2018 > @@ -0,0 +1 @@ > +namespace absl {} > > Added: clang-tools-extra/trunk/test/clang-tidy/abseil-no-namespace.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/abseil-no-namespace.cpp?rev=340800&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/abseil-no-namespace.cpp (added) > +++ clang-tools-extra/trunk/test/clang-tidy/abseil-no-namespace.cpp Tue Aug > 28 00:48:28 2018 > @@ -0,0 +1,24 @@ > +// RUN: %check_clang_tidy %s abseil-no-namespace %t -- -- -I %S/Inputs > +// RUN: clang-tidy -checks='-*, abseil-no-namespace' -header-filter='.*' %s > -- -I %S/Inputs 2>&1 | FileCheck %s > + > +/// Warning will not be triggered on internal Abseil code that is included. > +#include "absl/strings/internal-file.h" > +// CHECK-NOT: warning: > + > +/// Warning will be triggered on code that is not internal that is included. > +#include "absl/external-file.h" > +// CHECK: absl/external-file.h:1:11: warning: namespace 'absl' is reserved > + > +namespace absl {} > +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: namespace 'absl' is reserved > for implementation of the Abseil library and should not be opened in user > code [abseil-no-namespace] > + > +namespace absl { > +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: namespace 'absl' > +namespace std { > +int i = 5; > +} > +} > + > +// Things that shouldn't trigger the check > +int i = 5; > +namespace std {} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits