[Lldb-commits] [lldb] [lldb] Add `scripting extension instances` command (PR #226043)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 25 11:59:19 PDT 2026


================
@@ -374,6 +374,118 @@ class CommandObjectScriptingExtensionList : public CommandObjectParsed {
   CommandOptions m_options;
 };
 
+#define LLDB_OPTIONS_scripting_extension_instances
+#include "CommandOptions.inc"
+
+class CommandObjectScriptingExtensionInstances : public CommandObjectParsed {
+public:
+  CommandObjectScriptingExtensionInstances(CommandInterpreter &interpreter)
+      : CommandObjectParsed(
+            interpreter, "scripting extension instances",
+            "List the instantiated scripting extensions, grouped by class, "
+            "along with the script file each class was imported from.",
+            "scripting extension instances [--json] [<extension-name> ...]") {
+    AddSimpleArgumentList(eArgTypeScriptedExtension, eArgRepeatStar);
+  }
+
+  ~CommandObjectScriptingExtensionInstances() override = default;
+
+  Options *GetOptions() override { return &m_options; }
+
+  void
+  HandleArgumentCompletion(CompletionRequest &request,
+                           OptionElementVector &opt_element_vector) override {
+    lldb_private::CommandCompletions::InvokeCommonCompletionCallbacks(
+        GetCommandInterpreter(), lldb::eScriptedExtensionCompletion, request,
+        nullptr);
+  }
+
+  class CommandOptions : public Options {
+  public:
+    CommandOptions() = default;
+    ~CommandOptions() override = default;
+    Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
+                          ExecutionContext *execution_context) override {
+      const int short_option = m_getopt_table[option_idx].val;
+
+      switch (short_option) {
+      case 'j':
+        m_json_format = true;
+        break;
+      default:
+        llvm_unreachable("Unimplemented option");
+      }
+
+      return {};
+    }
+
+    void OptionParsingStarting(ExecutionContext *execution_context) override {
+      m_json_format = false;
+    }
+
+    llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
+      return llvm::ArrayRef(g_scripting_extension_instances_options);
+    }
+
+    bool m_json_format = false;
+  };
+
+protected:
+  void DoExecute(Args &command, CommandReturnObject &result) override {
+    std::vector<lldb::ScriptedExtension> extensions;
+    for (const Args::ArgEntry &arg : command.entries()) {
+      lldb::ScriptedExtension extension =
+          ScriptInterpreter::StringToExtension(arg.ref());
+      if (extension == eScriptedExtensionInvalid) {
+        result.AppendErrorWithFormat("no scripted extension named '%s'",
+                                     arg.c_str());
+        return;
+      }
+      extensions.push_back(extension);
+    }
+
+    std::vector<ScriptedInstanceGroup> groups;
+    if (ScriptInterpreter *script_interpreter =
+            GetDebugger().GetScriptInterpreter(/*can_create=*/false))
+      groups =
+          script_interpreter->GetScriptedInstanceRegistry()->GetInstanceGroups(
+              extensions);
+
+    if (m_options.m_json_format) {
+      StructuredData::Array groups_array;
+      for (const ScriptedInstanceGroup &group : groups)
+        groups_array.AddItem(group.ToStructuredData());
+      groups_array.Dump(result.GetOutputStream());
+      result.GetOutputStream().EOL();
+      result.SetStatus(eReturnStatusSuccessFinishResult);
+      return;
+    }
+
+    Stream &s = result.GetOutputStream();
+    const bool use_color = s.AsRawOstream().colors_enabled();
+    constexpr llvm::StringLiteral faint_code = ANSI_ESCAPE1(ANSI_CTRL_FAINT);
+    constexpr llvm::StringLiteral reset_code = ANSI_ESCAPE1(ANSI_CTRL_NORMAL);
----------------
JDevlieghere wrote:

Doesn't belong here.

https://github.com/llvm/llvm-project/pull/226043


More information about the lldb-commits mailing list