<div class="gmail_quote">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><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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::<u></u>ASTComsumer><br>
CreateASTConsumer(clang::<u></u>CompilerInstance& ci, clang::StringRef) {<br>
        auto myCallback = CreateCallback(...);<br>
        ci.getPreprocessor().<u></u>addPPCallbacks(myCallback);<br>
        auto myMatcher = CreateMatcher(...);<br>
        return myMatcher.newASTConsumer();<br>
    }<br>
};<br></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
However, newFrontendActionFactory<<u></u>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<<u></u>FrontendActionFactory><br>
newFrontendActionFactory(<u></u>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/<u></u>createASTConsumer at same time? (Except for<br>
re-implementing a newFrontendActionFactory that match my needs.)<br></blockquote><div><br></div><div>Implement:</div><div>class MFAF : public clang::tooling::FrontendActionFactory {</div><div>  MFAF(SomeArgs args) : args(args) {}</div><div><br></div><div>  clang::FrontendAction *create() {</div><div>    return new MyFrontendAction(args);</div><div>  }</div><div><br></div><div>  SomeArgs args;</div><div>};</div><div><br></div><div>And use that? newFrontendActionFactory is just a convenience function for cases where it makes your life easier - in the end, what it spews out is a FrontendActionFactory anyway...</div><div><br></div><div>Cheers,</div><div>/Manuel</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Or am I doing it in the right way?<br>
<br>
Any other suggestion? Thanks!<br>
<br>
Regards<br>
Xin Huang<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div>