[Lldb-commits] [lldb] Add the ability to define custom completers to the parsed_cmd template. (PR #109062)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Sep 17 16:34:04 PDT 2024
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff 090850f15dba926e2436089ff679b7015bb59e11 a0b5801ab231670215657ec720fa0c89bc262c04 --extensions h,cpp -- lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/include/lldb/Utility/CompletionRequest.h lldb/source/Commands/CommandObjectCommands.cpp lldb/source/Interpreter/Options.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h
index 6fc9746689..7561585d98 100644
--- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h
+++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h
@@ -436,19 +436,18 @@ public:
Args &args) {
return std::nullopt;
}
-
- virtual StructuredData::DictionarySP HandleArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
- size_t args_pos, size_t char_in_arg)
- {
+
+ virtual StructuredData::DictionarySP
+ HandleArgumentCompletionForScriptedCommand(
+ StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
+ size_t args_pos, size_t char_in_arg) {
return {};
}
- virtual StructuredData::DictionarySP
+ virtual StructuredData::DictionarySP
HandleOptionArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_name,
- size_t char_in_arg)
- {
+ StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_name,
+ size_t char_in_arg) {
return {};
}
diff --git a/lldb/include/lldb/Utility/CompletionRequest.h b/lldb/include/lldb/Utility/CompletionRequest.h
index 242ff38304..650158a197 100644
--- a/lldb/include/lldb/Utility/CompletionRequest.h
+++ b/lldb/include/lldb/Utility/CompletionRequest.h
@@ -138,7 +138,7 @@ public:
const Args::ArgEntry &GetParsedArg() {
return GetParsedLine()[GetCursorIndex()];
}
-
+
size_t GetCursorCharPos() const { return m_cursor_char_position; }
/// Drops the first argument from the argument list.
diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp
index ec1c4be377..845b89a75b 100644
--- a/lldb/source/Commands/CommandObjectCommands.cpp
+++ b/lldb/source/Commands/CommandObjectCommands.cpp
@@ -1636,16 +1636,16 @@ private:
}
size_t GetNumOptions() { return m_num_options; }
-
- void PrepareOptionsForCompletion(CompletionRequest &request,
- OptionElementVector &option_vec,
- ExecutionContext *exe_ctx) {
+
+ void PrepareOptionsForCompletion(CompletionRequest &request,
+ OptionElementVector &option_vec,
+ ExecutionContext *exe_ctx) {
// I'm not sure if we'll get into trouble doing an option parsing start
// and end in this context. If so, then I'll have to directly tell the
// scripter to do this.
OptionParsingStarting(exe_ctx);
auto opt_defs = GetDefinitions();
-
+
// Iterate through the options we found so far, and push them into
// the scripted side.
for (auto option_elem : option_vec) {
@@ -1662,26 +1662,30 @@ private:
if (cur_arg_pos != OptionArgElement::eUnrecognizedArg &&
cur_arg_pos != OptionArgElement::eBareDash &&
cur_arg_pos != OptionArgElement::eBareDoubleDash) {
- cur_arg_value = request.GetParsedLine().GetArgumentAtIndex(cur_arg_pos);
-
+ cur_arg_value =
+ request.GetParsedLine().GetArgumentAtIndex(cur_arg_pos);
}
}
SetOptionValue(cur_defs_index, cur_arg_value, exe_ctx);
}
OptionParsingFinished(exe_ctx);
}
-
- void ProcessCompletionDict(CompletionRequest &request, StructuredData::DictionarySP &completion_dict_sp) {
+
+ void
+ ProcessCompletionDict(CompletionRequest &request,
+ StructuredData::DictionarySP &completion_dict_sp) {
// We don't know how to process an empty completion dict, our callers have
// to do that.
assert(completion_dict_sp && "Must have valid completion dict");
// First handle the case of a single completion:
llvm::StringRef completion;
// If the dictionary has one element "no-completion" then we return here
- if (completion_dict_sp->GetValueForKeyAsString("no-completion", completion))
+ if (completion_dict_sp->GetValueForKeyAsString("no-completion",
+ completion))
return;
- if (completion_dict_sp->GetValueForKeyAsString("completion", completion)) {
+ if (completion_dict_sp->GetValueForKeyAsString("completion",
+ completion)) {
llvm::StringRef mode_str;
CompletionMode mode = CompletionMode::Normal;
if (completion_dict_sp->GetValueForKeyAsString("mode", mode_str)) {
@@ -1708,7 +1712,7 @@ private:
if (!val)
// FIXME: How do I report this error?
return;
-
+
if (descriptions) {
auto desc = descriptions->GetItemAtIndexAsString(idx);
request.AddCompletion(*val, desc ? *desc : "");
@@ -1717,22 +1721,23 @@ private:
}
}
}
-
+
void
HandleOptionArgumentCompletion(lldb_private::CompletionRequest &request,
OptionElementVector &option_vec,
int opt_element_index,
CommandInterpreter &interpreter) override {
- ScriptInterpreter *scripter = interpreter.GetDebugger().GetScriptInterpreter();
-
+ ScriptInterpreter *scripter =
+ interpreter.GetDebugger().GetScriptInterpreter();
+
if (!scripter)
return;
ExecutionContext exe_ctx = interpreter.GetExecutionContext();
PrepareOptionsForCompletion(request, option_vec, &exe_ctx);
-
+
auto defs = GetDefinitions();
-
+
size_t defs_index = option_vec[opt_element_index].opt_defs_index;
llvm::StringRef option_name = defs[defs_index].long_option;
bool is_enum = defs[defs_index].enum_values.size() != 0;
@@ -1742,19 +1747,19 @@ private:
// regular option completer handle that:
StructuredData::DictionarySP completion_dict_sp;
if (!is_enum)
- completion_dict_sp
- = scripter->HandleOptionArgumentCompletionForScriptedCommand(m_cmd_obj_sp,
- option_name, request.GetCursorCharPos());
+ completion_dict_sp =
+ scripter->HandleOptionArgumentCompletionForScriptedCommand(
+ m_cmd_obj_sp, option_name, request.GetCursorCharPos());
if (!completion_dict_sp) {
- Options::HandleOptionArgumentCompletion(request, option_vec,
+ Options::HandleOptionArgumentCompletion(request, option_vec,
opt_element_index, interpreter);
return;
}
-
+
ProcessCompletionDict(request, completion_dict_sp);
}
-
+
private:
struct EnumValueStorage {
EnumValueStorage() {
@@ -1995,9 +2000,9 @@ public:
Status GetOptionsError() { return m_options_error.Clone(); }
Status GetArgsError() { return m_args_error.Clone(); }
bool WantsCompletion() override { return true; }
-
+
private:
- void PrepareOptionsForCompletion(CompletionRequest &request,
+ void PrepareOptionsForCompletion(CompletionRequest &request,
OptionElementVector &option_vec) {
// First, we have to tell the Scripted side to set the values in its
// option store, then we call into the handle_completion passing in
@@ -2009,28 +2014,28 @@ private:
// can just skip setting the options on the scripted side:
if (options)
m_options.PrepareOptionsForCompletion(request, option_vec, &m_exe_ctx);
-
}
-public:
- void HandleArgumentCompletion(CompletionRequest &request,
+
+public:
+ void HandleArgumentCompletion(CompletionRequest &request,
OptionElementVector &option_vec) override {
ScriptInterpreter *scripter = GetDebugger().GetScriptInterpreter();
-
+
if (!scripter)
return;
// Set up the options values on the scripted side:
PrepareOptionsForCompletion(request, option_vec);
-
+
// Now we have to make up the argument list.
// The ParseForCompletion only identifies tokens in the m_parsed_line
// it doesn't remove the options leaving only the args as it does for
// the regular Parse, so we have to filter out the option ones using the
// option_element_vector:
-
+
Options *options = GetOptions();
- auto defs = options->GetDefinitions();
-
+ auto defs = options->GetDefinitions();
+
std::unordered_set<size_t> option_slots;
for (const auto &elem : option_vec) {
if (elem.opt_defs_index == -1)
@@ -2039,29 +2044,28 @@ public:
if (defs[elem.opt_defs_index].option_has_arg)
option_slots.insert(elem.opt_arg_pos);
}
-
+
std::vector<llvm::StringRef> args_vec;
Args &args = request.GetParsedLine();
size_t num_args = args.GetArgumentCount();
size_t cursor_idx = request.GetCursorIndex();
size_t args_elem_pos = cursor_idx;
-
+
for (size_t idx = 0; idx < num_args; idx++) {
if (option_slots.count(idx) == 0)
args_vec.push_back(args[idx].ref());
- else
- if (idx < cursor_idx)
- args_elem_pos--;
+ else if (idx < cursor_idx)
+ args_elem_pos--;
}
- StructuredData::DictionarySP completion_dict_sp
- = scripter->HandleArgumentCompletionForScriptedCommand(m_cmd_obj_sp,
- args_vec, args_elem_pos, request.GetCursorCharPos());
+ StructuredData::DictionarySP completion_dict_sp =
+ scripter->HandleArgumentCompletionForScriptedCommand(
+ m_cmd_obj_sp, args_vec, args_elem_pos, request.GetCursorCharPos());
if (!completion_dict_sp) {
CommandObject::HandleArgumentCompletion(request, option_vec);
return;
}
-
+
m_options.ProcessCompletionDict(request, completion_dict_sp);
}
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
index 29c2bb7932..be26064bf2 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
@@ -210,14 +210,15 @@ public:
LLDBSwigPythonGetRepeatCommandForScriptedCommand(PyObject *implementor,
std::string &command);
- static StructuredData::DictionarySP
- LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(PyObject *implementor,
- std::vector<llvm::StringRef> &args_impl, size_t args_pos, size_t pos_in_arg);
-
- static StructuredData::DictionarySP
- LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(PyObject *implementor,
- llvm::StringRef &long_option, size_t pos_in_arg);
-
+ static StructuredData::DictionarySP
+ LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(
+ PyObject *implementor, std::vector<llvm::StringRef> &args_impl,
+ size_t args_pos, size_t pos_in_arg);
+
+ static StructuredData::DictionarySP
+ LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(
+ PyObject *implementor, llvm::StringRef &long_option, size_t pos_in_arg);
+
static bool LLDBSwigPythonCallModuleInit(const char *python_module_name,
const char *session_dictionary_name,
lldb::DebuggerSP debugger);
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index 94388b3dac..9045a79d1c 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -2766,10 +2766,10 @@ ScriptInterpreterPythonImpl::GetRepeatCommandForScriptedCommand(
return ret_val;
}
-StructuredData::DictionarySP
+StructuredData::DictionarySP
ScriptInterpreterPythonImpl::HandleArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
- size_t args_pos, size_t char_in_arg) {
+ StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
+ size_t args_pos, size_t char_in_arg) {
StructuredData::DictionarySP completion_dict_sp;
if (!impl_obj_sp || !impl_obj_sp->IsValid())
return completion_dict_sp;
@@ -2778,18 +2778,18 @@ ScriptInterpreterPythonImpl::HandleArgumentCompletionForScriptedCommand(
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN,
Locker::FreeLock);
- completion_dict_sp =
- SWIGBridge::LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(
- static_cast<PyObject *>(impl_obj_sp->GetValue()), args, args_pos,
- char_in_arg);
+ completion_dict_sp =
+ SWIGBridge::LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(
+ static_cast<PyObject *>(impl_obj_sp->GetValue()), args, args_pos,
+ char_in_arg);
}
return completion_dict_sp;
}
-StructuredData::DictionarySP
+StructuredData::DictionarySP
ScriptInterpreterPythonImpl::HandleOptionArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_option,
- size_t char_in_arg) {
+ StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_option,
+ size_t char_in_arg) {
StructuredData::DictionarySP completion_dict_sp;
if (!impl_obj_sp || !impl_obj_sp->IsValid())
return completion_dict_sp;
@@ -2798,10 +2798,10 @@ ScriptInterpreterPythonImpl::HandleOptionArgumentCompletionForScriptedCommand(
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN,
Locker::FreeLock);
- completion_dict_sp =
- SWIGBridge::LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(
- static_cast<PyObject *>(impl_obj_sp->GetValue()), long_option,
- char_in_arg);
+ completion_dict_sp = SWIGBridge::
+ LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(
+ static_cast<PyObject *>(impl_obj_sp->GetValue()), long_option,
+ char_in_arg);
}
return completion_dict_sp;
}
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
index 12acc841c9..04d495fad2 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
@@ -174,11 +174,11 @@ public:
Args &args) override;
StructuredData::DictionarySP HandleArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
+ StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
size_t args_pos, size_t char_in_arg) override;
StructuredData::DictionarySP HandleOptionArgumentCompletionForScriptedCommand(
- StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_options,
+ StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_options,
size_t char_in_arg) override;
Status GenerateFunction(const char *signature, const StringList &input,
diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp
index d7a4952642..a2318afdf8 100644
--- a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp
+++ b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp
@@ -206,19 +206,19 @@ LLDBSwigPythonGetRepeatCommandForScriptedCommand(PyObject *implementor,
return std::nullopt;
}
-StructuredData::DictionarySP
-LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(PyObject *implementor,
- std::vector<llvm::StringRef> &args, size_t args_pos, size_t pos_in_arg) {
+StructuredData::DictionarySP
+LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(
+ PyObject *implementor, std::vector<llvm::StringRef> &args, size_t args_pos,
+ size_t pos_in_arg) {
return {};
}
-StructuredData::DictionarySP
+StructuredData::DictionarySP
LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(
- PyObject *implementor, llvm::StringRef &long_options, size_t char_in_arg) {
+ PyObject *implementor, llvm::StringRef &long_options, size_t char_in_arg) {
return {};
}
-
bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallModuleInit(
const char *python_module_name, const char *session_dictionary_name,
lldb::DebuggerSP debugger) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/109062
More information about the lldb-commits
mailing list