From adaaa9cbe97a6828c91e1aedab08bda4914a9ebb Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 14 Jul 2023 01:12:32 +0200 Subject: [PATCH 1/3] gh-104050: Argument Clinic: Annotate output_templates() --- Tools/clinic/clinic.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 2dce33690993dd..5072f80be876d0 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -792,7 +792,10 @@ def docstring_for_c_string( add('"') return ''.join(text) - def output_templates(self, f): + def output_templates( + self, + f: Function + ) -> dict[str, str]: parameters = list(f.parameters.values()) assert parameters assert isinstance(parameters[0].converter, self_converter) @@ -809,7 +812,7 @@ def output_templates(self, f): new_or_init = f.kind.new_or_init - vararg = NO_VARARG + vararg: int | str = NO_VARARG pos_only = min_pos = max_pos = min_kw_only = pseudo_args = 0 for i, p in enumerate(parameters, 1): if p.is_keyword_only(): @@ -897,7 +900,7 @@ def output_templates(self, f): # parser_body_fields remembers the fields passed in to the # previous call to parser_body. this is used for an awful hack. - parser_body_fields = () + parser_body_fields: tuple[str, ...] = () def parser_body( prototype: str, *fields: str, @@ -1308,6 +1311,8 @@ def parser_body( cpp_if = "#if " + conditional cpp_endif = "#endif /* " + conditional + " */" + assert clinic is not None + assert f.full_name is not None if methoddef_define and f.full_name not in clinic.ifndef_symbols: clinic.ifndef_symbols.add(f.full_name) methoddef_ifndef = normalize_snippet(""" From 6891e14096f6fc91424c9070da945aec9f8a0b89 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Fri, 14 Jul 2023 12:05:26 +0100 Subject: [PATCH 2/3] Fix some reachability-analysis errors --- Tools/clinic/clinic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 5072f80be876d0..221327de8af92d 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -935,6 +935,7 @@ def parser_body( return linear_format(output(), parser_declarations=declarations) if not parameters: + parser_code: list[str] | None if not requires_defining_class: # no parameters, METH_NOARGS flags = "METH_NOARGS" @@ -1168,7 +1169,7 @@ def parser_body( flags = 'METH_METHOD|' + flags parser_prototype = parser_prototype_def_class - add_label = None + add_label: str | None = None for i, p in enumerate(parameters): if isinstance(p.converter, defining_class_converter): raise ValueError("defining_class should be the first " From f9cb5371a794ac269623f025d4b6a703f2993c26 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Fri, 14 Jul 2023 12:36:17 +0100 Subject: [PATCH 3/3] Fix last mypy error --- Tools/clinic/clinic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 221327de8af92d..726ebc04f55bd5 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -798,8 +798,8 @@ def output_templates( ) -> dict[str, str]: parameters = list(f.parameters.values()) assert parameters - assert isinstance(parameters[0].converter, self_converter) - del parameters[0] + first_param = parameters.pop(0) + assert isinstance(first_param.converter, self_converter) requires_defining_class = False if parameters and isinstance(parameters[0].converter, defining_class_converter): requires_defining_class = True