<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 14, 2014 at 11:04 AM, Xin Hwang <span dir="ltr"><<a href="mailto:patz.hwang@gmail.com" target="_blank">patz.hwang@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks Manuel.<br>
<br>
I was thinking of adding a vardic template overload of<br>
newFrontendActionFactory to forward all the arguments to the<br>
constructor. But your way is much simpler.<br></blockquote><div><br></div><div>In some uncommitted patch/work I've got some lambda-based helpers that'll make it easier to write FrontendActionFactories without so much boilerplate, fwiw.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Regards<br>
Xin Huang<br>
<div class="HOEnZb"><div class="h5"><br>
On Tue, Oct 14, 2014 at 5:27 PM, Manuel Klimek <<a href="mailto:klimek@google.com">klimek@google.com</a>> wrote:<br>
> On Tue Oct 14 2014 at 6:08:51 AM Xin Hwang <<a href="mailto:patz.hwang@gmail.com">patz.hwang@gmail.com</a>> wrote:<br>
>><br>
>> Hello clang developers,<br>
>><br>
>> I'm making a clang tool that will transform vec.begin() into<br>
>> std::begin(vec), and add #include <iterator> if there isn't one.<br>
>> ASTMatcher is used to match all member call to vec::begin(), and I<br>
>> need a PPCallback to analyze include files.<br>
>><br>
>> I want to create a PPCallback with a ASTMatcher, but find no way to<br>
>> create a FrontendActionFactory to achive that.<br>
>><br>
>> With a FrontendAction class like below:<br>
>><br>
>> class MyFrontendAction : public clang::FrontendAction {<br>
>> public:<br>
>>     MyFrontendAction(SomeArgs args) { /* ... */ }<br>
>><br>
>>     std::unique_ptr<clang::ASTComsumer><br>
>> CreateASTConsumer(clang::CompilerInstance& ci, clang::StringRef) {<br>
>>         auto myCallback = CreateCallback(...);<br>
>>         ci.getPreprocessor().addPPCallbacks(myCallback);<br>
>>         auto myMatcher = CreateMatcher(...);<br>
>>         return myMatcher.newASTConsumer();<br>
>>     }<br>
>> };<br>
><br>
><br>
>><br>
>><br>
>> However, newFrontendActionFactory<MyFrontendAction>() cannot be used<br>
>> because there is no way to provide constructor arguments; nor can<br>
>> another overload version be used<br>
>> because it doesn't pass CompilerInstance to newASTConsumer() function:<br>
>><br>
>> template <typename FactoryT><br>
>> inline std::unique_ptr<FrontendActionFactory><br>
>> newFrontendActionFactory(FactoryT *ConsumerFactory,<br>
>> SourceFileCallbacks *Callbacks)<br>
>><br>
>> Is there any other way so that I can have a parameterized constructor<br>
>> of FrontendActionFactory and a parameterized interface of<br>
>> newASTConsumer/createASTConsumer at same time? (Except for<br>
>> re-implementing a newFrontendActionFactory that match my needs.)<br>
><br>
><br>
> Implement:<br>
> class MFAF : public clang::tooling::FrontendActionFactory {<br>
>   MFAF(SomeArgs args) : args(args) {}<br>
><br>
>   clang::FrontendAction *create() {<br>
>     return new MyFrontendAction(args);<br>
>   }<br>
><br>
>   SomeArgs args;<br>
> };<br>
><br>
> And use that? newFrontendActionFactory is just a convenience function for<br>
> cases where it makes your life easier - in the end, what it spews out is a<br>
> FrontendActionFactory anyway...<br>
><br>
> Cheers,<br>
> /Manuel<br>
><br>
>><br>
>><br>
>> Or am I doing it in the right way?<br>
>><br>
>> Any other suggestion? Thanks!<br>
>><br>
>> Regards<br>
>> Xin Huang<br>
>> _______________________________________________<br>
>> cfe-dev mailing list<br>
>> <a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div></div>