I couldnt get PrintFunctionNames working using visual studios due to the static variable not registering the plugin. So i tried my own methods. I found the LoadFromASTFile inside of wpa and basically scrapped it and copy pasted some of the PrintFunctionNames example inside of it.<br>
<br>Now dont know if i am heading in the wrong direction. Currently the problem is i dont know how to either get (or create?) the DeclGroupRef variable that i must pass in.<br><br>I did a search for prettyprint and i also found TypePrinter. That just made me more confused.<br>
<br>How might i list all structs (or at least top level) from an AST? I have the code below. I dont know where to go from there.<br><br><br>#include "clang/Basic/FileManager.h"<br>#include "clang/Basic/SourceManager.h"<br>
#include "clang/StaticAnalyzer/Frontend/CheckerRegistration.h"<br>#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"<br>#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"<br>
#include "clang/StaticAnalyzer/Core/PathSensitive/TransferFuncs.h"<br>#include "clang/StaticAnalyzer/Core/CheckerManager.h"<br>#include "clang/StaticAnalyzer/Checkers/LocalCheckers.h"<br>#include "clang/Frontend/ASTUnit.h"<br>
#include "clang/Frontend/CompilerInstance.h"<br>#include "clang/Index/CallGraph.h"<br>#include "clang/Index/Indexer.h"<br>#include "clang/Index/TranslationUnit.h"<br>#include "clang/Index/DeclReferenceMap.h"<br>
#include "clang/Index/SelectorMap.h"<br>#include "clang/Lex/Preprocessor.h"<br>#include "clang/Basic/TargetInfo.h"<br>#include "llvm/ADT/IntrusiveRefCntPtr.h"<br>#include "llvm/Support/CommandLine.h"<br>
#include "llvm/Support/raw_ostream.h"<br><br>#include "clang/AST/ASTConsumer.h"<br>#include "clang/AST/AST.h"<br><br>using namespace clang;<br>using namespace idx;<br><br>static llvm::cl::list<std::string> InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input AST files>"));<br>
<br>class PrintFunctionsConsumer : public ASTConsumer {<br>public:<br>  virtual void HandleTopLevelDecl(DeclGroupRef DG) {<br>    for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {<br>      const Decl *D = *i;<br>
      if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))<br>        llvm::errs() << "top-level-decl: \"" << ND->getNameAsString() << "\"\n";<br>    }<br>  }<br>};<br>
<br>int main(int argc, char **argv) {<br><br>    llvm::cl::ParseCommandLineOptions(argc, argv, "clang-wpa");<br>    std::vector<ASTUnit*> ASTUnits;<br><br>    Program Prog;<br>    Indexer Idxer(Prog);<br><br>
    if (InputFilenames.empty())<br>        return 0;<br><br>    DiagnosticOptions DiagOpts;<br>    llvm::IntrusiveRefCntPtr<Diagnostic> Diags = CompilerInstance::createDiagnostics(DiagOpts, argc, argv);<br><br><br>    auto astunit = ASTUnit::LoadFromASTFile(argv[1], Diags, FileSystemOptions(), false, 0, 0, true);<br>
    auto c = new PrintFunctionsConsumer;<br>    c->Initialize(astunit->getASTContext());<br>    //c->HandleTopLevelDecl<br>    c->PrintStats();<br><br>    return 0;<br>}<br><br>