ymandel added a comment.

Nice! Per Aaron's comment, it's probably worth expanding the patch description 
to explain the motivation. I assume that the key is making these first-class 
and therefore bindable?



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchFinder.h:170
                   MatchCallback *Action);
+  void addMatcher(const LambdaCaptureMatcher &NodeMatch, MatchCallback 
*Action);
   void addMatcher(const AttrMatcher &NodeMatch, MatchCallback *Action);
----------------
Since top-level metching doesn't work, I think we *don't* want to add this 
overload.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchFinder.h:225
     std::vector<std::pair<AttrMatcher, MatchCallback *>> Attr;
+    std::vector<std::pair<LambdaCaptureMatcher, MatchCallback *>> 
LambdaCapture;
     /// All the callbacks in one container to simplify iteration.
----------------
i guess remove this too, if you remove the overload?


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:4595
+
+/// Matches any capture of a lambda expression.
+///
----------------



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:4597-4605
+/// Given
+/// \code
+///   void foo() {
+///     int t = 5;
+///     auto f = [=](){ return t; };
+///   }
+/// \endcode
----------------
Maybe add some more examples? e.g. demonstrating that you can match implicit 
captures seems valuable. For that same code snippet, maybe something like:

... lambdaCapture(refersToVarDecl(hasName("t")))


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:4629-4630
+///   matches `[x](){}`.
+AST_MATCHER_P(LambdaCapture, refersToVarDecl, internal::Matcher<VarDecl>,
+              InnerMatcher) {
+  auto *capturedVar = Node.getCapturedVar();
----------------
aaron.ballman wrote:
> The name here is a bit unclear -- whether it is the matcher matching `int x;` 
> or the `x` from the capture is not clear from the name. The comment suggests 
> it's matching `x` from the capture, but I think it's actually matching the 
> `int x;` variable declaration.
> 
> Being clear on what's matched here is important when we think about 
> initializers:
> ```
> void foo() {
>   int x = 12;
>   auto f = [x = 100](){};
> }
> ```
> and
> ```
> lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("x"), 
> hasInitializer(integerLiteral(equals(100))))))
> ```
> Would you expect this to match? (This might be a good test case to add.)
In a similar vein, do we want a separate matcher on the name of the capture 
itself? e.g. an overload of `hasName`? And what about matchers for the 
initializers?  Those don't have to land in this patch, but do you think those 
would be doable?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112491

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

Reply via email to