From cd62511496938e33c061c90796dd23a5288ff843 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 12 Feb 2020 11:34:13 -0800 Subject: [PATCH] Remove clang::ast_type_traits namespace in favor of clang DynTypedNode and ASTNodeKind are implemented as part of the clang AST library, which uses the main clang namespace. There doesn't seem to be a need for this extra level of namespacing. I left behind aliases in the ast_type_traits namespace for out of tree clients of these APIs. To provide aliases for the enumerators, I used this pattern: namespace ast_type_traits { constexpr TraversalKind TK_AsIs = ::clang::TK_AsIs; } I think the typedefs will be useful for migration, but we might be able to drop these enumerator aliases. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D74499 --- clang/docs/LibASTMatchersReference.html | 6 +- clang/include/clang/AST/ASTContext.h | 4 +- clang/include/clang/AST/ASTNodeTraverser.h | 18 +- clang/include/clang/AST/ASTTypeTraits.h | 23 ++- clang/include/clang/AST/ParentMapContext.h | 30 ++- clang/include/clang/ASTMatchers/ASTMatchFinder.h | 24 +-- clang/include/clang/ASTMatchers/ASTMatchers.h | 33 ++-- .../clang/ASTMatchers/ASTMatchersInternal.h | 170 ++++++++--------- .../clang/ASTMatchers/Dynamic/VariantValue.h | 19 +- clang/include/clang/Tooling/ASTDiff/ASTDiff.h | 4 +- .../clang/Tooling/ASTDiff/ASTDiffInternal.h | 2 +- .../clang/Tooling/Refactoring/ASTSelection.h | 5 +- clang/lib/AST/ASTTypeTraits.cpp | 6 +- clang/lib/AST/ParentMapContext.cpp | 86 ++++----- clang/lib/ASTMatchers/ASTMatchFinder.cpp | 85 ++++----- clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 87 ++++----- clang/lib/ASTMatchers/Dynamic/Marshallers.h | 93 +++++----- clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 9 +- clang/lib/Tooling/ASTDiff/ASTDiff.cpp | 4 +- clang/lib/Tooling/Refactoring/ASTSelection.cpp | 1 - .../Tooling/Refactoring/Rename/USRLocFinder.cpp | 6 +- clang/lib/Tooling/Transformer/RangeSelector.cpp | 2 - clang/lib/Tooling/Transformer/RewriteRule.cpp | 1 - clang/lib/Tooling/Transformer/Stencil.cpp | 1 - clang/unittests/AST/ASTContextParentMapTest.cpp | 1 - clang/unittests/AST/ASTTraverserTest.cpp | 108 +++++------ clang/unittests/AST/MatchVerifier.h | 12 +- .../ASTMatchers/ASTMatchersInternalTest.cpp | 13 +- .../ASTMatchers/ASTMatchersTraversalTest.cpp | 201 +++++++++------------ 29 files changed, 466 insertions(+), 588 deletions(-) diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 3d2ff47..05272a5 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -7381,11 +7381,11 @@ Usable as: Any Matcher -Matcher<T>traverseast_type_traits::TraversalKind TK, const BindableMatcher<T> InnerMatcher +Matcher<T>traverseTraversalKind TK, const BindableMatcher<T> InnerMatcher

 
 
-Matcher<T>traverseast_type_traits::TraversalKind TK, const Matcher<T>  InnerMatcher
+Matcher<T>traverseTraversalKind TK, const Matcher<T>  InnerMatcher
 
Causes all nested matchers to be matched with the specified traversal kind.
 
 Given
@@ -7394,7 +7394,7 @@ Given
       int i = 3.0;
   }
 The matcher
