summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2017-11-03 16:03:56 +0000
committerEric Liu <ioeric@google.com>2017-11-03 16:03:56 +0000
commitb0b8f038745e3688ed77ba7d330caaeb77574cec (patch)
tree1411ff9d72d67643d757e3ce193c335e8b2ce184
parent152ad0505067afea942699c5ccaaa11ec56e6f43 (diff)
downloadbcm5719-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.txt1
-rw-r--r--clang-tools-extra/tool-template/ToolTemplate.cpp50
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";
+ });
}
OpenPOWER on IntegriCloud