Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-104050: Argument Clinic: Annotate output_templates() #106732

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved
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
Loading