-  traverse(ast_type_traits::TK_IgnoreImplicitCastsAndParentheses,
+  traverse(TK_IgnoreImplicitCastsAndParentheses,
     varDecl(hasInitializer(floatLiteral().bind("init")))
   )
 matches the variable declaration with "init" bound to the "3.0".
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h
index e7b0ef1..c944e09 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -94,6 +94,7 @@ class CXXMethodDecl;
 class CXXRecordDecl;
 class DiagnosticsEngine;
 class ParentMapContext;
+class DynTypedNode;
 class DynTypedNodeList;
 class Expr;
 class FixedPointSemantics;
@@ -130,9 +131,6 @@ class VarTemplateDecl;
 class VTableContextBase;
 struct BlockVarCopyInit;
 
-namespace ast_type_traits {
-class DynTypedNode;
-}
 
 namespace Builtin {
 
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index 2259d7d..c146c24 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -66,8 +66,7 @@ class ASTNodeTraverser
   /// not already been loaded.
   bool Deserialize = false;
 
-  ast_type_traits::TraversalKind Traversal =
-      ast_type_traits::TraversalKind::TK_AsIs;
+  TraversalKind Traversal = TraversalKind::TK_AsIs;
 
   NodeDelegateType &getNodeDelegate() {
     return getDerived().doGetNodeDelegate();
@@ -78,7 +77,7 @@ public:
   void setDeserialize(bool D) { Deserialize = D; }
   bool getDeserialize() const { return Deserialize; }
 
-  void SetTraversalKind(ast_type_traits::TraversalKind TK) { Traversal = TK; }
+  void SetTraversalKind(TraversalKind TK) { Traversal = TK; }
 
   void Visit(const Decl *D) {
     getNodeDelegate().AddChild([=] {
@@ -109,12 +108,12 @@ public:
 
       if (auto *E = dyn_cast_or_null(S)) {
         switch (Traversal) {
-        case ast_type_traits::TK_AsIs:
+        case TK_AsIs:
           break;
-        case ast_type_traits::TK_IgnoreImplicitCastsAndParentheses:
+        case TK_IgnoreImplicitCastsAndParentheses:
           S = E->IgnoreParenImpCasts();
           break;
-        case ast_type_traits::TK_IgnoreUnlessSpelledInSource:
+        case TK_IgnoreUnlessSpelledInSource:
           S = E->IgnoreUnlessSpelledInSource();
           break;
         }
@@ -132,8 +131,7 @@ public:
       if (isa(S) || isa(S))
         return;
 
-      if (isa(S) &&
-          Traversal == ast_type_traits::TK_IgnoreUnlessSpelledInSource)
+      if (isa(S) && Traversal == TK_IgnoreUnlessSpelledInSource)
         return;
 
       for (const Stmt *SubStmt : S->children())
@@ -229,7 +227,7 @@ public:
     });
   }
 
-  void Visit(const ast_type_traits::DynTypedNode &N) {
+  void Visit(const DynTypedNode &N) {
     // FIXME: Improve this with a switch or a visitor pattern.
     if (const auto *D = N.get())
       Visit(D);
@@ -659,7 +657,7 @@ public:
   }
 
   void VisitLambdaExpr(const LambdaExpr *Node) {
-    if (Traversal == ast_type_traits::TK_IgnoreUnlessSpelledInSource) {
+    if (Traversal == TK_IgnoreUnlessSpelledInSource) {
       for (unsigned I = 0, N = Node->capture_size(); I != N; ++I) {
         const auto *C = Node->capture_begin() + I;
         if (!C->isExplicit())
diff --git a/clang/include/clang/AST/ASTTypeTraits.h b/clang/include/clang/AST/ASTTypeTraits.h
index 777ad2f..a9c2e33 100644
--- a/clang/include/clang/AST/ASTTypeTraits.h
+++ b/clang/include/clang/AST/ASTTypeTraits.h
@@ -33,8 +33,6 @@ namespace clang {
 
 struct PrintingPolicy;
 
-namespace ast_type_traits {
-
 /// Defines how we descend a level in the AST when we pass
 /// through expressions.
 enum TraversalKind {
@@ -522,18 +520,29 @@ template  struct DynTypedNode::BaseConverter {
   }
 };
 
-} // end namespace ast_type_traits
+// Previously these types were defined in the clang::ast_type_traits namespace.
+// Provide typedefs so that legacy code can be fixed asynchronously.
+namespace ast_type_traits {
+using DynTypedNode = ::clang::DynTypedNode;
+using ASTNodeKind = ::clang::ASTNodeKind;
+using TraversalKind = ::clang::TraversalKind;
+
+constexpr TraversalKind TK_AsIs = ::clang::TK_AsIs;
+constexpr TraversalKind TK_IgnoreImplicitCastsAndParentheses =
+    ::clang::TK_IgnoreImplicitCastsAndParentheses;
+constexpr TraversalKind TK_IgnoreUnlessSpelledInSource =
+    ::clang::TK_IgnoreUnlessSpelledInSource;
+} // namespace ast_type_traits
+
 } // end namespace clang
 
 namespace llvm {
 
 template <>
-struct DenseMapInfo
-    : clang::ast_type_traits::ASTNodeKind::DenseMapInfo {};
+struct DenseMapInfo : clang::ASTNodeKind::DenseMapInfo {};
 
 template <>
-struct DenseMapInfo
-    : clang::ast_type_traits::DynTypedNode::DenseMapInfo {};
+struct DenseMapInfo : clang::DynTypedNode::DenseMapInfo {};
 
 }  // end namespace llvm
 
diff --git a/clang/include/clang/AST/ParentMapContext.h b/clang/include/clang/AST/ParentMapContext.h
index c0fc5e2..3ab55fb 100644
--- a/clang/include/clang/AST/ParentMapContext.h
+++ b/clang/include/clang/AST/ParentMapContext.h
@@ -52,33 +52,31 @@ public:
   /// NestedNameSpecifier or NestedNameSpecifierLoc.
   template  DynTypedNodeList getParents(const NodeT &Node);
 
-  DynTypedNodeList getParents(const ast_type_traits::DynTypedNode &Node);
+  DynTypedNodeList getParents(const DynTypedNode &Node);
 
   /// Clear parent maps.
   void clear();
 
-  ast_type_traits::TraversalKind getTraversalKind() const { return Traversal; }
-  void setTraversalKind(ast_type_traits::TraversalKind TK) { Traversal = TK; }
+  TraversalKind getTraversalKind() const { return Traversal; }
+  void setTraversalKind(TraversalKind TK) { Traversal = TK; }
 
   const Expr *traverseIgnored(const Expr *E) const;
   Expr *traverseIgnored(Expr *E) const;
-  ast_type_traits::DynTypedNode
-  traverseIgnored(const ast_type_traits::DynTypedNode &N) const;
+  DynTypedNode traverseIgnored(const DynTypedNode &N) const;
 
 private:
   ASTContext &ASTCtx;
   class ParentMap;
-  ast_type_traits::TraversalKind Traversal = ast_type_traits::TK_AsIs;
+  TraversalKind Traversal = TK_AsIs;
   std::unique_ptr Parents;
 };
 
 class TraversalKindScope {
   ParentMapContext &Ctx;
-  ast_type_traits::TraversalKind TK = ast_type_traits::TK_AsIs;
+  TraversalKind TK = TK_AsIs;
 
 public:
-  TraversalKindScope(ASTContext &ASTCtx,
-                     llvm::Optional ScopeTK)
+  TraversalKindScope(ASTContext &ASTCtx, llvm::Optional ScopeTK)
       : Ctx(ASTCtx.getParentMapContext()) {
     TK = Ctx.getTraversalKind();
     if (ScopeTK)
@@ -91,10 +89,9 @@ public:
 /// Container for either a single DynTypedNode or for an ArrayRef to
 /// DynTypedNode. For use with ParentMap.
 class DynTypedNodeList {
-  using DynTypedNode = ast_type_traits::DynTypedNode;
+  using DynTypedNode = DynTypedNode;
 
-  llvm::AlignedCharArrayUnion> Storage;
+  llvm::AlignedCharArrayUnion> Storage;
   bool IsSingleNode;
 
 public:
@@ -106,14 +103,14 @@ public:
     new (Storage.buffer) ArrayRef(A);
   }
 
-  const ast_type_traits::DynTypedNode *begin() const {
+  const DynTypedNode *begin() const {
     if (!IsSingleNode)
       return reinterpret_cast *>(Storage.buffer)
           ->begin();
     return reinterpret_cast(Storage.buffer);
   }
 
-  const ast_type_traits::DynTypedNode *end() const {
+  const DynTypedNode *end() const {
     if (!IsSingleNode)
       return reinterpret_cast *>(Storage.buffer)
           ->end();
@@ -131,7 +128,7 @@ public:
 
 template 
 inline DynTypedNodeList ParentMapContext::getParents(const NodeT &Node) {
-  return getParents(ast_type_traits::DynTypedNode::create(Node));
+  return getParents(DynTypedNode::create(Node));
 }
 
 template 
@@ -140,8 +137,7 @@ inline DynTypedNodeList ASTContext::getParents(const NodeT &Node) {
 }
 
 template <>
-inline DynTypedNodeList
-ASTContext::getParents(const ast_type_traits::DynTypedNode &Node) {
+inline DynTypedNodeList ASTContext::getParents(const DynTypedNode &Node) {
   return getParentMapContext().getParents(Node);
 }
 
diff --git a/clang/include/clang/ASTMatchers/ASTMatchFinder.h b/clang/include/clang/ASTMatchers/ASTMatchFinder.h
index f8160d5..0af9843 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchFinder.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchFinder.h
@@ -182,10 +182,9 @@ public:
   ///
   /// @{
   template  void match(const T &Node, ASTContext &Context) {
-    match(clang::ast_type_traits::DynTypedNode::create(Node), Context);
+    match(clang::DynTypedNode::create(Node), Context);
   }
-  void match(const clang::ast_type_traits::DynTypedNode &Node,
-             ASTContext &Context);
+  void match(const clang::DynTypedNode &Node, ASTContext &Context);
   /// @}
 
   /// Finds all matches in the given AST.
@@ -242,9 +241,8 @@ SmallVector
 match(MatcherT Matcher, const NodeT &Node, ASTContext &Context);
 
 template 
-SmallVector
-match(MatcherT Matcher, const ast_type_traits::DynTypedNode &Node,
-      ASTContext &Context);
+SmallVector match(MatcherT Matcher, const DynTypedNode &Node,
+                                 ASTContext &Context);
 /// @}
 
 /// Returns the results of matching \p Matcher on the translation unit of
@@ -283,9 +281,8 @@ public:
 }
 
 template 
-SmallVector
-match(MatcherT Matcher, const ast_type_traits::DynTypedNode &Node,
-      ASTContext &Context) {
+SmallVector match(MatcherT Matcher, const DynTypedNode &Node,
+                                 ASTContext &Context) {
   internal::CollectMatchesCallback Callback;
   MatchFinder Finder;
   Finder.addMatcher(Matcher, &Callback);
@@ -296,7 +293,7 @@ match(MatcherT Matcher, const ast_type_traits::DynTypedNode &Node,
 template 
 SmallVector
 match(MatcherT Matcher, const NodeT &Node, ASTContext &Context) {
-  return match(Matcher, ast_type_traits::DynTypedNode::create(Node), Context);
+  return match(Matcher, DynTypedNode::create(Node), Context);
 }
 
 template 
@@ -310,8 +307,8 @@ match(MatcherT Matcher, ASTContext &Context) {
 }
 
 inline SmallVector
-matchDynamic(internal::DynTypedMatcher Matcher,
-             const ast_type_traits::DynTypedNode &Node, ASTContext &Context) {
+matchDynamic(internal::DynTypedMatcher Matcher, const DynTypedNode &Node,
+             ASTContext &Context) {
   internal::CollectMatchesCallback Callback;
   MatchFinder Finder;
   Finder.addDynamicMatcher(Matcher, &Callback);
@@ -323,8 +320,7 @@ template 
 SmallVector matchDynamic(internal::DynTypedMatcher Matcher,
                                         const NodeT &Node,
                                         ASTContext &Context) {
-  return matchDynamic(Matcher, ast_type_traits::DynTypedNode::create(Node),
-                      Context);
+  return matchDynamic(Matcher, DynTypedNode::create(Node), Context);
 }
 
 inline SmallVector
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index eadf167..122a920 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -115,7 +115,7 @@ public:
 
   /// Type of mapping from binding identifiers to bound nodes. This type
   /// is an associative container with a key type of \c std::string and a value
-  /// type of \c clang::ast_type_traits::DynTypedNode
+  /// type of \c clang::DynTypedNode
   using IDToNodeMap = internal::BoundNodesMap::IDToNodeMap;
 
   /// Retrieve mapping from binding identifiers to bound nodes.
@@ -722,13 +722,13 @@ AST_POLYMORPHIC_MATCHER_P(
 /// \endcode
 /// The matcher
 /// \code
-///   traverse(ast_type_traits::TK_IgnoreImplicitCastsAndParentheses,
+///   traverse(TK_IgnoreImplicitCastsAndParentheses,
 ///     varDecl(hasInitializer(floatLiteral().bind("init")))
 ///   )
 /// \endcode
 /// matches the variable declaration with "init" bound to the "3.0".
 template 
-internal::Matcher traverse(ast_type_traits::TraversalKind TK,
+internal::Matcher traverse(TraversalKind TK,
                               const internal::Matcher &InnerMatcher) {
   return internal::DynTypedMatcher::constructRestrictedWrapper(
              new internal::TraversalMatcher(TK, InnerMatcher),
@@ -738,8 +738,7 @@ internal::Matcher traverse(ast_type_traits::TraversalKind TK,
 
 template 
 internal::BindableMatcher
-traverse(ast_type_traits::TraversalKind TK,
-         const internal::BindableMatcher &InnerMatcher) {
+traverse(TraversalKind TK, const internal::BindableMatcher &InnerMatcher) {
   return internal::BindableMatcher(
       internal::DynTypedMatcher::constructRestrictedWrapper(
           new internal::TraversalMatcher(TK, InnerMatcher),
@@ -749,7 +748,7 @@ traverse(ast_type_traits::TraversalKind TK,
 
 template 
 internal::TraversalWrapper>
-traverse(ast_type_traits::TraversalKind TK,
+traverse(TraversalKind TK,
          const internal::VariadicOperatorMatcher &InnerMatcher) {
   return internal::TraversalWrapper>(
       TK, InnerMatcher);
@@ -759,9 +758,8 @@ template