diff options
author | Daniel Jasper <djasper@google.com> | 2012-10-03 13:28:43 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2012-10-03 13:28:43 +0000 |
commit | 5e5f726a90d234bd656a7cfd8ffd26472975f1b2 (patch) | |
tree | ab22c99a17bc7aea95bbc2033508f804aa86d0c1 /tools/clang-check | |
parent | bd59a010b5f1242b548bda1384a7a0ebbabf552d (diff) |
As opposed to the clang-fixit tool described on
http://clang.llvm.org/docs/ClangTools.html, this adds -fixit option to
clang-check. Thus, clang-check can become a general-purpose tool to run
clang capitalizing on the info stored in a compilation database.
Review: http://llvm-reviews.chandlerc.com/D51
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165110 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/clang-check')
-rw-r--r-- | tools/clang-check/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tools/clang-check/ClangCheck.cpp | 74 | ||||
-rw-r--r-- | tools/clang-check/Makefile | 4 |
3 files changed, 74 insertions, 5 deletions
diff --git a/tools/clang-check/CMakeLists.txt b/tools/clang-check/CMakeLists.txt index 85e229f45a..f5d7616fc4 100644 --- a/tools/clang-check/CMakeLists.txt +++ b/tools/clang-check/CMakeLists.txt @@ -12,6 +12,7 @@ add_clang_executable(clang-check target_link_libraries(clang-check clangTooling clangBasic + clangRewriteFrontend ) install(TARGETS clang-check diff --git a/tools/clang-check/ClangCheck.cpp b/tools/clang-check/ClangCheck.cpp index daa593ad5d..6c081ac076 100644 --- a/tools/clang-check/ClangCheck.cpp +++ b/tools/clang-check/ClangCheck.cpp @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// // -// This file implements a clang-check tool that runs the -// clang::SyntaxOnlyAction over a number of translation units. +// This file implements a clang-check tool that runs clang based on the info +// stored in a compilation database. // // This tool uses the Clang Tooling infrastructure, see // http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html @@ -20,9 +20,13 @@ #include "clang/Driver/OptTable.h" #include "clang/Driver/Options.h" #include "clang/Frontend/ASTConsumers.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Rewrite/Frontend/FixItRewriter.h" +#include "clang/Rewrite/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Path.h" using namespace clang::driver; using namespace clang::tooling; @@ -58,6 +62,68 @@ static cl::opt<std::string> ASTDumpFilter( "ast-dump-filter", cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter))); +static cl::opt<bool> Fixit( + "fixit", + cl::desc(Options->getOptionHelpText(options::OPT_fixit))); +static cl::opt<bool> FixWhatYouCan( + "fix-what-you-can", + cl::desc(Options->getOptionHelpText(options::OPT_fix_what_you_can))); + +namespace { + +// FIXME: Move FixItRewriteInPlace from lib/Rewrite/Frontend/FrontendActions.cpp +// into a header file and reuse that. +class FixItOptions : public clang::FixItOptions { +public: + FixItOptions() { + FixWhatYouCan = ::FixWhatYouCan; + } + + std::string RewriteFilename(const std::string& filename, int &fd) { + assert(llvm::sys::path::is_absolute(filename) && + "clang-fixit expects absolute paths only."); + + // We don't need to do permission checking here since clang will diagnose + // any I/O errors itself. + + fd = -1; // No file descriptor for file. + + return filename; + } +}; + +/// \brief Subclasses \c clang::FixItRewriter to not count fixed errors/warnings +/// in the final error counts. +/// +/// This has the side-effect that clang-check -fixit exits with code 0 on +/// successfully fixing all errors. +class FixItRewriter : public clang::FixItRewriter { +public: + FixItRewriter(clang::DiagnosticsEngine& Diags, + clang::SourceManager& SourceMgr, + const clang::LangOptions& LangOpts, + clang::FixItOptions* FixItOpts) + : clang::FixItRewriter(Diags, SourceMgr, LangOpts, FixItOpts) { + } + + virtual bool IncludeInDiagnosticCounts() const { return false; } +}; + +/// \brief Subclasses \c clang::FixItAction so that we can install the custom +/// \c FixItRewriter. +class FixItAction : public clang::FixItAction { +public: + virtual bool BeginSourceFileAction(clang::CompilerInstance& CI, + StringRef Filename) { + FixItOpts.reset(new FixItOptions); + Rewriter.reset(new FixItRewriter(CI.getDiagnostics(), CI.getSourceManager(), + CI.getLangOpts(), FixItOpts.get())); + return true; + } +}; + +} // namespace + // Anonymous namespace here causes problems with gcc <= 4.4 on MacOS 10.6. // "Non-global symbol: ... can't be a weak_definition" namespace clang_check { @@ -76,9 +142,11 @@ public: } int main(int argc, const char **argv) { - clang_check::ClangCheckActionFactory Factory; CommonOptionsParser OptionsParser(argc, argv); ClangTool Tool(OptionsParser.GetCompilations(), OptionsParser.GetSourcePathList()); + if (Fixit) + return Tool.run(newFrontendActionFactory<FixItAction>()); + clang_check::ClangCheckActionFactory Factory; return Tool.run(newFrontendActionFactory(&Factory)); } diff --git a/tools/clang-check/Makefile b/tools/clang-check/Makefile index 6775c65a64..426230062c 100644 --- a/tools/clang-check/Makefile +++ b/tools/clang-check/Makefile @@ -18,7 +18,7 @@ include $(CLANG_LEVEL)/../../Makefile.config LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser support mc USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \ clangTooling.a clangParse.a clangSema.a clangAnalysis.a \ - clangEdit.a clangAST.a clangLex.a clangBasic.a + clangEdit.a clangAST.a clangLex.a clangBasic.a \ + clangRewriteFrontend.a include $(CLANG_LEVEL)/Makefile - |