================
@@ -2473,3 +2474,35 @@ bool 
PluginManager::SetUnwindAssemblyPluginEnabled(llvm::StringRef name,
                                                    bool enable) {
   return GetUnwindAssemblyInstances().SetInstanceEnabled(name, enable);
 }
+
+void PluginManager::AutoCompletePluginName(llvm::StringRef name,
+                                           CompletionRequest &request) {
+  // Split the name into the namespace and the plugin name.
+  // If there is no dot then the ns_name will be equal to name and
+  // plugin_prefix will be empty.
+  llvm::StringRef ns_name, plugin_prefix;
+  std::tie(ns_name, plugin_prefix) = name.split('.');
+
+  for (const PluginNamespace &plugin_ns : GetPluginNamespaces()) {
+    // If the plugin namespace matches exactly then
+    // add all the plugins in this namespace as completions if the
+    // plugin names starts with the plugin_prefix. If the plugin_prefix
+    // is empty then it will match all the plugins (empty string is a
+    // prefix of everything).
+    if (plugin_ns.name == ns_name) {
+      for (const RegisteredPluginInfo &plugin : plugin_ns.get_info()) {
+        llvm::SmallString<128> buf;
+        if (plugin.name.starts_with(plugin_prefix))
+          request.AddCompletion(
+              (plugin_ns.name + "." + plugin.name).toStringRef(buf));
----------------
dmpots wrote:

The 
[documentation](https://github.com/llvm/llvm-project/blob/8d3f497eb834a84b954241b8c4293f8387e75576/lldb/include/lldb/Utility/CompletionRequest.h#L183C70-L184C76)
 of `AddCompletion` it says it will store a copy of the completion so it can be 
freed after.

Checking the code, `AddCompletion` calls `CompletionResult::AddResult` which 
constructs a new `Completion` object
https://github.com/llvm/llvm-project/blob/8d3f497eb834a84b954241b8c4293f8387e75576/lldb/source/Utility/CompletionRequest.cpp#L64

And the `Completion` object stores the value as a string and initializes it 
with a copy of the input StringRef.
https://github.com/llvm/llvm-project/blob/8d3f497eb834a84b954241b8c4293f8387e75576/lldb/include/lldb/Utility/CompletionRequest.h#L55

I believe the `StringRef` will point to valid memory for the lifetime of the 
call to `AddCompletion` and since it makes a copy of the data inside that 
function we should be safe.

https://github.com/llvm/llvm-project/pull/147775
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to