[Lldb-commits] [lldb] [lldb/Commands] Add `scripting template list` command with auto discovery (PR #97273)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Jul 2 17:11:34 PDT 2024
================
@@ -127,6 +130,171 @@ class CommandObjectScriptingRun : public CommandObjectRaw {
CommandOptions m_options;
};
+#pragma mark CommandObjectScriptingTemplateList
+
+#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 affordances 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;
+
+ switch (short_option) {
+ case 'l':
+ language = (lldb::ScriptLanguage)OptionArgParser::ToOptionEnum(
+ option_arg, GetDefinitions()[option_idx].enum_values,
+ eScriptLanguageNone, error);
+ if (!error.Success())
+ error.SetErrorStringWithFormat("unrecognized value for language '%s'",
+ option_arg.str().c_str());
+ break;
+ default:
+ llvm_unreachable("Unimplemented option");
+ }
+
+ return error;
+ }
+
+ void OptionParsingStarting(ExecutionContext *execution_context) override {
+ language = lldb::eScriptLanguageNone;
+ }
+
+ llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
+ return llvm::ArrayRef(g_scripting_template_list_options);
+ }
+
+ lldb::ScriptLanguage language = lldb::eScriptLanguageNone;
+ };
+
+protected:
+ void DoExecute(Args &command, CommandReturnObject &result) override {
+ lldb::ScriptLanguage language =
+ (m_options.language == lldb::eScriptLanguageNone)
+ ? m_interpreter.GetDebugger().GetScriptLanguage()
+ : m_options.language;
+
+ if (language == lldb::eScriptLanguageNone) {
+ result.AppendError(
+ "the script-lang setting is set to none - scripting not available");
+ return;
+ }
+
+ ScriptInterpreter *script_interpreter =
+ GetDebugger().GetScriptInterpreter(true, language);
+
+ if (script_interpreter == nullptr) {
+ result.AppendError("no script interpreter");
+ return;
+ }
+
+ Stream &s = result.GetOutputStream();
+ s.Printf("Available scripted affordances:\n");
+
+ auto print_field = [&s](llvm::StringRef key, llvm::StringRef value,
+ bool check_validy = false) {
+ if (!check_validy || !value.empty()) {
+ s.IndentMore();
+ s.Indent();
+ s << key << ": " << value << '\n';
+ s.IndentLess();
+ }
+ };
+ auto print_usages = [&s](llvm::StringRef usage_kind,
+ std::vector<llvm::StringRef> &usages) {
+ s.IndentMore();
+ s.Indent();
+ s << usage_kind << " Usages:";
+ if (usages.empty())
+ s << " No usages.\n";
+ else if (usages.size() == 1)
+ s << " " << usages.front() << '\n';
+ else {
+ s << '\n';
+ for (llvm::StringRef usage : usages) {
+ s.IndentMore();
+ s.Indent();
+ s << usage << '\n';
+ s.IndentLess();
+ }
+ }
+ s.IndentLess();
+ };
+
+ size_t i = 0;
+ for (llvm::StringRef plugin_name =
+ PluginManager::GetScriptedInterfaceNameAtIndex(i);
+ !plugin_name.empty();) {
+
+ llvm::StringRef desc =
+ PluginManager::GetScriptedInterfaceDescriptionAtIndex(i);
+ lldb::ScriptLanguage lang =
+ PluginManager::GetScriptedInterfaceLanguageAtIndex(i);
+ std::vector<llvm::StringRef> ci_usages =
+ PluginManager::GetScriptedInterfaceCommandInterpreterUsagesAtIndex(i);
+ std::vector<llvm::StringRef> api_usages =
+ PluginManager::GetScriptedInterfaceAPIUsagesAtIndex(i);
+
+ print_field("Name", plugin_name);
+ switch (lang) {
+ case eScriptLanguagePython:
+ print_field("Language", "Python");
----------------
jimingham wrote:
Use ScriptInterpreter::LanguageToString rather than hard coding the values here.
https://github.com/llvm/llvm-project/pull/97273
More information about the lldb-commits
mailing list