r313260 - [refactor] Use CommonOptionsParser in clang-refactor

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 14 06:16:14 PDT 2017


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;




More information about the cfe-commits mailing list