Skip to content

Commit e2d9420

Browse files
authored
Make flag-only options work in the ParsedCommand mode of adding commands (llvm#157756)
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 f5315bd commit e2d9420

File tree

4 files changed

+80
-17
lines changed

4 files changed

+80
-17
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: 44 additions & 13 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,10 +324,19 @@ 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,
316-
dest = None, required=False, groups = None,
317-
value_type=lldb.eArgTypeNone, completion_type=None,
318-
enum_values=None):
327+
def add_option(
328+
self,
329+
short_option,
330+
long_option,
331+
help,
332+
default=None,
333+
dest=None,
334+
required=False,
335+
groups=None,
336+
value_type=None,
337+
completion_type=None,
338+
enum_values=None,
339+
):
319340
"""
320341
short_option: one character, must be unique, not required
321342
long_option: no spaces, must be unique, required
@@ -340,17 +361,27 @@ def add_option(self, short_option, long_option, help, default,
340361

341362
if not completion_type:
342363
completion_type = self.determine_completion(value_type)
343-
344-
dict = {"short_option" : short_option,
345-
"required" : required,
346-
"help" : help,
347-
"value_type" : value_type,
348-
"completion_type" : completion_type,
349-
"dest" : dest,
350-
"default" : default}
364+
365+
dict = {
366+
"short_option": short_option,
367+
"required": required,
368+
"help": help,
369+
}
351370

352371
if enum_values:
372+
if not value_type:
373+
print("I am setting value type for an enum value")
374+
value_type = lldb.eArgTypeNone
375+
else:
376+
print(f"An enum value had a type: {value_type}")
353377
dict["enum_values"] = enum_values
378+
379+
if value_type:
380+
dict["value_type"] = value_type
381+
dict["completion_type"] = completion_type
382+
dict["dest"] = dest
383+
dict["default"] = default
384+
354385
if groups:
355386
dict["groups"] = groups
356387

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

Lines changed: 14 additions & 0 deletions
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,6 +216,19 @@ 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):",
220+
"line-num (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):",
218232
"line-num (set: False):",
219233
"enum-option (set: False):",
220234
],

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

Lines changed: 12 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,8 @@ def setup_command_definition(self):
7884
default=None,
7985
)
8086

87+
ov_parser.add_option("f", "flag-value", "This is a flag value")
88+
8189
ov_parser.add_option(
8290
"l",
8391
"line-num",

0 commit comments

Comments
 (0)