aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectCommands.cpp
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2022-11-09 10:11:16 -0800
committerJim Ingham <jingham@apple.com>2022-11-09 10:11:16 -0800
commitd518ed42ae85786c371fd4578f72ab7eb286cb30 (patch)
tree0db9ca570b81acfb409aba93b42a3a9a7613532a /lldb/source/Commands/CommandObjectCommands.cpp
parentb565e7f0c4cb1768f6c43499aed95adb8cc4f04a (diff)
downloadllvm-d518ed42ae85786c371fd4578f72ab7eb286cb30.zip
llvm-d518ed42ae85786c371fd4578f72ab7eb286cb30.tar.gz
llvm-d518ed42ae85786c371fd4578f72ab7eb286cb30.tar.bz2
Handle aliasing a non-top-level command.
This didn't work previously because we had to check whether the incoming command was an alias command, but if it wasn't we still used the result of that lookup - which was by the command's node name. That fails for non-top-level commands. In this case, the resolution is pretty simple since we already have the node's CommandObject, so all we needed to do was turn it into a shared pointer, for which I added enable_shared_from_this to the CommandObject. Differential Revision: https://reviews.llvm.org/D137662
Diffstat (limited to 'lldb/source/Commands/CommandObjectCommands.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectCommands.cpp40
1 files changed, 21 insertions, 19 deletions
diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp
index 3d4893d..9bf07f3 100644
--- a/lldb/source/Commands/CommandObjectCommands.cpp
+++ b/lldb/source/Commands/CommandObjectCommands.cpp
@@ -485,29 +485,31 @@ protected:
OptionArgVectorSP(new OptionArgVector);
const bool include_aliases = true;
- if (CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact(
- cmd_obj.GetCommandName(), include_aliases)) {
- if (m_interpreter.AliasExists(alias_command) ||
- m_interpreter.UserCommandExists(alias_command)) {
- result.AppendWarningWithFormat(
- "Overwriting existing definition for '%s'.\n",
- alias_command.str().c_str());
- }
- if (CommandAlias *alias = m_interpreter.AddAlias(
- alias_command, cmd_obj_sp, raw_command_string)) {
- if (m_command_options.m_help.OptionWasSet())
- alias->SetHelp(m_command_options.m_help.GetCurrentValue());
- if (m_command_options.m_long_help.OptionWasSet())
- alias->SetHelpLong(m_command_options.m_long_help.GetCurrentValue());
- result.SetStatus(eReturnStatusSuccessFinishNoResult);
- } else {
- result.AppendError("Unable to create requested alias.\n");
- }
+ // Look up the command using command's name first. This is to resolve
+ // aliases when you are making nested aliases. But if you don't find
+ // it that way, then it wasn't an alias and we can just use the object
+ // we were passed in.
+ CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact(
+ cmd_obj.GetCommandName(), include_aliases);
+ if (!cmd_obj_sp)
+ cmd_obj_sp = cmd_obj.shared_from_this();
+ if (m_interpreter.AliasExists(alias_command) ||
+ m_interpreter.UserCommandExists(alias_command)) {
+ result.AppendWarningWithFormat(
+ "Overwriting existing definition for '%s'.\n",
+ alias_command.str().c_str());
+ }
+ if (CommandAlias *alias = m_interpreter.AddAlias(
+ alias_command, cmd_obj_sp, raw_command_string)) {
+ if (m_command_options.m_help.OptionWasSet())
+ alias->SetHelp(m_command_options.m_help.GetCurrentValue());
+ if (m_command_options.m_long_help.OptionWasSet())
+ alias->SetHelpLong(m_command_options.m_long_help.GetCurrentValue());
+ result.SetStatus(eReturnStatusSuccessFinishNoResult);
} else {
result.AppendError("Unable to create requested alias.\n");
}
-
return result.Succeeded();
}