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);
#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"
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));
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) {
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;
};
/// 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;
}
};
- ClangTool Tool(*Compilations, Subcommand.getSources());
+ ClangTool Tool(DB, Sources);
ActionWrapper ToolAction(std::move(Callback));
std::unique_ptr<tooling::FrontendActionFactory> Factory =
tooling::newFrontendActionFactory(&ToolAction);
}
}
- 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;
bool HasFailed = false;
ClangRefactorConsumer Consumer;
- if (foreachTranslationUnit(Subcommand, [&](ASTContext &AST) {
+ if (foreachTranslationUnit(DB, Sources, [&](ASTContext &AST) {
RefactoringRuleContext Context(AST.getSourceManager());
Context.setASTContext(AST);
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
}
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;