[LLDB][GUI] Add Process Plugin Field

This patch adds a new Process Plugin Field. It is a choices field that
lists all the available process plugins and can retrieve the name of the
selected plugin or an empty string if the default is selected.

The Attach form now uses that field instead of manually creating a
choices field.

Reviewed By: clayborg

Differential Revision: https://reviews.llvm.org/D106467
This commit is contained in:
Omar Emara
2021-07-21 14:34:40 -07:00
committed by Greg Clayton
parent 74fd3cb8cd
commit c93dc2597a

View File

@@ -1504,6 +1504,29 @@ protected:
int m_first_visibile_choice;
};
class ProcessPluginFieldDelegate : public ChoicesFieldDelegate {
public:
ProcessPluginFieldDelegate()
: ChoicesFieldDelegate("Process Plugin", 3, GetPossiblePluginNames()) {}
std::vector<std::string> GetPossiblePluginNames() {
std::vector<std::string> names;
names.push_back("<default>");
size_t i = 0;
while (auto name = PluginManager::GetProcessPluginNameAtIndex(i++))
names.push_back(name);
return names;
}
std::string GetPluginName() {
std::string plugin_name = GetChoiceContent();
if (plugin_name == "<default>")
return "";
return plugin_name;
}
};
template <class T> class ListFieldDelegate : public FieldDelegate {
public:
ListFieldDelegate(const char *label, T default_field)
@@ -1899,6 +1922,12 @@ public:
return delegate;
}
ProcessPluginFieldDelegate *AddProcessPluginField() {
ProcessPluginFieldDelegate *delegate = new ProcessPluginFieldDelegate();
m_fields.push_back(FieldDelegateUP(delegate));
return delegate;
}
template <class T>
ListFieldDelegate<T> *AddListField(const char *label, T default_field) {
ListFieldDelegate<T> *delegate =
@@ -2347,8 +2376,7 @@ public:
m_include_existing_field =
AddBooleanField("Include existing processes.", false);
m_show_advanced_field = AddBooleanField("Show advanced settings.", false);
m_plugin_field =
AddChoicesField("Plugin Name", 3, GetPossiblePluginNames());
m_plugin_field = AddProcessPluginField();
AddAction("Attach", [this](Window &window) { Attach(window); });
}
@@ -2390,16 +2418,6 @@ public:
return module_sp->GetFileSpec().GetFilename().AsCString();
}
std::vector<std::string> GetPossiblePluginNames() {
std::vector<std::string> names;
names.push_back("<default>");
size_t i = 0;
while (auto name = PluginManager::GetProcessPluginNameAtIndex(i++))
names.push_back(name);
return names;
}
bool StopRunningProcess() {
ExecutionContext exe_ctx =
m_debugger.GetCommandInterpreter().GetExecutionContext();
@@ -2455,8 +2473,7 @@ public:
} else {
attach_info.SetProcessID(m_pid_field->GetInteger());
}
if (m_plugin_field->GetChoiceContent() != "<default>")
attach_info.SetProcessPluginName(m_plugin_field->GetChoiceContent());
attach_info.SetProcessPluginName(m_plugin_field->GetPluginName());
return attach_info;
}
@@ -2504,7 +2521,7 @@ protected:
BooleanFieldDelegate *m_wait_for_field;
BooleanFieldDelegate *m_include_existing_field;
BooleanFieldDelegate *m_show_advanced_field;
ChoicesFieldDelegate *m_plugin_field;
ProcessPluginFieldDelegate *m_plugin_field;
};
class MenuDelegate {