Skip to content

Commit 1439060

Browse files
committed
Make flag-only options work in the ParsedCommand mode of adding
commands. I neglected to add a test when I was writing tests for this, so of course it broke. This makes it work again and adds a test. rdar://159459160
1 parent 6e5d008 commit 1439060

File tree

4 files changed

+69
-12
lines changed

4 files changed

+69
-12
lines changed

lldb/examples/python/cmdtemplate.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ def setup_command_definition(self):
7474
dest = "statics",
7575
default = True,
7676
)
77+
ov_parser.add_option(
78+
"t",
79+
"test-flag",
80+
help = "test a flag value.",
81+
)
7782

7883
def get_repeat_command(self, args):
7984
"""As an example, make the command not auto-repeat:"""
@@ -123,6 +128,11 @@ def __call__(self, debugger, command, exe_ctx, result):
123128
% (variables_count, total_size, average_size),
124129
file=result,
125130
)
131+
if ov_parser.was_set("test-flag"):
132+
print("Got the test flag")
133+
else:
134+
print("Got no test flag")
135+
126136
# not returning anything is akin to returning success
127137

128138

lldb/examples/python/templates/parsed_cmd.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,18 @@ def option_parsing_started(self):
241241
starts, you can override this to handle your special option. """
242242
for key, elem in self.options_dict.items():
243243
elem['_value_set'] = False
244+
# If there's no value_type, then there can't be a dest.
245+
if not "value_type" in elem:
246+
continue
247+
244248
try:
245249
object.__setattr__(self, elem["dest"], elem["default"])
246250
except AttributeError:
247251
# It isn't an error not to have a "dest" variable name, you'll
248252
# just have to manage this option's value on your own.
249253
continue
254+
except KeyError:
255+
continue
250256

251257
def set_enum_value(self, enum_values, input):
252258
""" This sets the value for an enum option, you should not have to call this
@@ -271,7 +277,13 @@ def set_option_value(self, exe_ctx, opt_name, opt_value):
271277
elem = self.get_option_element(opt_name)
272278
if not elem:
273279
return False
274-
280+
281+
# If there's no value_type in element, then it has no value, so just mark
282+
# it set and return:
283+
if not "value_type" in elem:
284+
elem["_value_set"] = True
285+
return True
286+
275287
if "enum_values" in elem:
276288
(value, error) = self.set_enum_value(elem["enum_values"], opt_value)
277289
else:
@@ -312,9 +324,9 @@ def dest_for_option(self, opt_name):
312324
value = self.__dict__[elem["dest"]]
313325
return value
314326

315-
def add_option(self, short_option, long_option, help, default,
327+
def add_option(self, short_option, long_option, help, default = None,
316328
dest = None, required=False, groups = None,
317-
value_type=lldb.eArgTypeNone, completion_type=None,
329+
value_type=None, completion_type=None,
318330
enum_values=None):
319331
"""
320332
short_option: one character, must be unique, not required
@@ -344,13 +356,22 @@ def add_option(self, short_option, long_option, help, default,
344356
dict = {"short_option" : short_option,
345357
"required" : required,
346358
"help" : help,
347-
"value_type" : value_type,
348-
"completion_type" : completion_type,
349-
"dest" : dest,
350-
"default" : default}
359+
}
351360

352361
if enum_values:
362+
if not value_type:
363+
print("I am setting value type for an enum value")
364+
value_type = lldb.eArgTypeNone
365+
else:
366+
print(f"An enum value had a type: {value_type}")
353367
dict["enum_values"] = enum_values
368+
369+
if value_type:
370+
dict["value_type"] = value_type
371+
dict["completion_type"] = completion_type
372+
dict["dest"] = dest
373+
dict["default"] = default
374+
354375
if groups:
355376
dict["groups"] = groups
356377

lldb/test/API/commands/command/script/add/TestAddParsedCommand.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def check_help_options(self, cmd_name, opt_list, substrs=[]):
3434
else:
3535
(short_opt, type, long_opt) = elem
3636
substrs.append(f"-{short_opt} <{type}> ( --{long_opt} <{type}> )")
37+
3738
self.expect("help " + cmd_name, substrs=substrs)
3839

3940
def run_one_repeat(self, commands, expected_num_errors):
@@ -215,8 +216,21 @@ def cleanup():
215216
"bool-arg (set: True): False",
216217
"shlib-name (set: True): Something",
217218
"disk-file-name (set: False):",
219+
"flag-value (set: False):",
218220
"line-num (set: False):",
219-
"enum-option (set: False):",
221+
"enum-option (set: False):"
222+
],
223+
)
224+
# Make sure flag values work:
225+
self.expect(
226+
"no-args -b false -s Something -f",
227+
substrs=[
228+
"bool-arg (set: True): False",
229+
"shlib-name (set: True): Something",
230+
"disk-file-name (set: False):",
231+
"flag-value (set: True):",
232+
"line-num (set: False):",
233+
"enum-option (set: False):"
220234
],
221235
)
222236

lldb/test/API/commands/command/script/add/test_commands.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@ def __call__(self, debugger, args_array, exe_ctx, result):
1616
if len(opt_def):
1717
result.AppendMessage("Options:\n")
1818
for long_option, elem in opt_def.items():
19-
dest = elem["dest"]
20-
result.AppendMessage(
21-
f"{long_option} (set: {elem['_value_set']}): {object.__getattribute__(self.get_parser(), dest)}\n"
22-
)
19+
if "value_type" in elem:
20+
print(f"Looking at {long_option} - {elem}")
21+
dest = elem["dest"]
22+
result.AppendMessage(
23+
f"{long_option} (set: {elem['_value_set']}): {object.__getattribute__(self.get_parser(), dest)}\n"
24+
)
25+
else:
26+
result.AppendMessage(
27+
f"{long_option} (set: {elem['_value_set']}): flag value\n"
28+
)
2329
else:
2430
result.AppendMessage("No options\n")
2531

@@ -78,6 +84,12 @@ def setup_command_definition(self):
7884
default=None,
7985
)
8086

87+
ov_parser.add_option(
88+
"f",
89+
"flag-value",
90+
"This is a flag value"
91+
)
92+
8193
ov_parser.add_option(
8294
"l",
8395
"line-num",

0 commit comments

Comments
 (0)