diff options
| author | Sam Panzer <espanz@gmail.com> | 2012-08-24 23:29:33 +0000 |
|---|---|---|
| committer | Sam Panzer <espanz@gmail.com> | 2012-08-24 23:29:33 +0000 |
| commit | c6bcc7acee726923819d4e08de3cb6db41b88d69 (patch) | |
| tree | 6672e83d93cd93939f55a8da911f799dab94ff2b /tool-template | |
| parent | bf9023505310501911bad9e9a79c95d415629a32 (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.txt | 6 | ||||
| -rw-r--r-- | tool-template/Makefile | 24 | ||||
| -rw-r--r-- | tool-template/ToolTemplate.cpp | 106 |
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)); +} |
