[PATCH] Adding a new cl::HideUnrelatedOptions API to allow clang to migrate off cl::getRegisteredOptions.

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed Jan 21 14:39:24 PST 2015


LGTM.

> On 2015-Jan-21, at 14:14, Chris Bieneman <beanz at apple.com> wrote:
> 
> Updates based on Duncan's feedback.
> 
> - Using C++ range-based for loop
> - Added a unit test case
> 
> 
> http://reviews.llvm.org/D7100
> 
> Files:
>  include/llvm/Support/CommandLine.h
>  lib/Support/CommandLine.cpp
>  unittests/Support/CommandLineTest.cpp
> 
> Index: include/llvm/Support/CommandLine.h
> ===================================================================
> --- include/llvm/Support/CommandLine.h
> +++ include/llvm/Support/CommandLine.h
> @@ -1889,6 +1889,15 @@
>                          SmallVectorImpl<const char *> &Argv,
>                          bool MarkEOLs = false);
> 
> +/// \brief Mark all options not part of this category as cl::ReallyHidden.
> +///
> +/// \param Category the category of options to keep displaying
> +///
> +/// Some tools (like clang-format) like to be able to hide all options that are
> +/// not specific to the tool. This function allows a tool to specify a single
> +/// option category to display in the -help output.
> +void HideUnrelatedOptions(cl::OptionCategory &Category);
> +
> } // End namespace cl
> 
> } // End namespace llvm
> Index: lib/Support/CommandLine.cpp
> ===================================================================
> --- lib/Support/CommandLine.cpp
> +++ lib/Support/CommandLine.cpp
> @@ -1826,12 +1826,22 @@
> void cl::getRegisteredOptions(StringMap<Option *> &Map) {
>   // Get all the options.
>   SmallVector<Option *, 4> PositionalOpts; // NOT USED
> -  SmallVector<Option *, 4> SinkOpts; // NOT USED
> +  SmallVector<Option *, 4> SinkOpts;       // NOT USED
>   assert(Map.size() == 0 && "StringMap must be empty");
>   GetOptionInfo(PositionalOpts, SinkOpts, Map);
>   return;
> }
> 
> +void cl::HideUnrelatedOptions(cl::OptionCategory &Category) {
> +  StringMap<cl::Option *> Options;
> +  cl::getRegisteredOptions(Options);
> +  for (auto &I : Options) {
> +    if (I.second->Category != &Category && I.first() != "help" &&
> +        I.first() != "version")
> +      I.second->setHiddenFlag(cl::ReallyHidden);
> +  }
> +}
> +
> void LLVMParseCommandLineOptions(int argc, const char *const *argv,
>                                  const char *Overview) {
>   llvm::cl::ParseCommandLineOptions(argc, argv, Overview);
> Index: unittests/Support/CommandLineTest.cpp
> ===================================================================
> --- unittests/Support/CommandLineTest.cpp
> +++ unittests/Support/CommandLineTest.cpp
> @@ -230,5 +230,16 @@
>   testAliasRequired(array_lengthof(opts2), opts2);
> }
> 
> +TEST(CommandLineTest, HideUnrelatedOptions) {
> +  cl::opt<int> TestOption1("test-option-1");
> +  cl::opt<int> TestOption2("test-option-2", cl::cat(TestCategory));
> +
> +  cl::HideUnrelatedOptions(TestCategory);
> +
> +  ASSERT_EQ(cl::ReallyHidden, TestOption1.getOptionHiddenFlag())
> +      << "Failed to hide extra option.";
> +  ASSERT_EQ(cl::NotHidden, TestOption2.getOptionHiddenFlag())
> +      << "Hid extra option that should be visable.";
> +}
> 
> }  // anonymous namespace
> 
> EMAIL PREFERENCES
>  http://reviews.llvm.org/settings/panel/emailpreferences/
> <D7100.18553.patch>





More information about the llvm-commits mailing list