LegalizeAdulthood added inline comments.

================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:5435-5442
+/// Matches two consecutive statements within a compound statement.
+///
+/// Given
+/// \code
+///   { if (x > 0) return true; return false; }
+/// \endcode
+/// compoundStmt(hasSubstatementSequence(ifStmt(), returnStmt()))
----------------
LegalizeAdulthood wrote:
> aaron.ballman wrote:
> > LegalizeAdulthood wrote:
> > > aaron.ballman wrote:
> > > > LegalizeAdulthood wrote:
> > > > > aaron.ballman wrote:
> > > > > > How do we extend this to support testing arbitrary sequences of 
> > > > > > statements? (If this supports two statements, someone will find a 
> > > > > > need for three, etc).
> > > > > Yeah, I was wondering that too.  I didn't see (but didn't look 
> > > > > extensively) any support for variadic matchers taking a parameter 
> > > > > pack.
> > > > > 
> > > > > I stopped at 2 because this suits my immediate needs with 
> > > > > `readability-simplify-boolean-expr` where I have to manually loop 
> > > > > over `CompoundStmt` matches in order to verify that the `if (x) 
> > > > > return true; return false;` constructs consist of two adjacent 
> > > > > statements.
> > > > I don't think we have any variadic matchers yet to model on, but I 
> > > > think if this is only needed for one check, we can add it in the 
> > > > current form as a local matcher for that check. Whenever we figure out 
> > > > how to give the better interface through the static and dynamic 
> > > > matchers, then we can figure out how to lift this to the general 
> > > > matcher interface.
> > > > 
> > > > WDYT?
> > > I don't think it is harmful to make it visible to all and I think it is 
> > > helpful.
> > > Defining it in ASTMatchers, enables using it in `clang-query`, for 
> > > instance.
> > > 
> > I contend this is not a generally useful matcher without supporting an 
> > arbitrary number of statements. Even then, to be honest, it's questionable 
> > whether there's sufficient need for this to be a public matcher. Typically, 
> > we don't expose a new public matcher unless there's a general need for it, 
> > and this one is already pretty borderline even if it's fully generalized. 
> > This file is *very* expensive to instantiate and it gets used in a lot of 
> > places, so that's one of the primary reasons we don't expose matchers from 
> > here unless they're generally useful.
> > 
> > Unless @klimek or another AST matcher code owner thinks this is useful in 
> > general (to multiple checks people are likely to want to write even if 
> > they're not contributing the checks to the community), I'm opposed to 
> > exposing this as-is. However, adding it as a private matcher for the check 
> > that needs the limited functionality would get no opposition from me (and 
> > this implementation looks correct as well).
> My thoughts:
> 
> I'm OK with moving it as a private matcher as it would simplify a big chunk 
> of code
> in the simplify-boolean-expr check.
> 
> I agree that ASTMatchers.h is used all over the place and at a minimum causes 
> a
> huge amount of rebuild.
> 
> Regarding the general usefulness of the matcher, let me elaborate on my 
> motivation
> for adding this matcher.
> 
> I see it from the viewpoint of a developer of checks/refactorings.
> 
> I really want us to get to a world where a complete refactoring can be 
> specified as
> a script input to a refactoring tool.  Eliminating the need to write C++ that 
> directly
> manipulates the AST and the edits will lower the bar for entry for other 
> people
> writing automated changes to their codebases.
> 
> Since the last time I worked in the clang codebase, the transformer library 
> has
> been added.  With this new library, I think all we're missing is a parser 
> that matches
> the input script to the necessary calls to code in the transformer library.  
> Once we
> do this, I think the need for more and higher-level matchers will become 
> evident
> and a matcher like this is the only way you can specify that a statement Y
> immediately follows statement X purely through matchers.  Current matchers
> don't even let you specify relative ordering of statements.  The best you can 
> do
> is assert that a block contains the statements of interest and then you must 
> write
> your own C++ code to walk the block and determine if they fit your actual
> match criteria.
Also, regarding a variadic version of this matcher, I'd be curious to try it out
just from a learning/programming perspective, but I'm not sure how I'd go about
it.  Suggestions on a plan of attack would be most welcome! `:)`



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

https://reviews.llvm.org/D116518

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

Reply via email to