LegalizeAdulthood marked an inline comment as done.
LegalizeAdulthood added a comment.

In D116328#3221995 <https://reviews.llvm.org/D116328#3221995>, @aaron.ballman 
wrote:

>> Previously if you wanted to match the statement associated with a case, 
>> default, or labelled statement, you had to use hasDescendant.
>
> This isn't true. You can use `has()` to do direct substatemematching, and I'm 
> wondering whether we need this new matcher at all. e.g., 
> https://godbolt.org/z/K5sYP757r

Well, the whole point of this was that previous review comments were 
complaining that I was using an "expensive" matcher
instead of one that got right to the point.  (What's the difference between 
`has` and `hasDescendent` anyway?)

I looked at the implementation of "has" and it has a huge amount of machinery 
underneath it.  I drilled in as follows (my ToT hash is 
773ab3c6655f4d2beec25bb3516b4d4fe2eea990 
<https://reviews.llvm.org/rG773ab3c6655f4d2beec25bb3516b4d4fe2eea990>):
ASTMatchers.h:3391 declares `has` as an instance of 
`internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>`
`ArgumentAdaptingMatcherFun` appears just to be a factory mechanism for 
creating the appropriate matcher.
`HasMatcher` seems to do the actual matching
`HasMatcher<T, ChildT>::matches` delegates to 
`ASTMatchFinder::matchesChildOf(const T &Node, ...)`
`ASTMatchFinder::matchesChildOf(const T &Node, ...)` delegates to another 
overload of `matchesChildOf`(const DynTypedNode &Node, ...)` after asserting a 
static type relationship (ASTMatchersInternal.h:762)
`ASTMatchFinder::matchesChildOf(const DynTypedNode &Node, ...)` is a virtual 
function with one implementation in `MatchASTVisitor` (ASTMatchFinder.cpp:659)
`MatchASTVisitor::matchesChildOf` delegates to `memoizedMatchesRecursively` 
(ASTMatchFinder.cpp:664)
For non-memoizable nodes, `MatchASTVisitor::memoizedMatchesRecursively` 
delegates to `matchesRecursively` (ASTMatchFinder.cpp:599)

  `MatchASTVIsitor::matchesRecursively` instantiates a 
`ASTNodeNotSpelledInSourceScope` and a `MatchChildASTVisitor` upon which it 
calls `findMatch` (ASTMatchFinder.cpp:645)
  `MatchChildASTVisitor::findMatch` does a series of `DynNode.get<T>` checks 
and delegates to the appropriate overload of `MatchChildASTVisitor::traverse`, 
in our case it would be the one for `Stmt`
  `MatchChildASTVisitor::traverse<T>(const T &Node)` delegates to 
`MatchChildASTVisitor::match<T>(const T &Node)`
  `MatchChildASTVisitor::match<T>(const T &Node)` instantiates a 
`BoundNodesTreeBuilder` and calls `match` on the held `Matcher`.

Honestly, at this point, I become lost in manually tracing the code through "go 
to definition" in my IDE.  So I switched my unit test for `HasCaseSubstmt` to 
use `has` and drilled in through the debugger.
What I saw echoes the above, although I took the wrong branch in my manual 
analysis in `memoizedMatchesRecursively`, it goes down the memoization path.

However, the whole point of memoizing a result is because that result was 
expensive to compute and the memoization saves time on subsequent queries
because the result has been memorized.  In this case, it's a simple getter on 
`CaseStmt` to obtain the node against which you want to match, so I don't
see the memoization as having any particular benefit.  (The inner matcher to 
`hasSubstatement` may be expensive and could be memoized.)  For results
obtain by the visitor pattern, I can see why you'd want to memoize them as 
there is lots of code being executed to implement the Visitor pattern.



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2432
     dependentCoawaitExpr;
+
 /// Matches co_yield expressions.
----------------
aaron.ballman wrote:
> Spurious newline?
I didn't add this intentionally and I can remove it, but the general style in 
this file is to separate top-level decls by a blank line.


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

https://reviews.llvm.org/D116328

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

Reply via email to