[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-28 Thread Stephen Kelly via Phabricator via cfe-commits
steveire abandoned this revision.
steveire added a comment.

Clearing this out of my outgoing list.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96114/new/

https://reviews.llvm.org/D96114

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-22 Thread Stephen Kelly via Phabricator via cfe-commits
steveire added a comment.

In D96114#2548029 , @klimek wrote:

> Can you explain the change and the before/after a bit more? Thanks!

I'm not sure. Can you ask a more-specific question? Did you read the link that 
Nathan posted? Is the unit test unclear?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96114/new/

https://reviews.llvm.org/D96114

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-08 Thread Manuel Klimek via Phabricator via cfe-commits
klimek added a comment.

Can you explain the change and the before/after a bit more? Thanks!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96114/new/

https://reviews.llvm.org/D96114

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-07 Thread Stephen Kelly via Phabricator via cfe-commits
steveire updated this revision to Diff 321991.
steveire added a comment.

Update


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96114/new/

https://reviews.llvm.org/D96114

Files:
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/lib/AST/ParentMapContext.cpp
  clang/lib/ASTMatchers/ASTMatchFinder.cpp
  clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -3551,6 +3551,14 @@
forFunction(functionDecl(hasName("func13"))),
   langCxx20OrLater()));
 
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   parmVarDecl(hasName("d"),
+   hasParent(lambdaExpr(forFunction(
+   functionDecl(hasName("func13"))),
+  langCxx20OrLater()));
+
   EXPECT_TRUE(matches(Code,
   traverse(TK_IgnoreUnlessSpelledInSource,
compoundStmt(hasParent(lambdaExpr(forFunction(
Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -2068,6 +2068,41 @@
  Constructor1Arg));
 }
 
+TEST(ASTMatchersTest, has_parmVarDecl) {
+
+  auto Code = R"cpp(
+void f(int ii)
+{
+
+}
+)cpp";
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs,
+   functionDecl(hasName("f"),
+has(typeLoc(has(parmVarDecl(hasName("ii"))),
+  langCxx20OrLater()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   functionDecl(hasName("f"), has(parmVarDecl(hasName("ii"),
+  langCxx20OrLater()));
+
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_AsIs, parmVarDecl(hasName("ii"),
+hasParent(typeLoc(hasParent(
+functionDecl(hasName("f"))),
+  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   parmVarDecl(hasName("ii"),
+   hasParent(functionDecl(hasName("f"),
+  langCxx20OrLater()));
+}
+
 TEST(ASTMatchersTest, NamesMember_CXXDependentScopeMemberExpr) {
 
   // Member functions:
Index: clang/lib/ASTMatchers/ASTMatchFinder.cpp
===
--- clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -143,6 +143,17 @@
 return Matches;
   }
 
+  bool TraverseFunctionHelper(FunctionDecl *FD) {
+if (Finder->isTraversalIgnoringImplicitNodes()) {
+  for (auto *P : FD->parameters()) {
+if (!TraverseDecl(P))
+  return false;
+  }
+}
+return RecursiveASTVisitor::TraverseFunctionHelper(
+FD);
+  }
+
   // The following are overriding methods from the base visitor class.
   // They are public only to allow CRTP to work. They are *not *part
   // of the public API of this class.
Index: clang/lib/AST/ParentMapContext.cpp
===
--- clang/lib/AST/ParentMapContext.cpp
+++ clang/lib/AST/ParentMapContext.cpp
@@ -345,7 +345,7 @@
 class ParentMapContext::ParentMap::ASTVisitor
 : public RecursiveASTVisitor {
 public:
-  ASTVisitor(ParentMap ) : Map(Map) {}
+  ASTVisitor(ParentMap , ASTContext ) : Map(Map), Ctx(Ctx) {}
 
 private:
   friend class RecursiveASTVisitor;
@@ -422,6 +422,19 @@
 );
   }
   bool TraverseTypeLoc(TypeLoc TypeLocNode) {
+if (Ctx.getParentMapContext().getTraversalKind() ==
+TK_IgnoreUnlessSpelledInSource) {
+  if (auto FPTL = TypeLocNode.getAs()) {
+for (unsigned I = 0, E = FPTL.getNumParams(); I != E; ++I) {
+  if (auto *P = FPTL.getParam(I)) {
+if (!TraverseDecl(P))
+  return false;
+  }
+}
+return true;
+  }
+}
+
 return TraverseNode(
 TypeLocNode, DynTypedNode::create(TypeLocNode),
 [&] { return VisitorBase::TraverseTypeLoc(TypeLocNode); },
@@ -446,11 +459,12 @@
   }
 
   ParentMap 
+  ASTContext 
   llvm::SmallVector ParentStack;
 };
 
 ParentMapContext::ParentMap::ParentMap(ASTContext ) {
-  ASTVisitor(*this).TraverseAST(Ctx);
+  ASTVisitor(*this, Ctx).TraverseAST(Ctx);
 }
 
 DynTypedNodeList ParentMapContext::getParents(const DynTypedNode ) {
Index: 

[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-06 Thread Nathan James via Phabricator via cfe-commits
njames93 added a reviewer: klimek.
njames93 added a comment.

I have no issues here, but see what the others say as well.
Also related post to cfe-dev - 
https://lists.llvm.org/pipermail/cfe-dev/2021-February/067629.html




Comment at: clang/lib/ASTMatchers/ASTMatchFinder.cpp:148-151
+  for (auto *P : FD->parameters())
+if (!TraverseDecl(P)) {
+  return false;
+}

nit: Inner If doesn't need braces, but I'd prefer the loop to have them.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96114/new/

https://reviews.llvm.org/D96114

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96114: [ASTMatchers] Fix parent-child traversal between functions and parms

2021-02-05 Thread Stephen Kelly via Phabricator via cfe-commits
steveire created this revision.
steveire added reviewers: aaron.ballman, njames93.
Herald added a subscriber: kristof.beyls.
steveire requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Having to match on the typeLoc in AsIs mode is undesirable, but keep it
for now for compatbility.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96114

Files:
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/lib/AST/ParentMapContext.cpp
  clang/lib/ASTMatchers/ASTMatchFinder.cpp
  clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -3551,6 +3551,14 @@
forFunction(functionDecl(hasName("func13"))),
   langCxx20OrLater()));
 
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   parmVarDecl(hasName("d"),
+   hasParent(lambdaExpr(forFunction(
+   functionDecl(hasName("func13"))),
+  langCxx20OrLater()));
+
   EXPECT_TRUE(matches(Code,
   traverse(TK_IgnoreUnlessSpelledInSource,
compoundStmt(hasParent(lambdaExpr(forFunction(
Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -2068,6 +2068,41 @@
  Constructor1Arg));
 }
 
+TEST(ASTMatchersTest, has_parmVarDecl) {
+
+  auto Code = R"cpp(
+void f(int ii)
+{
+
+}
+)cpp";
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs,
+   functionDecl(hasName("f"),
+has(typeLoc(has(parmVarDecl(hasName("ii"))),
+  langCxx20OrLater()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   functionDecl(hasName("f"), has(parmVarDecl(hasName("ii"),
+  langCxx20OrLater()));
+
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_AsIs, parmVarDecl(hasName("ii"),
+hasParent(typeLoc(hasParent(
+functionDecl(hasName("f"))),
+  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   parmVarDecl(hasName("ii"),
+   hasParent(functionDecl(hasName("f"),
+  langCxx20OrLater()));
+}
+
 TEST(ASTMatchersTest, NamesMember_CXXDependentScopeMemberExpr) {
 
   // Member functions:
Index: clang/lib/ASTMatchers/ASTMatchFinder.cpp
===
--- clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -143,6 +143,17 @@
 return Matches;
   }
 
+  bool TraverseFunctionHelper(FunctionDecl *FD) {
+if (Finder->isTraversalIgnoringImplicitNodes()) {
+  for (auto *P : FD->parameters())
+if (!TraverseDecl(P)) {
+  return false;
+}
+}
+return RecursiveASTVisitor::TraverseFunctionHelper(
+FD);
+  }
+
   // The following are overriding methods from the base visitor class.
   // They are public only to allow CRTP to work. They are *not *part
   // of the public API of this class.
Index: clang/lib/AST/ParentMapContext.cpp
===
--- clang/lib/AST/ParentMapContext.cpp
+++ clang/lib/AST/ParentMapContext.cpp
@@ -345,7 +345,7 @@
 class ParentMapContext::ParentMap::ASTVisitor
 : public RecursiveASTVisitor {
 public:
-  ASTVisitor(ParentMap ) : Map(Map) {}
+  ASTVisitor(ParentMap , ASTContext ) : Map(Map), Ctx(Ctx) {}
 
 private:
   friend class RecursiveASTVisitor;
@@ -422,6 +422,19 @@
 );
   }
   bool TraverseTypeLoc(TypeLoc TypeLocNode) {
+if (Ctx.getParentMapContext().getTraversalKind() ==
+TK_IgnoreUnlessSpelledInSource) {
+  if (auto FPTL = TypeLocNode.getAs()) {
+for (unsigned I = 0, E = FPTL.getNumParams(); I != E; ++I) {
+  if (auto *P = FPTL.getParam(I)) {
+if (!TraverseDecl(P))
+  return false;
+  }
+}
+return true;
+  }
+}
+
 return TraverseNode(
 TypeLocNode, DynTypedNode::create(TypeLocNode),
 [&] { return VisitorBase::TraverseTypeLoc(TypeLocNode); },
@@ -446,11 +459,12 @@
   }
 
   ParentMap 
+  ASTContext 
   llvm::SmallVector ParentStack;
 };
 
 ParentMapContext::ParentMap::ParentMap(ASTContext ) {
-