diff options
| author | Med Ismail Bennani <ismail@bennani.ma> | 2024-07-23 10:19:52 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-23 10:19:52 -0700 |
| commit | 43ca63149dfbaa401a3bcee8b4835dccbac6d832 (patch) | |
| tree | b4e1e81242ca1f149f2ff6368ef5873452b0538f /lldb/source/Commands/CommandObjectScripting.cpp | |
| parent | 1c9085e37e1eafc5594954636e1a8bf1b3d250c7 (diff) | |
[lldb/Commands] Add `scripting template list` command with auto discovery (#97273)
This patch introduces a new `template` multiword sub-command to the
`scripting` top-level command. As the name suggests, this sub-command
operates on scripting templates, and currently has the ability to
automatically discover the various scripting extensions that lldb
supports.
Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
Diffstat (limited to 'lldb/source/Commands/CommandObjectScripting.cpp')
| -rw-r--r-- | lldb/source/Commands/CommandObjectScripting.cpp | 126 |
1 files changed, 124 insertions, 2 deletions
diff --git a/lldb/source/Commands/CommandObjectScripting.cpp b/lldb/source/Commands/CommandObjectScripting.cpp index fee0565a7c48..730a190a6e89 100644 --- a/lldb/source/Commands/CommandObjectScripting.cpp +++ b/lldb/source/Commands/CommandObjectScripting.cpp @@ -8,12 +8,14 @@ #include "CommandObjectScripting.h" #include "lldb/Core/Debugger.h" +#include "lldb/Core/PluginManager.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/Host/Config.h" #include "lldb/Host/OptionParser.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandOptionArgumentTable.h" #include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Interpreter/Interfaces/ScriptedInterfaceUsages.h" #include "lldb/Interpreter/OptionArgParser.h" #include "lldb/Interpreter/ScriptInterpreter.h" #include "lldb/Utility/Args.h" @@ -127,9 +129,126 @@ private: CommandOptions m_options; }; -#pragma mark CommandObjectMultiwordScripting +#define LLDB_OPTIONS_scripting_template_list +#include "CommandOptions.inc" + +class CommandObjectScriptingTemplateList : public CommandObjectParsed { +public: + CommandObjectScriptingTemplateList(CommandInterpreter &interpreter) + : CommandObjectParsed( + interpreter, "scripting template list", + "List all the available scripting extension templates. ", + "scripting template list [--language <scripting-language> --]") {} + + ~CommandObjectScriptingTemplateList() override = default; + + Options *GetOptions() override { return &m_options; } + + class CommandOptions : public Options { + public: + CommandOptions() = default; + ~CommandOptions() override = default; + Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, + ExecutionContext *execution_context) override { + Status error; + const int short_option = m_getopt_table[option_idx].val; -// CommandObjectMultiwordScripting + switch (short_option) { + case 'l': + m_language = (lldb::ScriptLanguage)OptionArgParser::ToOptionEnum( + option_arg, GetDefinitions()[option_idx].enum_values, + eScriptLanguageNone, error); + if (!error.Success()) + error.SetErrorStringWithFormatv( + "unrecognized value for language '{0}'", option_arg); + break; + default: + llvm_unreachable("Unimplemented option"); + } + + return error; + } + + void OptionParsingStarting(ExecutionContext *execution_context) override { + m_language = lldb::eScriptLanguageDefault; + } + + llvm::ArrayRef<OptionDefinition> GetDefinitions() override { + return llvm::ArrayRef(g_scripting_template_list_options); + } + + lldb::ScriptLanguage m_language = lldb::eScriptLanguageDefault; + }; + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + Stream &s = result.GetOutputStream(); + s.Printf("Available scripted extension templates:"); + + auto print_field = [&s](llvm::StringRef key, llvm::StringRef value) { + if (!value.empty()) { + s.IndentMore(); + s.Indent(); + s << key << ": " << value << '\n'; + s.IndentLess(); + } + }; + + size_t num_listed_interface = 0; + size_t num_templates = PluginManager::GetNumScriptedInterfaces(); + for (size_t i = 0; i < num_templates; i++) { + llvm::StringRef plugin_name = + PluginManager::GetScriptedInterfaceNameAtIndex(i); + if (plugin_name.empty()) + break; + + lldb::ScriptLanguage lang = + PluginManager::GetScriptedInterfaceLanguageAtIndex(i); + if (lang != m_options.m_language) + continue; + + if (!num_listed_interface) + s.EOL(); + + num_listed_interface++; + + llvm::StringRef desc = + PluginManager::GetScriptedInterfaceDescriptionAtIndex(i); + ScriptedInterfaceUsages usages = + PluginManager::GetScriptedInterfaceUsagesAtIndex(i); + + print_field("Name", plugin_name); + print_field("Language", ScriptInterpreter::LanguageToString(lang)); + print_field("Description", desc); + usages.Dump(s, ScriptedInterfaceUsages::UsageKind::API); + usages.Dump(s, ScriptedInterfaceUsages::UsageKind::CommandInterpreter); + + if (i != num_templates - 1) + s.EOL(); + } + + if (!num_listed_interface) + s << " None\n"; + } + +private: + CommandOptions m_options; +}; + +class CommandObjectMultiwordScriptingTemplate : public CommandObjectMultiword { +public: + CommandObjectMultiwordScriptingTemplate(CommandInterpreter &interpreter) + : CommandObjectMultiword( + interpreter, "scripting template", + "Commands for operating on the scripting templates.", + "scripting template [<subcommand-options>]") { + LoadSubCommand( + "list", + CommandObjectSP(new CommandObjectScriptingTemplateList(interpreter))); + } + + ~CommandObjectMultiwordScriptingTemplate() override = default; +}; CommandObjectMultiwordScripting::CommandObjectMultiwordScripting( CommandInterpreter &interpreter) @@ -139,6 +258,9 @@ CommandObjectMultiwordScripting::CommandObjectMultiwordScripting( "scripting <subcommand> [<subcommand-options>]") { LoadSubCommand("run", CommandObjectSP(new CommandObjectScriptingRun(interpreter))); + LoadSubCommand("template", + CommandObjectSP( + new CommandObjectMultiwordScriptingTemplate(interpreter))); } CommandObjectMultiwordScripting::~CommandObjectMultiwordScripting() = default; |
