Author: ioeric Date: Fri Nov 3 09:03:56 2017 New Revision: 317333 URL: http://llvm.org/viewvc/llvm-project?rev=317333&view=rev Log: Use ToolExecutor framework in the sample tool-template.
Modified: clang-tools-extra/trunk/tool-template/CMakeLists.txt clang-tools-extra/trunk/tool-template/ToolTemplate.cpp Modified: clang-tools-extra/trunk/tool-template/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/tool-template/CMakeLists.txt?rev=317333&r1=317332&r2=317333&view=diff ============================================================================== --- clang-tools-extra/trunk/tool-template/CMakeLists.txt (original) +++ clang-tools-extra/trunk/tool-template/CMakeLists.txt Fri Nov 3 09:03:56 2017 @@ -12,4 +12,5 @@ target_link_libraries(tool-template clangBasic clangFrontend clangTooling + clangToolingRefactor ) Modified: clang-tools-extra/trunk/tool-template/ToolTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/tool-template/ToolTemplate.cpp?rev=317333&r1=317332&r2=317333&view=diff ============================================================================== --- clang-tools-extra/trunk/tool-template/ToolTemplate.cpp (original) +++ clang-tools-extra/trunk/tool-template/ToolTemplate.cpp Fri Nov 3 09:03:56 2017 @@ -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 ToolTemplateCa 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! - - return Tool.run(newFrontendActionFactory(&Finder).get()); + // + // This is a sample matcher: + Finder.addMatcher( + namedDecl(cxxRecordDecl(), isExpansionInMainFile()).bind("decl"), + &Callback); + + 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"; + }); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits