[Lldb-commits] [lldb] [lldb] List registered extensions in `help scripting-extension` (PR #232891)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 16 11:46:45 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Med Ismail Bennani (medismailben)
<details>
<summary>Changes</summary>
`help scripting-extension` only printed a one-line description, while tab completion for the same argument offered every registered scripted extension. Help and completion come from separate parts of the argument table: completion queries PluginManager at runtime, but help only printed the entry's static text.
This PR changes the argument table entry for ScriptedExtension to add a help callback that lists the registered extensions along with the description each interface registered with. The list is built from the plugin registry rather than a static enum table because not every lldb::ScriptedExtension value has a registered interface (e.g. ParsedCommand), and a static table would advertise names that completion never offers.
This also refactors the registry walk into a single `PluginManager::ForEachScriptedExtension` so completion and help share it.
Assisted-by: Claude
---
Full diff: https://github.com/llvm/llvm-project/pull/232891.diff
4 Files Affected:
- (modified) lldb/include/lldb/Core/PluginManager.h (+10)
- (modified) lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h (+2-1)
- (modified) lldb/source/Commands/CommandOptionArgumentTable.cpp (+26)
- (modified) lldb/source/Core/PluginManager.cpp (+20-14)
``````````diff
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h
index f38392ff7ac04..e0b4466ca7875 100644
--- a/lldb/include/lldb/Core/PluginManager.h
+++ b/lldb/include/lldb/Core/PluginManager.h
@@ -20,6 +20,7 @@
#include "lldb/lldb-forward.h"
#include "lldb/lldb-private-interfaces.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
@@ -689,6 +690,15 @@ class PluginManager {
static ScriptedInterfaceUsages
GetScriptedInterfaceUsagesAtIndex(uint32_t idx);
+ /// Invoke \p callback once per registered scripted extension, passing the
+ /// description of the first interface registered for it. An extension
+ /// backed by several languages is only reported once. When \p language is
+ /// not `eScriptLanguageUnknown`, only interfaces for that language count.
+ static void ForEachScriptedExtension(
+ llvm::function_ref<void(lldb::ScriptedExtension, llvm::StringRef)>
+ callback,
+ lldb::ScriptLanguage language = lldb::eScriptLanguageUnknown);
+
static void AutoCompleteScriptedExtension(
llvm::StringRef partial_name, CompletionRequest &request,
lldb::ScriptLanguage language = lldb::eScriptLanguageUnknown);
diff --git a/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h b/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h
index 1fa90a1313b9c..3f1a122f967cd 100644
--- a/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h
+++ b/lldb/include/lldb/Interpreter/CommandOptionArgumentTable.h
@@ -261,6 +261,7 @@ llvm::StringRef FormatHelpTextCallback();
llvm::StringRef LanguageTypeHelpTextCallback();
llvm::StringRef SummaryStringHelpTextCallback();
llvm::StringRef ExprPathHelpTextCallback();
+llvm::StringRef ScriptedExtensionHelpTextCallback();
llvm::StringRef arch_helper();
static constexpr CommandObject::ArgumentTableEntry g_argument_table[] = {
@@ -374,7 +375,7 @@ static constexpr CommandObject::ArgumentTableEntry g_argument_table[] = {
{ lldb::eArgTypeNameMatchStyle, "match-style", lldb::CompletionType::eNoCompletion, g_name_match_style, { nullptr, false }, "Specify the kind of match to use when looking up names." },
{ lldb::eArgTypePluginDomain, "plugin-domain", lldb::CompletionType::eNoCompletion, g_plugin_domain_values, { nullptr, false }, "The domain to apply the plugin operation to." },
{ lldb::eArgTypeBreakpointResolverMask, "resolver-mask", lldb::CompletionType::eNoCompletion, g_resolver_mask_values, { nullptr, false }, "Specify the breakpoint resolver type your override will handle. Can be specified more than once to specify a mask of resolver types." },
- { lldb::eArgTypeScriptedExtension, "scripting-extension", lldb::CompletionType::eScriptedExtensionCompletion, {}, { nullptr, false }, "The name of a scripting extension." },
+ { lldb::eArgTypeScriptedExtension, "scripting-extension", lldb::CompletionType::eScriptedExtensionCompletion, {}, { ScriptedExtensionHelpTextCallback, false }, nullptr },
// clang-format on
};
diff --git a/lldb/source/Commands/CommandOptionArgumentTable.cpp b/lldb/source/Commands/CommandOptionArgumentTable.cpp
index 9e33605f8cc60..c55f1aa523cdd 100644
--- a/lldb/source/Commands/CommandOptionArgumentTable.cpp
+++ b/lldb/source/Commands/CommandOptionArgumentTable.cpp
@@ -7,7 +7,9 @@
//===----------------------------------------------------------------------===//
#include "lldb/Interpreter/CommandOptionArgumentTable.h"
+#include "lldb/Core/PluginManager.h"
#include "lldb/DataFormatters/FormatManager.h"
+#include "lldb/Interpreter/ScriptInterpreter.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/StreamString.h"
@@ -181,6 +183,30 @@ llvm::StringRef LanguageTypeHelpTextCallback() {
return help_text;
}
+llvm::StringRef ScriptedExtensionHelpTextCallback() {
+ // Rebuilt on every call so extensions registered after the first lookup
+ // still show up.
+ static std::string help_text;
+
+ llvm::SmallVector<std::pair<llvm::StringRef, llvm::StringRef>> extensions;
+ size_t longest = 0;
+ PluginManager::ForEachScriptedExtension(
+ [&](lldb::ScriptedExtension extension, llvm::StringRef description) {
+ llvm::StringRef name = ScriptInterpreter::ExtensionToString(extension);
+ longest = std::max(longest, name.size());
+ extensions.emplace_back(name, description);
+ });
+
+ StreamString sstr;
+ sstr << "The name of a scripting extension. One of the following:\n";
+ for (const auto &[name, description] : extensions)
+ sstr.Printf(" %-*s - %s\n", static_cast<int>(longest), name.data(),
+ description.str().c_str());
+
+ help_text = std::string(sstr.GetString());
+ return help_text;
+}
+
llvm::StringRef SummaryStringHelpTextCallback() {
return "A summary string is a way to extract information from variables in "
"order to present them using a summary.\n"
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index a6639f7213406..03eccd78901aa 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -20,7 +20,7 @@
#include "lldb/Utility/Status.h"
#include "lldb/Utility/StringList.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/StringSet.h"
+#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/DynamicLibrary.h"
#include "llvm/Support/ErrorExtras.h"
@@ -2129,30 +2129,36 @@ PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) {
return {};
}
-void PluginManager::AutoCompleteScriptedExtension(
- llvm::StringRef name, CompletionRequest &request,
+void PluginManager::ForEachScriptedExtension(
+ llvm::function_ref<void(lldb::ScriptedExtension, llvm::StringRef)>
+ callback,
lldb::ScriptLanguage language) {
- llvm::StringSet<> emitted;
+ llvm::SmallSet<lldb::ScriptedExtension, 16> emitted;
for (size_t idx = 0; idx < GetNumScriptedInterfaces(); idx++) {
auto instance = GetScriptedInterfaceInstances().GetInstanceAtIndex(idx);
if (!instance)
continue;
- // Filter to the requested language when the caller pinned one via
- // `-l`. `eScriptLanguageUnknown` means "no filter".
if (language != lldb::eScriptLanguageUnknown &&
instance->language != language)
continue;
- llvm::StringLiteral extension_name =
- ScriptInterpreter::ExtensionToString(instance->extension);
- if (!extension_name.starts_with(name))
- continue;
- // A single extension can back multiple languages, so dedup entries
- // we've already surfaced.
- if (emitted.insert(extension_name).second)
- request.AddCompletion(extension_name);
+ if (emitted.insert(instance->extension).second)
+ callback(instance->extension, instance->description);
}
}
+void PluginManager::AutoCompleteScriptedExtension(
+ llvm::StringRef name, CompletionRequest &request,
+ lldb::ScriptLanguage language) {
+ ForEachScriptedExtension(
+ [&](lldb::ScriptedExtension extension, llvm::StringRef) {
+ llvm::StringLiteral extension_name =
+ ScriptInterpreter::ExtensionToString(extension);
+ if (extension_name.starts_with(name))
+ request.AddCompletion(extension_name);
+ },
+ language);
+}
+
#pragma mark REPL
struct REPLInstance : public PluginInstance<REPLCreateInstance> {
``````````
</details>
https://github.com/llvm/llvm-project/pull/232891
More information about the lldb-commits
mailing list