diff options
author | Eric Liu <ioeric@google.com> | 2017-11-03 16:03:56 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2017-11-03 16:03:56 +0000 |
commit | b0b8f038745e3688ed77ba7d330caaeb77574cec (patch) | |
tree | 1411ff9d72d67643d757e3ce193c335e8b2ce184 | |
parent | 152ad0505067afea942699c5ccaaa11ec56e6f43 (diff) | |
download | bcm5719-llvm-b0b8f038745e3688ed77ba7d330caaeb77574cec.tar.gz bcm5719-llvm-b0b8f038745e3688ed77ba7d330caaeb77574cec.zip |
Use ToolExecutor framework in the sample tool-template.
llvm-svn: 317333
-rw-r--r-- | clang-tools-extra/tool-template/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang-tools-extra/tool-template/ToolTemplate.cpp | 50 |
2 files changed, 42 insertions, 9 deletions
diff --git a/clang-tools-extra/tool-template/CMakeLists.txt b/clang-tools-extra/tool-template/CMakeLists.txt index 8223e4c8881..125523ab5f2 100644 --- a/clang-tools-extra/tool-template/CMakeLists.txt +++ b/clang-tools-extra/tool-template/CMakeLists.txt @@ -12,4 +12,5 @@ target_link_libraries(tool-template clangBasic clangFrontend clangTooling + clangToolingRefactor ) diff --git a/clang-tools-extra/tool-template/ToolTemplate.cpp b/clang-tools-extra/tool-template/ToolTemplate.cpp index f97575e5e44..5345d77f075 100644 --- a/clang-tools-extra/tool-template/ToolTemplate.cpp +++ b/clang-tools-extra/tool-template/ToolTemplate.cpp @@ -40,7 +40,9 @@ #include "clang/Frontend/FrontendActions.h" #include "clang/Lex/Lexer.h" #include "clang/Tooling/CommonOptionsParser.h" +#include "clang/Tooling/Execution.h" #include "clang/Tooling/Refactoring.h" +#include "clang/Tooling/Refactoring/AtomicChange.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" @@ -54,19 +56,31 @@ using namespace llvm; namespace { class ToolTemplateCallback : public MatchFinder::MatchCallback { public: - ToolTemplateCallback(std::map<std::string, Replacements> *Replace) - : Replace(Replace) {} + ToolTemplateCallback(ExecutionContext &Context) : Context(Context) {} void run(const MatchFinder::MatchResult &Result) override { // TODO: This routine will get called for each thing that the matchers // find. // At this point, you can examine the match, and do whatever you want, // including replacing the matched text with other text - (void)Replace; // This to prevent an "unused member variable" warning; + auto *D = Result.Nodes.getNodeAs<NamedDecl>("decl"); + assert(D); + // Use AtomicChange to get a key. + if (D->getLocStart().isValid()) { + AtomicChange Change(*Result.SourceManager, D->getLocStart()); + Context.reportResult(Change.getKey(), D->getQualifiedNameAsString()); + } + } + + void onStartOfTranslationUnit() override { + Context.reportResult("START", "Start of TU."); + } + void onEndOfTranslationUnit() override { + Context.reportResult("END", "End of TU."); } private: - std::map<std::string, Replacements> *Replace; + ExecutionContext &Context; }; } // end anonymous namespace @@ -76,15 +90,33 @@ static cl::OptionCategory ToolTemplateCategory("tool-template options"); int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); - CommonOptionsParser OptionsParser(argc, argv, ToolTemplateCategory); - RefactoringTool Tool(OptionsParser.getCompilations(), - OptionsParser.getSourcePathList()); + + auto Executor = clang::tooling::createExecutorFromCommandLineArgs( + argc, argv, ToolTemplateCategory); + + if (!Executor) { + llvm::errs() << llvm::toString(Executor.takeError()) << "\n"; + return 1; + } + ast_matchers::MatchFinder Finder; - ToolTemplateCallback Callback(&Tool.getReplacements()); + ToolTemplateCallback Callback(*Executor->get()->getExecutionContext()); // TODO: Put your matchers here. // Use Finder.addMatcher(...) to define the patterns in the AST that you // want to match against. You are not limited to just one matcher! + // + // This is a sample matcher: + Finder.addMatcher( + namedDecl(cxxRecordDecl(), isExpansionInMainFile()).bind("decl"), + &Callback); - return Tool.run(newFrontendActionFactory(&Finder).get()); + auto Err = Executor->get()->execute(newFrontendActionFactory(&Finder)); + if (Err) { + llvm::errs() << llvm::toString(std::move(Err)) << "\n"; + } + Executor->get()->getToolResults()->forEachResult( + [](llvm::StringRef key, llvm::StringRef value) { + llvm::errs() << "----" << key.str() << "\n" << value.str() << "\n"; + }); } |