Author: arphaman Date: Thu Sep 14 06:16:14 2017 New Revision: 313260 URL: http://llvm.org/viewvc/llvm-project?rev=313260&view=rev Log: [refactor] Use CommonOptionsParser in clang-refactor
This commit ensures that CommonOptionsParser works with subcommands. This allows clang-refactor to use the CommonOptionsParser. Differential Revision: https://reviews.llvm.org/D37618 Modified: cfe/trunk/lib/Tooling/CommonOptionsParser.cpp cfe/trunk/test/Refactor/LocalRename/Field.cpp cfe/trunk/test/Refactor/tool-common-options.c cfe/trunk/test/Refactor/tool-test-support.c cfe/trunk/tools/clang-refactor/ClangRefactor.cpp Modified: cfe/trunk/lib/Tooling/CommonOptionsParser.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CommonOptionsParser.cpp?rev=313260&r1=313259&r2=313260&view=diff ============================================================================== --- cfe/trunk/lib/Tooling/CommonOptionsParser.cpp (original) +++ cfe/trunk/lib/Tooling/CommonOptionsParser.cpp Thu Sep 14 06:16:14 2017 @@ -84,24 +84,26 @@ std::vector<CompileCommand> ArgumentsAdj CommonOptionsParser::CommonOptionsParser( int &argc, const char **argv, cl::OptionCategory &Category, llvm::cl::NumOccurrencesFlag OccurrencesFlag, const char *Overview) { - static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); + static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden, + cl::sub(*cl::AllSubCommands)); static cl::opt<std::string> BuildPath("p", cl::desc("Build path"), - cl::Optional, cl::cat(Category)); + cl::Optional, cl::cat(Category), + cl::sub(*cl::AllSubCommands)); static cl::list<std::string> SourcePaths( cl::Positional, cl::desc("<source0> [... <sourceN>]"), OccurrencesFlag, - cl::cat(Category)); + cl::cat(Category), cl::sub(*cl::AllSubCommands)); static cl::list<std::string> ArgsAfter( "extra-arg", cl::desc("Additional argument to append to the compiler command line"), - cl::cat(Category)); + cl::cat(Category), cl::sub(*cl::AllSubCommands)); static cl::list<std::string> ArgsBefore( "extra-arg-before", cl::desc("Additional argument to prepend to the compiler command line"), - cl::cat(Category)); + cl::cat(Category), cl::sub(*cl::AllSubCommands)); cl::HideUnrelatedOptions(Category); Modified: cfe/trunk/test/Refactor/LocalRename/Field.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Refactor/LocalRename/Field.cpp?rev=313260&r1=313259&r2=313260&view=diff ============================================================================== --- cfe/trunk/test/Refactor/LocalRename/Field.cpp (original) +++ cfe/trunk/test/Refactor/LocalRename/Field.cpp Thu Sep 14 06:16:14 2017 @@ -1,4 +1,4 @@ -// RUN: clang-refactor local-rename -selection=test:%s -no-dbs %s | FileCheck %s +// RUN: clang-refactor local-rename -selection=test:%s %s -- | FileCheck %s class Baz { int /*range=*/Foo; // CHECK: int /*range=*/Bar; Modified: cfe/trunk/test/Refactor/tool-common-options.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Refactor/tool-common-options.c?rev=313260&r1=313259&r2=313260&view=diff ============================================================================== --- cfe/trunk/test/Refactor/tool-common-options.c (original) +++ cfe/trunk/test/Refactor/tool-common-options.c Thu Sep 14 06:16:14 2017 @@ -1,6 +1,3 @@ // RUN: not clang-refactor 2>&1 | FileCheck --check-prefix=MISSING_ACTION %s // MISSING_ACTION: error: no refactoring action given // MISSING_ACTION-NEXT: note: the following actions are supported: - -// RUN: not clang-refactor local-rename -no-dbs 2>&1 | FileCheck --check-prefix=MISSING_SOURCES %s -// MISSING_SOURCES: error: must provide paths to the source files when '-no-dbs' is used Modified: cfe/trunk/test/Refactor/tool-test-support.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Refactor/tool-test-support.c?rev=313260&r1=313259&r2=313260&view=diff ============================================================================== --- cfe/trunk/test/Refactor/tool-test-support.c (original) +++ cfe/trunk/test/Refactor/tool-test-support.c Thu Sep 14 06:16:14 2017 @@ -1,4 +1,4 @@ -// RUN: clang-refactor local-rename -selection=test:%s -no-dbs -v %s 2>&1 | FileCheck %s +// RUN: clang-refactor local-rename -selection=test:%s -v %s -- 2>&1 | FileCheck %s /*range=*/int test; @@ -11,12 +11,12 @@ /*range named =+0*/int test5; // CHECK: Test selection group '': -// CHECK-NEXT: 100-100 -// CHECK-NEXT: 153-153 -// CHECK-NEXT: 192-192 +// CHECK-NEXT: 95-95 +// CHECK-NEXT: 148-148 +// CHECK-NEXT: 187-187 // CHECK-NEXT: Test selection group 'named': -// CHECK-NEXT: 127-127 -// CHECK-NEXT: 213-213 +// CHECK-NEXT: 122-122 +// CHECK-NEXT: 208-208 // The following invocations are in the default group: Modified: cfe/trunk/tools/clang-refactor/ClangRefactor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-refactor/ClangRefactor.cpp?rev=313260&r1=313259&r2=313260&view=diff ============================================================================== --- cfe/trunk/tools/clang-refactor/ClangRefactor.cpp (original) +++ cfe/trunk/tools/clang-refactor/ClangRefactor.cpp Thu Sep 14 06:16:14 2017 @@ -15,6 +15,7 @@ #include "TestSupport.h" #include "clang/Rewrite/Core/Rewriter.h" +#include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Refactoring.h" #include "clang/Tooling/Refactoring/RefactoringAction.h" #include "clang/Tooling/Refactoring/Rename/RenamingAction.h" @@ -33,12 +34,6 @@ namespace opts { static cl::OptionCategory CommonRefactorOptions("Common refactoring options"); -static cl::opt<bool> - NoDatabases("no-dbs", - cl::desc("Ignore external databases including Clang's " - "compilation database and indexer stores"), - cl::cat(CommonRefactorOptions), cl::sub(*cl::AllSubCommands)); - static cl::opt<bool> Verbose("v", cl::desc("Use verbose output"), cl::cat(CommonRefactorOptions), cl::sub(*cl::AllSubCommands)); @@ -129,10 +124,6 @@ public: cl::OptionCategory &Category) : SubCommand(Action->getCommand(), Action->getDescription()), Action(std::move(Action)), ActionRules(std::move(ActionRules)) { - Sources = llvm::make_unique<cl::list<std::string>>( - cl::Positional, cl::ZeroOrMore, cl::desc("<source0> [... <sourceN>]"), - cl::cat(Category), cl::sub(*this)); - // Check if the selection option is supported. bool HasSelection = false; for (const auto &Rule : this->ActionRules) { @@ -169,13 +160,9 @@ public: assert(Selection && "selection not supported!"); return ParsedSelection.get(); } - - ArrayRef<std::string> getSources() const { return *Sources; } - private: std::unique_ptr<RefactoringAction> Action; RefactoringActionRules ActionRules; - std::unique_ptr<cl::list<std::string>> Sources; std::unique_ptr<cl::opt<std::string>> Selection; std::unique_ptr<SourceSelectionArgument> ParsedSelection; }; @@ -221,20 +208,9 @@ public: /// Parses the translation units that were given to the subcommand using /// the 'sources' option and invokes the callback for each parsed /// translation unit. - bool foreachTranslationUnit(RefactoringActionSubcommand &Subcommand, + bool foreachTranslationUnit(const CompilationDatabase &DB, + ArrayRef<std::string> Sources, TUCallbackType Callback) { - std::unique_ptr<CompilationDatabase> Compilations; - if (opts::NoDatabases) { - // FIXME (Alex L): Support compilation options. - Compilations = - llvm::make_unique<clang::tooling::FixedCompilationDatabase>( - ".", std::vector<std::string>()); - } else { - // FIXME (Alex L): Support compilation database. - llvm::errs() << "compilation databases are not supported yet!\n"; - return true; - } - class ToolASTConsumer : public ASTConsumer { public: TUCallbackType Callback; @@ -254,7 +230,7 @@ public: } }; - ClangTool Tool(*Compilations, Subcommand.getSources()); + ClangTool Tool(DB, Sources); ActionWrapper ToolAction(std::move(Callback)); std::unique_ptr<tooling::FrontendActionFactory> Factory = tooling::newFrontendActionFactory(&ToolAction); @@ -277,7 +253,9 @@ public: } } - bool invokeAction(RefactoringActionSubcommand &Subcommand) { + bool invokeAction(RefactoringActionSubcommand &Subcommand, + const CompilationDatabase &DB, + ArrayRef<std::string> Sources) { // Find a set of matching rules. SmallVector<RefactoringActionRule *, 4> MatchingRules; llvm::StringSet<> MissingOptions; @@ -303,7 +281,7 @@ public: bool HasFailed = false; ClangRefactorConsumer Consumer; - if (foreachTranslationUnit(Subcommand, [&](ASTContext &AST) { + if (foreachTranslationUnit(DB, Sources, [&](ASTContext &AST) { RefactoringRuleContext Context(AST.getSourceManager()); Context.setASTContext(AST); @@ -347,12 +325,9 @@ public: int main(int argc, const char **argv) { ClangRefactorTool Tool; - // FIXME: Use LibTooling's CommonOptions parser when subcommands are supported - // by it. - cl::HideUnrelatedOptions(opts::CommonRefactorOptions); - cl::ParseCommandLineOptions( - argc, argv, "Clang-based refactoring tool for C, C++ and Objective-C"); - cl::PrintOptionValues(); + CommonOptionsParser Options( + argc, argv, opts::CommonRefactorOptions, cl::ZeroOrMore, + "Clang-based refactoring tool for C, C++ and Objective-C"); // Figure out which action is specified by the user. The user must specify // the action using a command-line subcommand, e.g. the invocation @@ -374,17 +349,10 @@ int main(int argc, const char **argv) { } RefactoringActionSubcommand &ActionCommand = **It; - ArrayRef<std::string> Sources = ActionCommand.getSources(); - // When -no-dbs is used, at least one file (TU) must be given to any - // subcommand. - if (opts::NoDatabases && Sources.empty()) { - llvm::errs() << "error: must provide paths to the source files when " - "'-no-dbs' is used\n"; - return 1; - } if (ActionCommand.parseArguments()) return 1; - if (Tool.invokeAction(ActionCommand)) + if (Tool.invokeAction(ActionCommand, Options.getCompilations(), + Options.getSourcePathList())) return 1; return 0; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits