<div dir="ltr"><div><div><div>No, I could see your code, but you don't have anything from the SO post in your code.<br><br></div>So if you describe what the exact PROBLEM is that you are seeing when you try to implement that, then perhaps someone can help (I have a basic understanding of AST's and their visitors, but by no means an expert, so if it's complicated, I may not know how to fix it)<br><br></div>Also, use reply-all when replying, so that here is a copy going to the mailing list, otherwise someone else may well ask/answer/comment the same thing again, which is a waste of time.<br><br>--<br></div>Mats<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 23 June 2016 at 17:56, Andreas Georgiou <span dir="ltr"><<a href="mailto:antreas_geo@hotmail.com" target="_blank">antreas_geo@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Sorry I inserted my code as an attachment. I thought you could see that. Anyway am pasting in again below.<div><br></div><div><div>#include "clang/Driver/Options.h"</div><div>#include "clang/AST/AST.h"</div><div>#include "clang/AST/ASTContext.h"</div><div>#include "clang/AST/ASTConsumer.h"</div><div>#include "clang/AST/RecursiveASTVisitor.h"</div><div>#include "clang/Frontend/ASTConsumers.h"</div><div>#include "clang/Frontend/FrontendActions.h"</div><div>#include "clang/Frontend/CompilerInstance.h"</div><div>#include "clang/Tooling/CommonOptionsParser.h"</div><div>#include "clang/Tooling/Tooling.h"</div><div>#include "clang/Rewrite/Core/Rewriter.h"</div><div>#include <iostream></div><div>#include <fstream></div><div><br></div><div>using namespace std;</div><div>using namespace clang;</div><div>using namespace clang::driver;</div><div>using namespace clang::tooling;</div><div>using namespace llvm;</div><div><br></div><div>Rewriter rewriter;</div><div>int numFunctions = 0;</div><div>int numVariables = 0;</div><div>int numFuncCalls = 0;</div><div><br></div><div>ofstream APIs;</div><div>LangOptions LangOpts;</div><div>PrintingPolicy Policy(LangOpts);</div><div><br></div><div><br></div><div>class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> {</div><div>private:</div><div>    ASTContext *astContext; // used for getting additional AST info</div><div><span style="white-space:pre-wrap">     </span>//SourceManager *SM;</div><div>public:</div><div>    explicit ExampleVisitor(CompilerInstance *CI) </div><div>      : astContext(&(CI->getASTContext())) //SM(&(CI->getASTContext()))// directly initialize private members</div><div>    {</div><div><span style="white-space:pre-wrap">        </span>}</div><div>    virtual bool VisitVarDecl(VarDecl *var) </div><div>    {</div><div>        numVariables++;</div><div>        string varName = var->getQualifiedNameAsString();</div><div><span style="white-space:pre-wrap">           </span>string varType = var->getType().getAsString();</div><div><span style="white-space:pre-wrap">                </span>cout << "Found variable declaration: " << varName << " of type " << varType << "\n";        </div><div><span style="white-space:pre-wrap">             </span>APIs << varType << ", ";</div><div>        return true;</div><div>    }</div><div><br></div><div>    virtual bool VisitFunctionDecl(FunctionDecl *func)</div><div>    {  </div><div>        numFunctions++;</div><div>        string funcName = func->getNameInfo().getName().getAsString();</div><div><span style="white-space:pre-wrap">               </span>string funcType = func->getResultType().getAsString();</div><div><span style="white-space:pre-wrap">                </span>cout << "Found function declaration: " << funcName << " of type " << funcType << "\n";        </div><div><span style="white-space:pre-wrap">           </span>APIs << "\n\n" << funcName <<": ";</div><div><span style="white-space:pre-wrap">         </span>APIs << funcType << ", ";</div><div>        return true;</div><div>    }</div><div><br></div><div>    virtual bool VisitStmt(Stmt *st) </div><div>    {     </div><div><span style="white-space:pre-wrap">               </span>if (CallExpr *call = dyn_cast<CallExpr>(st)) </div><div><span style="white-space:pre-wrap">             </span>{</div><div><span style="white-space:pre-wrap">        </span>   <span style="white-space:pre-wrap">            </span>numFuncCalls++;</div><div>         <span style="white-space:pre-wrap">    </span>FunctionDecl *func_decl = call->getDirectCallee();</div><div>           <span style="white-space:pre-wrap">   </span>string funcCall = func_decl->getNameInfo().getName().getAsString();</div><div><span style="white-space:pre-wrap">                   </span>cout << "Found function call: " << funcCall << " with arguments ";<span style="white-space:pre-wrap">        </span>  <span style="white-space:pre-wrap">     </span> <span style="white-space:pre-wrap">       </span></div><div><span style="white-space:pre-wrap">                 </span>APIs << funcCall << ", ";</div><div><span style="white-space:pre-wrap">  </span>   <span style="white-space:pre-wrap">            </span>for(int i=0, j = call->getNumArgs(); i<j; i++)</div><div>   <span style="white-space:pre-wrap">        </span>   <span style="white-space:pre-wrap">            </span>{</div><div>        <span style="white-space:pre-wrap">            </span>string TypeS;</div><div>        <span style="white-space:pre-wrap">                </span>raw_string_ostream s(TypeS);</div><div>        <span style="white-space:pre-wrap">         </span>call->getArg(i)->printPretty(s, 0, Policy);</div><div>        <span style="white-space:pre-wrap">            </span>APIs<< s.str() << ", ";</div><div><span style="white-space:pre-wrap">                            </span>cout<< s.str() << ", ";</div><div>    <span style="white-space:pre-wrap">      </span>   <span style="white-space:pre-wrap">    </span>}</div><div><span style="white-space:pre-wrap">                        </span>cout << "\n";</div><div>       <span style="white-space:pre-wrap"> </span>}</div><div>        return true;</div><div>    }</div><div>};</div><div><br></div><div><br></div><div>class ExampleASTConsumer : public ASTConsumer </div><div>{</div><div>private:</div><div>    ExampleVisitor *visitor; // doesn't have to be private</div><div><br></div><div>public:</div><div>    // override the constructor in order to pass CI</div><div>    explicit ExampleASTConsumer(CompilerInstance *CI)</div><div>        : visitor(new ExampleVisitor(CI)) // initialize the visitor</div><div>    { }</div><div><br></div><div>    // override this to call our ExampleVisitor on the entire source file</div><div>    virtual void HandleTranslationUnit(ASTContext &Context) {</div><div>        /* we can use ASTContext to get the TranslationUnitDecl, which is</div><div>             a single Decl that collectively represents the entire source file */</div><div>        visitor->TraverseDecl(Context.getTranslationUnitDecl());</div><div>    }</div><div>};</div><div><br></div><div><br></div><div><br></div><div>class ExampleFrontendAction : public ASTFrontendAction {</div><div>public:</div><div>    virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, StringRef file) {</div><div>        return new ExampleASTConsumer(&CI); // pass CI pointer to ASTConsumer</div><div>    }</div><div>};</div><div><br></div><div><br></div><div><br></div><div>int main(int argc, const char **argv) </div><div>{</div><div>    if (argc < 3) </div><div>    {</div><div>    <span style="white-space:pre-wrap">  </span>cerr << "usage: " << argv[0] << " <filename> --" << endl;</div><div>    <span style="white-space:pre-wrap">        </span>return EXIT_FAILURE;</div><div>    }   </div><div>    </div><div>    APIs.open ("API.txt");</div><div>    // parse the command-line args passed to your code</div><div>    CommonOptionsParser op(argc, argv);        </div><div>    // create a new Clang Tool instance (a LibTooling environment)</div><div>    ClangTool Tool(op.getCompilations(), op.getSourcePathList());</div><div><br></div><div>    // run the Clang Tool, creating a new FrontendAction (explained below)</div><div>    int result = Tool.run(newFrontendActionFactory<ExampleFrontendAction>());</div><div><br></div><div>    cout << "\nFound " << numFunctions << " functions.\n" << "Found " << numVariables << " variable declarations.\n" << "Found " << numFuncCalls << " function calls.\n" ; </div><div>    APIs.close();</div><div>    return result;</div><span class=""><div>}</div><div><br></div><div><br></div><div><div>I have found this solution in stackoverflow but I cannot make it work. </div><div><a href="http://stackoverflow.com/questions/10454075/avoid-traversing-included-system-libaries" target="_blank">http://stackoverflow.com/questions/10454075/avoid-traversing-included-system-libaries</a></div><div>My code is based on this tutorial:</div><div><a href="https://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/" target="_blank">https://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/</a></div></div><div><br></div></span><div>The thing is. I want my AST visitor to parse the files but not to print any information not originated from the main file. </div><div>For example if there is a struct definition i "something.h" header file I dont want it to be printed in the console.</div><div><br></div><div><br></div><div>Thank you,</div><div>Andreas Georgiou</div><br><div><div class="hm HOEnZb"><hr>From: <a href="mailto:mats@planetcatfish.com" target="_blank">mats@planetcatfish.com</a><br>Date: Thu, 23 Jun 2016 16:08:05 +0100<br>Subject: Re: [cfe-dev] Implement AST visitor, avoid visiting included header files<br>To: <a href="mailto:antreas_geo@hotmail.com" target="_blank">antreas_geo@hotmail.com</a><br>CC: <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a></div><div><div class="h5"><br><br><div dir="ltr"><div>What in the solution from SO is it that you can't make work? I can't see the implementation in your code, so I can't explain what, if anything is wrong with your code. <br><br></div><div>Clearly, the compiler will have to parse header files to be able to compile any [non-trivial] source file, since there are declarations and definitions there that are required to compile the whole source. So the only way to determine if the AST is part of your main file is to use a filter to say "is this from the main file or from a header" on each (top level) AST entry, which is what the SO code does.<br></div><div><br>--<br></div>Mats<br></div><div><br><div>On 23 June 2016 at 13:28, Andreas Georgiou via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Hello, <div><br></div><div>As you can see I want to implement an AST visitor to extract some specific nodes from the AST. <div>Unfortunately my code traverses also the included header files which is something that I dont want because it prints me everything about them which is not what I want.</div><div>For example I want to extract every function declaration or variable declaration and their correspondig types. </div><div><br></div><div>I have found this solution in stackoverflow but I cannot make it work. </div><div><a href="http://stackoverflow.com/questions/10454075/avoid-traversing-included-system-libaries" target="_blank">http://stackoverflow.com/questions/10454075/avoid-traversing-included-system-libaries</a></div><div>My code is based on this tutorial:</div><div><a href="https://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/" target="_blank">https://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/</a></div><div><br></div><div>Please also find attached my code.</div><div><br></div><div>Thank you for your help.</div><span><font color="#888888"><div>Andreas Georgiou</div><div><br></div></font></span></div>                                        </div></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div></div></div></div>                                           </div></div>
</blockquote></div><br></div>