steveire added inline comments.

================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:4358
               internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
-  auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
-                                            Node.init_end(), Finder, Builder);
-  if (MatchIt == Node.init_end())
-    return false;
-  return (*MatchIt)->isWritten() || 
!Finder->isTraversalIgnoringImplicitNodes();
+  auto MatchIt = matchesFirstInPointerRangeIgnoreUnspelled(
+      InnerMatcher, Node.init_begin(), Node.init_end(), Finder, Builder);
----------------
aaron.ballman wrote:
> Since you're touching the line anyway, might as well fix the lint warning and 
> use `const auto *`.
This is iteration from a `begin()` to an `end()`. It's appropriate to use 
`auto` for an iterator type instead of `const auto *`.

You don't have to change it back now, but the request to change it in the first 
place isn't consistent. I also don't think it's ever appropriate to use `const 
auto *` or `auto *` instead of just `auto`, so make of that what you wish :).

Anyway, to completely dodge the issue you can inline it and get rid of the 
`MatchIt` altogether without changing the meaning of the code.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchersInternal.h:817-819
+/// Finds the first node in a pointer range that matches the given
+/// matcher. Ignores any nodes that aren't spelled in source if Finder is 
ignore
+/// them.
----------------
aaron.ballman wrote:
> njames93 wrote:
> > aaron.ballman wrote:
> > > Comment looks like it can be re-flowed to 80 cols.
> > > 
> > > "if Finder is ignore them" -> "if Finder is ignoring them"
> > > 
> > > This comment is a bit odd because I would expect the same behavior from 
> > > `matchesFirstInPointerRange` -- e.g., if the finder says "ignore unless 
> > > spelled in source", I would not expect to have to call a function that 
> > > also says to honor that, so this feels a bit fragile. I was sort of 
> > > thinking that an (optional?) parameter to `matchesFirstInPointerPair` 
> > > would be slightly better (and reduce code duplication), but that feels 
> > > similarly fragile.
> > > 
> > > Would the logic be wrong to always honor what the `Finder` says about 
> > > ignoring implicit nodes?
> > The issue is not all nodes have a nice way to say they are implicit and 
> > should be ignored.
> This compounds the problem by making the AST matchers harder to write because 
> now we're enshrining that there's two different APIs that do the same thing 
> but you have to remember which one needs to be called in what mode and for 
> which kinds of nodes.
> 
> "Go fix the AST nodes" is not a solution for this patch, but I think our 
> long-term goal should be to try to add some uniformity at the AST node level 
> so that we can eventually remove APIs like this and hopefully reduce the 
> amount of places we're doing `isa<>` checks for specific node types to try to 
> decide whether it was spelled in the source or not. Obviously, I'm not asking 
> you to do that work -- just trying to see if we have some agreement on an 
> aspirational goal.
> 
> Concretely, what do you think about an API like:
> ```
> // FIXME: This is necessary only because there's no good general way to know 
> // whether an AST node was spelled in source or not, so callers of 
> matchesFirstInPointerRange
> // need to decide whether they want to ignore implicit nodes or not. Ideally, 
> we could use the
> // Finder object only to make this decision, but we're not there quite yet.
> enum class MatchFirstPointerInRangeMode {
>   AsIs,
>   IgnoreUnlessSpelledInSource
> };
> 
> template <typename MatcherT, typename IteratorT>
> IteratorT matchesFirstInPointerRange(const MatcherT &Matcher, IteratorT Start,
>                                      IteratorT End, ASTMatchFinder *Finder,
>                                      BoundNodesTreeBuilder *Builder,
>                                      MatchFirstPointerInRangeMode Mode = 
> MatchFirstPointerInRangeMode::AsIs);
> ```
> ```
> enum class MatchFirstPointerInRangeMode {
>   AsIs,
>   IgnoreUnlessSpelledInSource
> };
> ```

Why introduce a new enum instead of just using `clang::TraversalKind`?



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97246

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

Reply via email to