Skip to content

Commit

Permalink
pythongh-104050: Argument Clinic: Annotate output_templates() (pyth…
Browse files Browse the repository at this point in the history
…on#106732)

Co-authored-by: AlexWaygood <alex.waygood@gmail.com>
  • Loading branch information
erlend-aasland and AlexWaygood authored Jul 14, 2023
1 parent 89867d2 commit 7c95345
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -792,11 +792,14 @@ 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)
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
Expand All @@ -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():
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -932,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"
Expand Down Expand Up @@ -1165,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 "
Expand Down Expand Up @@ -1308,6 +1312,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("""
Expand Down

0 comments on commit 7c95345

Please sign in to comment.