[clang-tools-extra] r340800 - [clang-tidy] Abseil: no namepsace check

Roman Lebedev via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 28 00:55:09 PDT 2018


On Tue, Aug 28, 2018 at 10:48 AM, Haojian Wu via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list