[PATCH] D24489: [Support][CommandLine] Add cl::getRegisteredSubcommands()

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 12 19:31:03 PDT 2016


Looks good.
On Mon, Sep 12, 2016 at 6:59 PM Dean Michael Berris <dberris at google.com>
wrote:

> dberris updated this revision to Diff 71098.
> dberris added a comment.
>
> - Style fixes
>
>
> https://reviews.llvm.org/D24489
>
> Files:
>   include/llvm/Support/CommandLine.h
>   lib/Support/CommandLine.cpp
>   unittests/Support/CommandLineTest.cpp
>
> Index: unittests/Support/CommandLineTest.cpp
> ===================================================================
> --- unittests/Support/CommandLineTest.cpp
> +++ unittests/Support/CommandLineTest.cpp
> @@ -476,4 +476,27 @@
>    EXPECT_FALSE(cl::ParseCommandLineOptions(3, args2, nullptr, true));
>  }
>
> +TEST(CommandLineTest, GetRegisteredSubcommands) {
> +  cl::ResetCommandLineParser();
> +
> +  StackSubCommand SC1("sc1", "First Subcommand");
> +  StackSubCommand SC2("sc2", "Second subcommand");
> +
> +  const char *args0[] = {"prog", "sc1"};
> +  const char *args1[] = {"prog", "sc2"};
> +
> +  EXPECT_TRUE(cl::ParseCommandLineOptions(2, args0, nullptr, true));
> +  for (auto *S : cl::getRegisteredSubcommands()) {
> +    if (*S)
> +      EXPECT_STREQ("sc1", S->getName());
> +  }
> +
> +  cl::ResetAllOptionOccurrences();
> +  EXPECT_TRUE(cl::ParseCommandLineOptions(2, args1, nullptr, true));
> +  for (auto *S : cl::getRegisteredSubcommands()) {
> +    if (*S)
> +      EXPECT_STREQ("sc2", S->getName());
> +  }
> +}
> +
>  }  // anonymous namespace
> Index: lib/Support/CommandLine.cpp
> ===================================================================
> --- lib/Support/CommandLine.cpp
> +++ lib/Support/CommandLine.cpp
> @@ -309,6 +309,12 @@
>      RegisteredSubCommands.erase(sub);
>    }
>
> +  iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
> +  getRegisteredSubcommands() {
> +    return make_range(RegisteredSubCommands.begin(),
> +                      RegisteredSubCommands.end());
> +  }
> +
>    void reset() {
>      ActiveSubCommand = nullptr;
>      ProgramName.clear();
> @@ -2105,6 +2111,11 @@
>    return Sub.OptionsMap;
>  }
>
> +iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
> +cl::getRegisteredSubcommands() {
> +  return GlobalParser->getRegisteredSubcommands();
> +}
> +
>  void cl::HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand
> &Sub) {
>    for (auto &I : Sub.OptionsMap) {
>      if (I.second->Category != &Category &&
> Index: include/llvm/Support/CommandLine.h
> ===================================================================
> --- include/llvm/Support/CommandLine.h
> +++ include/llvm/Support/CommandLine.h
> @@ -1736,6 +1736,28 @@
>  /// than just handing around a global list.
>  StringMap<Option *> &getRegisteredOptions(SubCommand &Sub =
> *TopLevelSubCommand);
>
> +/// \brief Use this to get all registered SubCommands from the provided
> parser.
> +///
> +/// \return A range of all SubCommand pointers registered with the parser.
> +///
> +/// Typical usage:
> +/// \code
> +/// main(int argc, char* argv[]) {
> +///   llvm::cl::ParseCommandLineOptions(argc, argv);
> +///   for (auto* S : llvm::cl::getRegisteredSubcommands()) {
> +///     if (*S) {
> +///       std::cout << "Executing subcommand: " << S->getName() <<
> std::endl;
> +///       // Execute some function based on the name...
> +///     }
> +///   }
> +/// }
> +/// \endcode
> +///
> +/// This interface is useful for defining subcommands in libraries and
> +/// the dispatch from a single point (like in the main function).
> +iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
> +getRegisteredSubcommands();
> +
>
>  //===----------------------------------------------------------------------===//
>  // Standalone command line processing utilities.
>  //
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160913/c63a419b/attachment.html>


More information about the llvm-commits mailing list