summaryrefslogtreecommitdiffstats
path: root/tool-template
diff options
context:
space:
mode:
authorSam Panzer <espanz@gmail.com>2012-08-24 23:29:33 +0000
committerSam Panzer <espanz@gmail.com>2012-08-24 23:29:33 +0000
commitc6bcc7acee726923819d4e08de3cb6db41b88d69 (patch)
tree6672e83d93cd93939f55a8da911f799dab94ff2b /tool-template
parentbf9023505310501911bad9e9a79c95d415629a32 (diff)
Reverted to correct commit this time.
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@162624 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tool-template')
-rw-r--r--tool-template/CMakeLists.txt6
-rw-r--r--tool-template/Makefile24
-rw-r--r--tool-template/ToolTemplate.cpp106
3 files changed, 136 insertions, 0 deletions
diff --git a/tool-template/CMakeLists.txt b/tool-template/CMakeLists.txt
new file mode 100644
index 00000000..cf14a9f5
--- /dev/null
+++ b/tool-template/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_clang_executable(tool-template
+ ToolTemplate.cpp
+ )
+
+target_link_libraries(tool-template
+ clangEdit clangTooling clangBasic clangAST clangASTMatchers)
diff --git a/tool-template/Makefile b/tool-template/Makefile
new file mode 100644
index 00000000..6126d3a4
--- /dev/null
+++ b/tool-template/Makefile
@@ -0,0 +1,24 @@
+##===-------- tools/toolTemplate/Makefile ------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+CLANG_LEVEL := ../../..
+
+TOOLNAME = tool-template
+NO_INSTALL = 1
+
+# No plugins, optimize startup time.
+TOOL_NO_EXPORTS = 1
+
+include $(CLANG_LEVEL)/../../Makefile.config
+LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser support mc
+USEDLIBS = clangTooling.a clangFrontend.a clangSerialization.a clangDriver.a \
+ clangRewrite.a clangParse.a clangSema.a clangAnalysis.a \
+ clangAST.a clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a
+
+include $(CLANG_LEVEL)/Makefile
diff --git a/tool-template/ToolTemplate.cpp b/tool-template/ToolTemplate.cpp
new file mode 100644
index 00000000..93b01892
--- /dev/null
+++ b/tool-template/ToolTemplate.cpp
@@ -0,0 +1,106 @@
+//===---- tools/extra/ToolTemplate.cpp - Template for refactoring tool ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements an empty refactoring tool using the clang tooling.
+// The goal is to lower the "barrier to entry" for writing refactoring tools.
+//
+// Usage:
+// tool-template <cmake-output-dir> <file1> <file2> ...
+//
+// Where <cmake-output-dir> is a CMake build directory in which a file named
+// compile_commands.json exists (enable -DCMAKE_EXPORT_COMPILE_COMMANDS in
+// CMake to get this output).
+//
+// <file1> ... specify the paths of files in the CMake source tree. This path
+// is looked up in the compile command database. If the path of a file is
+// absolute, it needs to point into CMake's source tree. If the path is
+// relative, the current working directory needs to be in the CMake source
+// tree and the file must be in a subdirectory of the current working
+// directory. "./" prefixes in the relative files will be automatically
+// removed, but the rest of a relative path must be a suffix of a path in
+// the compile command line database.
+//
+// For example, to use tool-template on all files in a subtree of the
+// source tree, use:
+//
+// /path/in/subtree $ find . -name '*.cpp'|
+// xargs tool-template /path/to/build
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/FrontendActions.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Tooling/CompilationDatabase.h"
+#include "clang/Tooling/Refactoring.h"
+#include "clang/Tooling/Tooling.h"
+#include "llvm/ADT/OwningPtr.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/MemoryBuffer.h"
+
+using namespace clang;
+using namespace clang::ast_matchers;
+using namespace clang::tooling;
+using namespace llvm;
+
+namespace {
+class ToolTemplateCallback : public MatchFinder::MatchCallback {
+ public:
+ ToolTemplateCallback(Replacements *Replace) : Replace(Replace) {}
+
+ virtual void run(const MatchFinder::MatchResult &Result) {
+// 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;
+ }
+
+ private:
+ Replacements *Replace;
+};
+} // end anonymous namespace
+
+// Set up the command line options
+cl::opt<std::string> BuildPath(
+ cl::Positional,
+ cl::desc("<build-path>"));
+
+cl::list<std::string> SourcePaths(
+ cl::Positional,
+ cl::desc("<source0> [... <sourceN>]"),
+ cl::OneOrMore);
+
+int main(int argc, const char **argv) {
+ llvm::OwningPtr<CompilationDatabase> Compilations(
+ FixedCompilationDatabase::loadFromCommandLine(argc, argv));
+ cl::ParseCommandLineOptions(argc, argv);
+ if (!Compilations) { // Couldn't find a compilation DB from the command line
+ std::string ErrorMessage;
+ Compilations.reset(
+ !BuildPath.empty() ?
+ CompilationDatabase::autoDetectFromDirectory(BuildPath, ErrorMessage) :
+ CompilationDatabase::autoDetectFromSource(SourcePaths[0], ErrorMessage)
+ );
+
+// Still no compilation DB? - bail.
+ if (!Compilations)
+ llvm::report_fatal_error(ErrorMessage);
+ }
+ RefactoringTool Tool(*Compilations, SourcePaths);
+ ast_matchers::MatchFinder Finder;
+ ToolTemplateCallback Callback(&Tool.getReplacements());
+
+// 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));
+}