diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index bff8935df13bc6..6d1796cd6135ed 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -530,12 +530,11 @@ class PythonLanguage(Language): checksum_line = "#/*[{dsl_name} end generated code: {arguments}]*/" -ParamGroup = Iterable["Parameter"] ParamTuple = tuple["Parameter", ...] def permute_left_option_groups( - l: Sequence[ParamGroup] + l: Sequence[Iterable[Parameter]] ) -> Iterator[ParamTuple]: """ Given [(1,), (2,), (3,)], should yield: @@ -552,7 +551,7 @@ def permute_left_option_groups( def permute_right_option_groups( - l: Sequence[ParamGroup] + l: Sequence[Iterable[Parameter]] ) -> Iterator[ParamTuple]: """ Given [(1,), (2,), (3,)], should yield: @@ -569,9 +568,9 @@ def permute_right_option_groups( def permute_optional_groups( - left: Sequence[ParamGroup], - required: ParamGroup, - right: Sequence[ParamGroup] + left: Sequence[Iterable[Parameter]], + required: Iterable[Parameter], + right: Sequence[Iterable[Parameter]] ) -> tuple[ParamTuple, ...]: """ Generator function that computes the set of acceptable @@ -1374,7 +1373,11 @@ def group_to_variable_name(group: int) -> str: adjective = "left_" if group < 0 else "right_" return "group_" + adjective + str(abs(group)) - def render_option_group_parsing(self, f, template_dict): + def render_option_group_parsing( + self, + f: Function, + template_dict: TemplateDict + ) -> None: # positional only, grouped, optional arguments! # can be optional on the left or right. # here's an example: @@ -1398,11 +1401,11 @@ def render_option_group_parsing(self, f, template_dict): if isinstance(parameters[0].converter, self_converter): del parameters[0] - group = None + group: list[Parameter] | None = None left = [] right = [] - required = [] - last = unspecified + required: list[Parameter] = [] + last: int | Literal[Sentinels.unspecified] = unspecified for p in parameters: group_id = p.group @@ -1415,6 +1418,7 @@ def render_option_group_parsing(self, f, template_dict): group = required else: right.append(group) + assert group is not None group.append(p) count_min = sys.maxsize @@ -1433,19 +1437,21 @@ def render_option_group_parsing(self, f, template_dict): continue group_ids = {p.group for p in subset} # eliminate duplicates - d = {} + d: dict[str, str | int] = {} d['count'] = count d['name'] = f.name d['format_units'] = "".join(p.converter.format_unit for p in subset) - parse_arguments = [] + parse_arguments: list[str] = [] for p in subset: p.converter.parse_argument(parse_arguments) d['parse_arguments'] = ", ".join(parse_arguments) group_ids.discard(0) - lines = [self.group_to_variable_name(g) + " = 1;" for g in group_ids] - lines = "\n".join(lines) + lines = "\n".join([ + self.group_to_variable_name(g) + " = 1;" + for g in group_ids + ]) s = """\ case {count}: