On Tue, May 24, 2011 at 8:59 AM, Nico Weber <[email protected]> wrote: > > Hi Manuel, > this looks pretty cool. > However, as far as I understand, MatchFinder can only be used in stand-alone > tools using the Tooling infrastructure, because the public api is mostly > limited to NewFrontendActionFactory(). Do you think it's possible to somehow > make MatchASTConsumer public as well (maybe just give MatchFinder a > NewASTCosumer() function), so that the DSL can be used in places were > ASTConsumers are needed (such as in the "normal" rewriter infrastructure)? I > only skimmed the patch, so sorry if that's a superficial question.
Good question. So far I have no idea what the cases would be where we'd want to use an ASTConsumer instead of a FrontendAction... I'm currently working on a patch (based on this one) that integrates the ASTMatcher stuff with the Rewriter to get in-process refactorings - and so far I've not hit any roadblocks with regard to the FrontendAction. Do you have a code example you can point to where an ASTConsumer is required? In general, I'm not completely opposed to make the MatchASTConsumer public, but slightly wary, as it opens up a bigger intreface (needing more details about the innards of clang), and I'd like to avoid it unless there is a compelling use case. Cheers & thanks for the feedback, /Manuel > Nico > > On Mon, May 23, 2011 at 3:03 PM, Manuel Klimek <[email protected]> wrote: >> >> This patch implements an AST matching framework that allows to write tools >> that match on the C++ ASTs. The main interface is in ASTMatchers.h, an >> example implementation of a tool that removes redundant .c_str() calls is in >> the example RemoveCStrCalls.cpp (patch to llvm/clang produced by running >> this tool will be sent out shortly in an extra email). >> >> Currently we have an in-language DSL that allows to write expressions such >> as (taken from the .c_str() example): >> ConstructorCall( >> HasDeclaration(Method(HasName(StringConstructor))), >> ArgumentCountIs(2), >> // The first argument must have the form x.c_str() or p->c_str() >> // where the method is string::c_str(). We can use the copy >> // constructor of string instead (or the compiler might share >> // the string object). >> HasArgument( >> 0, >> Id("call", Call( >> Callee(Id("member", MemberExpression())), >> Callee(Method(HasName(StringCStrMethod))), >> On(Id("arg", Expression()))))), >> // The second argument is the alloc object which must not be >> // present explicitly. >> HasArgument( >> 1, >> DefaultArgument())) >> The next steps will be to build up better support for in-process >> refactorings based on the Rewriter, to build up higher-level matchers for >> common patterns, and to extend the low-level matcher library. >> (rietveld link: http://codereview.appspot.com/4552059/) >> Cheers, >> /Manuel _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
