From f1c5cee0fa746a428450d61839f1b294c79ffe0c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Sat, 22 Jul 2023 23:30:03 +0200 Subject: [PATCH 1/2] gh-104050: Argument Clinic: Increase typing coverage --- Tools/clinic/clinic.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 7a4c9c4cacf55b..09bc3ddbccede0 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -2950,12 +2950,18 @@ def parse_argument(self, args: list[str]) -> None: # All the functions after here are intended as extension points. # - def simple_declaration(self, by_reference=False, *, in_parser=False): + def simple_declaration( + self, + by_reference: bool = False, + *, + in_parser: bool = False + ) -> str: """ Computes the basic declaration of the variable. Used in computing the prototype declaration and the variable declaration. """ + assert isinstance(self.type, str) prototype = [self.type] if by_reference or not self.type.endswith('*'): prototype.append(" ") @@ -2970,7 +2976,7 @@ def simple_declaration(self, by_reference=False, *, in_parser=False): prototype.append(name) return "".join(prototype) - def declaration(self, *, in_parser=False) -> str: + def declaration(self, *, in_parser: bool = False) -> str: """ The C statement to declare this variable. """ @@ -3579,9 +3585,9 @@ class object_converter(CConverter): def converter_init( self, *, - converter=None, - type=None, - subclass_of=None + converter: str | None = None, + type: str | None = None, + subclass_of: str | None = None ) -> None: if converter: if subclass_of: @@ -3973,7 +3979,7 @@ class self_converter(CConverter): type = None format_unit = '' - def converter_init(self, *, type=None) -> None: + def converter_init(self, *, type: str | None = None) -> None: self.specified_type = type def pre_render(self): @@ -4047,7 +4053,7 @@ def render(self, parameter, data): assert data.impl_arguments[0] == self.name data.impl_arguments[0] = '(' + self.type + ")" + data.impl_arguments[0] - def set_template_dict(self, template_dict): + def set_template_dict(self, template_dict: TemplateDict) -> None: template_dict['self_name'] = self.name template_dict['self_type'] = self.parser_type kind = self.function.kind @@ -4066,7 +4072,7 @@ def set_template_dict(self, template_dict): line = f'{type_check} &&\n ' template_dict['self_type_check'] = line - type_object = self.function.cls.type_object + type_object = cls.type_object type_ptr = f'PyTypeObject *base_tp = {type_object};' template_dict['base_type_ptr'] = type_ptr @@ -4276,11 +4282,11 @@ def eval_ast_expr( class IndentStack: - def __init__(self): - self.indents = [] - self.margin = None + def __init__(self) -> None: + self.indents: list[int] = [] + self.margin = "" - def _ensure(self): + def _ensure(self) -> None: if not self.indents: fail('IndentStack expected indents, but none are defined.') @@ -5534,7 +5540,7 @@ def add_parameter(text): return docstring - def state_terminal(self, line): + def state_terminal(self, line: str | None) -> None: """ Called when processing the block is done. """ From 3a7ed4700304da69e8dceb69d1d7678de4db016c Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 22 Jul 2023 23:58:27 +0200 Subject: [PATCH 2/2] Add changes suggested in code review --- Tools/clinic/clinic.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 09bc3ddbccede0..eecb81dcad5881 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -4284,7 +4284,7 @@ def eval_ast_expr( class IndentStack: def __init__(self) -> None: self.indents: list[int] = [] - self.margin = "" + self.margin: str | None = None def _ensure(self) -> None: if not self.indents: @@ -4347,6 +4347,7 @@ def indent(self, line: str) -> str: """ Indents a line by the currently defined margin. """ + assert self.margin is not None, "Cannot call .indent() before calling .infer()" return self.margin + line def dedent(self, line: str) -> str: @@ -4354,6 +4355,7 @@ def dedent(self, line: str) -> str: Dedents a line by the currently defined margin. (The inverse of 'indent'.) """ + assert self.margin is not None, "Cannot call .indent() before calling .infer()" margin = self.margin indent = self.indents[-1] if not line.startswith(margin): @@ -5238,6 +5240,7 @@ def parse_slash(self, function: Function) -> None: p.kind = inspect.Parameter.POSITIONAL_ONLY def state_parameter_docstring_start(self, line: str | None) -> None: + assert self.indent.margin is not None, "self.margin.infer() has not yet been called to set the margin" self.parameter_docstring_indent = len(self.indent.margin) assert self.indent.depth == 3 return self.next(self.state_parameter_docstring, line)