[Lldb-commits] [PATCH] D137662: Make aliases from a raw command that isn't a top-level command work
Jim Ingham via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue Nov 8 12:25:05 PST 2022
jingham created this revision.
jingham added reviewers: JDevlieghere, kastiglione, clayborg.
Herald added a subscriber: jeroen.dobbelaere.
Herald added a project: All.
jingham requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
When we went to alias a raw command, we look up the command and pass that to HandleAliasingRawCommand. But then there is a check to make sure that we aren't using a nested alias, which we do by re-looking up the command object by name. Note, the command object's name is just its individual name, not the full path. That's appropriate for checking aliases since at present you can only alias TO a top-level command.
But if that lookup failed we return an error. That lookup will fail for anything that's not a top-level command, since this is just the node name not the path. So we should then look up the full command, but fortunately we don't have to do that because we already have the command passed in. So if it isn't an alias to be resolved, we can just use it directly.
I had to add enable_shared_from_this to CommandObject. We pass CommandObject *'s around in the command parsing code when we probably should be passing Shared Pointers, but trying to fix that ended up being a lot of change for not much benefit, and shared_from_this solves this neatly.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D137662
Files:
lldb/include/lldb/Interpreter/CommandObject.h
lldb/source/Commands/CommandObjectCommands.cpp
lldb/test/API/commands/command/container/TestContainerCommands.py
Index: lldb/test/API/commands/command/container/TestContainerCommands.py
===================================================================
--- lldb/test/API/commands/command/container/TestContainerCommands.py
+++ lldb/test/API/commands/command/container/TestContainerCommands.py
@@ -55,6 +55,12 @@
self.expect("test-multi test-multi-sub welcome friend", "Test command works",
substrs=["Hello friend, welcome to LLDB"])
+ # Make sure we can make an alias to this:
+ self.runCmd("command alias my-welcome test-multi test-multi-sub welcome", "We can make an alias to multi-word")
+ self.expect("my-welcome friend", "Test command works",
+ substrs=["Hello friend, welcome to LLDB"])
+ self.runCmd("command unalias my-welcome")
+
# Make sure overwriting works on the leaf command. First using the
# explicit option so we should not be able to remove extant commands by default:
Index: lldb/source/Commands/CommandObjectCommands.cpp
===================================================================
--- lldb/source/Commands/CommandObjectCommands.cpp
+++ lldb/source/Commands/CommandObjectCommands.cpp
@@ -485,29 +485,31 @@
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();
}
Index: lldb/include/lldb/Interpreter/CommandObject.h
===================================================================
--- lldb/include/lldb/Interpreter/CommandObject.h
+++ lldb/include/lldb/Interpreter/CommandObject.h
@@ -10,6 +10,7 @@
#define LLDB_INTERPRETER_COMMANDOBJECT_H
#include <map>
+#include <memory>
#include <string>
#include <vector>
@@ -64,7 +65,7 @@
return max_len;
}
-class CommandObject {
+class CommandObject : public std::enable_shared_from_this<CommandObject> {
public:
typedef llvm::StringRef(ArgumentHelpCallbackFunction)();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137662.474066.patch
Type: text/x-patch
Size: 4101 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20221108/d297812d/attachment.bin>
More information about the lldb-commits
mailing list