diff options
Diffstat (limited to 'lldb/source/Commands/CommandObjectApropos.cpp')
| -rw-r--r-- | lldb/source/Commands/CommandObjectApropos.cpp | 99 | 
1 files changed, 99 insertions, 0 deletions
diff --git a/lldb/source/Commands/CommandObjectApropos.cpp b/lldb/source/Commands/CommandObjectApropos.cpp new file mode 100644 index 0000000000000..7ba0b250fbd58 --- /dev/null +++ b/lldb/source/Commands/CommandObjectApropos.cpp @@ -0,0 +1,99 @@ +//===-- CommandObjectApropos.cpp ---------------------------------*- C++ +//-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "CommandObjectApropos.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Interpreter/Options.h" +#include "lldb/Interpreter/Property.h" +#include "lldb/Utility/Args.h" + +using namespace lldb; +using namespace lldb_private; + +// CommandObjectApropos + +CommandObjectApropos::CommandObjectApropos(CommandInterpreter &interpreter) +    : CommandObjectParsed( +          interpreter, "apropos", +          "List debugger commands related to a word or subject.", nullptr) { +  CommandArgumentEntry arg; +  CommandArgumentData search_word_arg; + +  // Define the first (and only) variant of this arg. +  search_word_arg.arg_type = eArgTypeSearchWord; +  search_word_arg.arg_repetition = eArgRepeatPlain; + +  // There is only one variant this argument could be; put it into the argument +  // entry. +  arg.push_back(search_word_arg); + +  // Push the data for the first argument into the m_arguments vector. +  m_arguments.push_back(arg); +} + +CommandObjectApropos::~CommandObjectApropos() = default; + +bool CommandObjectApropos::DoExecute(Args &args, CommandReturnObject &result) { +  const size_t argc = args.GetArgumentCount(); + +  if (argc == 1) { +    auto search_word = args[0].ref(); +    if (!search_word.empty()) { +      // The bulk of the work must be done inside the Command Interpreter, +      // since the command dictionary is private. +      StringList commands_found; +      StringList commands_help; + +      m_interpreter.FindCommandsForApropos(search_word, commands_found, +                                           commands_help, true, true, true); + +      if (commands_found.GetSize() == 0) { +        result.AppendMessageWithFormat("No commands found pertaining to '%s'. " +                                       "Try 'help' to see a complete list of " +                                       "debugger commands.\n", +                                       args[0].c_str()); +      } else { +        if (commands_found.GetSize() > 0) { +          result.AppendMessageWithFormat( +              "The following commands may relate to '%s':\n", args[0].c_str()); +          const size_t max_len = commands_found.GetMaxStringLength(); + +          for (size_t i = 0; i < commands_found.GetSize(); ++i) +            m_interpreter.OutputFormattedHelpText( +                result.GetOutputStream(), commands_found.GetStringAtIndex(i), +                "--", commands_help.GetStringAtIndex(i), max_len); +        } +      } + +      std::vector<const Property *> properties; +      const size_t num_properties = +          GetDebugger().Apropos(search_word, properties); +      if (num_properties) { +        const bool dump_qualified_name = true; +        result.AppendMessageWithFormatv( +            "\nThe following settings variables may relate to '{0}': \n\n", +            args[0].ref()); +        for (size_t i = 0; i < num_properties; ++i) +          properties[i]->DumpDescription( +              m_interpreter, result.GetOutputStream(), 0, dump_qualified_name); +      } + +      result.SetStatus(eReturnStatusSuccessFinishNoResult); +    } else { +      result.AppendError("'' is not a valid search word.\n"); +      result.SetStatus(eReturnStatusFailed); +    } +  } else { +    result.AppendError("'apropos' must be called with exactly one argument.\n"); +    result.SetStatus(eReturnStatusFailed); +  } + +  return result.Succeeded(); +}  | 
