PrintFunctionNames.cpp revision f56a488a6bdfe56ca814f37d384afa67c67f9dd5
1//===- PrintFunctionNames.cpp ---------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Example clang plugin which simply prints the names of all the top-level decls
11// in the input file.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Frontend/FrontendPluginRegistry.h"
16#include "clang/AST/ASTConsumer.h"
17#include "clang/AST/AST.h"
18#include "clang/Frontend/CompilerInstance.h"
19#include "llvm/Support/raw_ostream.h"
20using namespace clang;
21
22namespace {
23
24class PrintFunctionsConsumer : public ASTConsumer {
25public:
26  virtual void HandleTopLevelDecl(DeclGroupRef DG) {
27    for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
28      const Decl *D = *i;
29      if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
30        llvm::errs() << "top-level-decl: \"" << ND->getNameAsString() << "\"\n";
31    }
32  }
33};
34
35class PrintFunctionNamesAction : public PluginASTAction {
36protected:
37  ASTConsumer *CreateASTConsumer(CompilerInstance &CI, llvm::StringRef) {
38    return new PrintFunctionsConsumer();
39  }
40
41  bool ParseArgs(const CompilerInstance &CI,
42                 const std::vector<std::string>& args) {
43    for (unsigned i = 0, e = args.size(); i != e; ++i) {
44      llvm::errs() << "PrintFunctionNames arg = " << args[i] << "\n";
45
46      // Example error handling.
47      if (args[i] == "-an-error") {
48        Diagnostic &D = CI.getDiagnostics();
49        unsigned DiagID = D.getCustomDiagID(
50          Diagnostic::Error, "invalid argument '" + args[i] + "'");
51        D.Report(DiagID);
52        return false;
53      }
54    }
55    if (args.size() && args[0] == "help")
56      PrintHelp(llvm::errs());
57
58    return true;
59  }
60  void PrintHelp(llvm::raw_ostream& ros) {
61    ros << "Help for PrintFunctionNames plugin goes here\n";
62  }
63
64};
65
66}
67
68static FrontendPluginRegistry::Add<PrintFunctionNamesAction>
69X("print-fns", "print function names");
70