[clang-tools-extra] r267718 - Clean up the include fixer 'driver' a bit and make the database configurable.
Benjamin Kramer via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 27 07:24:32 PDT 2016
Author: d0k
Date: Wed Apr 27 09:24:32 2016
New Revision: 267718
URL: http://llvm.org/viewvc/llvm-project?rev=267718&view=rev
Log:
Clean up the include fixer 'driver' a bit and make the database configurable.
Also add a test for it. The library is covered by unit tests, the driver
was not.
Added:
clang-tools-extra/trunk/test/include-fixer/
clang-tools-extra/trunk/test/include-fixer/fixeddb.cpp
Modified:
clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp
Modified: clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp?rev=267718&r1=267717&r2=267718&view=diff
==============================================================================
--- clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp (original)
+++ clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp Wed Apr 27 09:24:32 2016
@@ -15,35 +15,70 @@
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/CommandLine.h"
using namespace clang;
+using namespace llvm;
-static llvm::cl::OptionCategory tool_options("Tool options");
+namespace {
+cl::OptionCategory IncludeFixerCategory("Tool options");
+
+enum DatabaseFormatTy {
+ fixed, //< Hard-coded mapping.
+};
+
+cl::opt<DatabaseFormatTy> DatabaseFormat(
+ "db", cl::desc("Specify input format"),
+ cl::values(clEnumVal(fixed, "Hard-coded mapping"), clEnumValEnd),
+ cl::init(fixed), cl::cat(IncludeFixerCategory));
+
+cl::opt<std::string> Input("input",
+ cl::desc("String to initialize the database"),
+ cl::cat(IncludeFixerCategory));
+} // namespace
int main(int argc, const char **argv) {
- clang::tooling::CommonOptionsParser options(argc, argv, tool_options);
- clang::tooling::ClangTool tool(options.getCompilations(),
- options.getSourcePathList());
+ tooling::CommonOptionsParser options(argc, argv, IncludeFixerCategory);
+ tooling::ClangTool tool(options.getCompilations(),
+ options.getSourcePathList());
+
// Set up the data source.
- std::map<std::string, std::vector<std::string>> XrefsMap = {
- {"std::string", {"<string>"}}};
- auto XrefsDB =
- llvm::make_unique<include_fixer::InMemoryXrefsDB>(std::move(XrefsMap));
+ std::unique_ptr<include_fixer::XrefsDB> XrefsDB;
+ switch (DatabaseFormat) {
+ case fixed: {
+ // Parse input and fill the database with it.
+ // <symbol>=<header><, header...>
+ // Multiple symbols can be given, separated by semicolons.
+ std::map<std::string, std::vector<std::string>> XrefsMap;
+ SmallVector<StringRef, 4> SemicolonSplits;
+ StringRef(Input).split(SemicolonSplits, ";");
+ for (StringRef Pair : SemicolonSplits) {
+ auto Split = Pair.split('=');
+ std::vector<std::string> Headers;
+ SmallVector<StringRef, 4> CommaSplits;
+ Split.second.split(CommaSplits, ",");
+ for (StringRef Header : CommaSplits)
+ Headers.push_back(Header.trim());
+ XrefsMap[Split.first.trim()] = std::move(Headers);
+ }
+ XrefsDB =
+ llvm::make_unique<include_fixer::InMemoryXrefsDB>(std::move(XrefsMap));
+ break;
+ }
+ }
// Now run our tool.
- std::vector<clang::tooling::Replacement> Replacements;
+ std::vector<tooling::Replacement> Replacements;
include_fixer::IncludeFixerActionFactory Factory(*XrefsDB, Replacements);
tool.run(&Factory); // Always succeeds.
// Set up a new source manager for applying the resulting replacements.
- llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(
- new clang::DiagnosticOptions);
- clang::DiagnosticsEngine Diagnostics(new clang::DiagnosticIDs, &*DiagOpts);
- clang::TextDiagnosticPrinter DiagnosticPrinter(llvm::outs(), &*DiagOpts);
- clang::SourceManager source_manager(Diagnostics, tool.getFiles());
+ IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
+ DiagnosticsEngine Diagnostics(new DiagnosticIDs, &*DiagOpts);
+ TextDiagnosticPrinter DiagnosticPrinter(outs(), &*DiagOpts);
+ SourceManager SM(Diagnostics, tool.getFiles());
Diagnostics.setClient(&DiagnosticPrinter, false);
// Write replacements to disk.
- clang::Rewriter Rewrites(source_manager, clang::LangOptions());
- clang::tooling::applyAllReplacements(Replacements, Rewrites);
+ Rewriter Rewrites(SM, LangOptions());
+ tooling::applyAllReplacements(Replacements, Rewrites);
return Rewrites.overwriteChangedFiles();
}
Added: clang-tools-extra/trunk/test/include-fixer/fixeddb.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/include-fixer/fixeddb.cpp?rev=267718&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/include-fixer/fixeddb.cpp (added)
+++ clang-tools-extra/trunk/test/include-fixer/fixeddb.cpp Wed Apr 27 09:24:32 2016
@@ -0,0 +1,9 @@
+// REQUIRES: shell
+// RUN: sed -e 's#//.*$##' %s > %t.cpp
+// RUN: clang-include-fixer -input='foo= "foo.h","bar.h"' %t.cpp --
+// RUN: FileCheck %s -input-file=%t.cpp
+
+// CHECK: #include "foo.h"
+// CHECK: foo f;
+
+foo f;
More information about the cfe-commits
mailing list