diff options
| -rw-r--r-- | lldb/source/Commands/CommandObjectSettings.cpp | 27 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectSettings.h | 14 | ||||
| -rw-r--r-- | lldb/test/functionalities/completion/TestCompletion.py | 4 | ||||
| -rw-r--r-- | lldb/test/settings/TestSettings.py | 17 |
4 files changed, 48 insertions, 14 deletions
diff --git a/lldb/source/Commands/CommandObjectSettings.cpp b/lldb/source/Commands/CommandObjectSettings.cpp index 2a8b4247275..b5e328b789c 100644 --- a/lldb/source/Commands/CommandObjectSettings.cpp +++ b/lldb/source/Commands/CommandObjectSettings.cpp @@ -690,11 +690,12 @@ CommandObjectSettingsReplace::~CommandObjectSettingsReplace () } bool -CommandObjectSettingsReplace::Execute (Args& command, CommandReturnObject &result) +CommandObjectSettingsReplace::ExecuteRawCommandString (const char *raw_command, CommandReturnObject &result) { UserSettingsControllerSP usc_sp (Debugger::GetSettingsController ()); - const int argc = command.GetArgumentCount (); + Args cmd_args(raw_command); + const int argc = cmd_args.GetArgumentCount (); if (argc < 3) { @@ -703,7 +704,7 @@ CommandObjectSettingsReplace::Execute (Args& command, CommandReturnObject &resul return false; } - const char *var_name = command.GetArgumentAtIndex (0); + const char *var_name = cmd_args.GetArgumentAtIndex (0); std::string var_name_string; if ((var_name == NULL) || (var_name[0] == '\0')) { @@ -713,9 +714,9 @@ CommandObjectSettingsReplace::Execute (Args& command, CommandReturnObject &resul } var_name_string = var_name; - command.Shift(); + cmd_args.Shift(); - const char *index_value = command.GetArgumentAtIndex (0); + const char *index_value = cmd_args.GetArgumentAtIndex (0); std::string index_value_string; if ((index_value == NULL) || (index_value[0] == '\0')) { @@ -725,15 +726,15 @@ CommandObjectSettingsReplace::Execute (Args& command, CommandReturnObject &resul } index_value_string = index_value; - command.Shift(); + cmd_args.Shift(); - const char *var_value; - std::string value_string; - - command.GetQuotedCommandString (value_string); - var_value = value_string.c_str(); + // Split the raw command into var_name, index_value, and value triple. + llvm::StringRef raw_str(raw_command); + llvm::StringRef var_value_str = raw_str.split(var_name).second.split(index_value).second; + StripLeadingSpaces(var_value_str); + std::string var_value_string = var_value_str.str(); - if ((var_value == NULL) || (var_value[0] == '\0')) + if (var_value_string.empty()) { result.AppendError ("'settings replace' command requires a valid variable value; no value supplied"); result.SetStatus (eReturnStatusFailed); @@ -741,7 +742,7 @@ CommandObjectSettingsReplace::Execute (Args& command, CommandReturnObject &resul else { Error err = usc_sp->SetVariable (var_name_string.c_str(), - var_value, + var_value_string.c_str(), eVarSetOperationReplace, true, m_interpreter.GetDebugger().GetInstanceName().AsCString(), diff --git a/lldb/source/Commands/CommandObjectSettings.h b/lldb/source/Commands/CommandObjectSettings.h index 057c86841bc..b83af5eb98e 100644 --- a/lldb/source/Commands/CommandObjectSettings.h +++ b/lldb/source/Commands/CommandObjectSettings.h @@ -212,7 +212,19 @@ public: virtual bool Execute (Args& command, - CommandReturnObject &result); + CommandReturnObject &result) + { return false; } + + virtual bool + WantsRawCommandString() { return true; } + + // Overrides base class's behavior where WantsCompletion = !WantsRawCommandString. + virtual bool + WantsCompletion() { return true; } + + virtual bool + ExecuteRawCommandString (const char *raw_command, + CommandReturnObject &result); virtual int HandleArgumentCompletion (Args &input, diff --git a/lldb/test/functionalities/completion/TestCompletion.py b/lldb/test/functionalities/completion/TestCompletion.py index 7b3a9ff2f84..7e9add91e6d 100644 --- a/lldb/test/functionalities/completion/TestCompletion.py +++ b/lldb/test/functionalities/completion/TestCompletion.py @@ -18,6 +18,10 @@ class CommandLineCompletionTestCase(TestBase): system(["/bin/sh", "-c", "rm -f child_send.txt"]) system(["/bin/sh", "-c", "rm -f child_read.txt"]) + def test_settings_replace_target_ru(self): + """Test that 'settings replace target.ru' completes to 'settings replace target.run-args'.""" + self.complete_from_to('settings replace target.ru', 'settings replace target.run-args') + def test_settings_s(self): """Test that 'settings s' completes to ['Available completions:', 'set', 'show'].""" self.complete_from_to('settings s', ['Available completions:', 'set', 'show']) diff --git a/lldb/test/settings/TestSettings.py b/lldb/test/settings/TestSettings.py index 696cc943511..aad7db85df6 100644 --- a/lldb/test/settings/TestSettings.py +++ b/lldb/test/settings/TestSettings.py @@ -27,6 +27,23 @@ class SettingsCommandTestCase(TestBase): "environment variables", "executable's environment"]) + def test_replace_target_run_args(self): + """Test that 'replace target.run-args' works.""" + # Set the run-args and then replace the index-0 element. + self.runCmd('settings set target.run-args a b c') + # And add hooks to restore the settings during tearDown(). + self.addTearDownHook( + lambda: self.runCmd("settings set -r target.run-args")) + + # Now replace the index-0 element with 'A', instead. + self.runCmd('settings replace target.run-args 0 A') + # Check it immediately! + self.expect('settings show target.run-args', + substrs = ['target.run-args (array) = ', + '[0]: "A"', + '[1]: "b"', + '[2]: "c"']) + def test_set_prompt(self): """Test that 'set prompt' actually changes the prompt.""" |

