|  | #include "clang/AST/ASTConsumer.h" | 
|  | #include "clang/AST/RecursiveASTVisitor.h" | 
|  | #include "clang/Frontend/ASTConsumers.h" | 
|  | #include "clang/Frontend/CompilerInstance.h" | 
|  | #include "clang/Frontend/FrontendActions.h" | 
|  |  | 
|  | using namespace clang; | 
|  |  | 
|  | namespace { | 
|  | class ExtractAPIVisitor : public RecursiveASTVisitor<ExtractAPIVisitor> { | 
|  | public: | 
|  | bool VisitNamedDecl(NamedDecl *Decl) { | 
|  | llvm::outs() << Decl->getName() << "\n"; | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | class ExtractAPIConsumer : public ASTConsumer { | 
|  | public: | 
|  | void HandleTranslationUnit(ASTContext &Context) override { | 
|  | Visitor.TraverseDecl(Context.getTranslationUnitDecl()); | 
|  | } | 
|  |  | 
|  | private: | 
|  | ExtractAPIVisitor Visitor; | 
|  | }; | 
|  | } // namespace | 
|  |  | 
|  | std::unique_ptr<ASTConsumer> | 
|  | ExtractAPIAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { | 
|  | return std::make_unique<ExtractAPIConsumer>(); | 
|  | } |