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: Annotate more Argument Clinic DSLParser state methods #106376

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
28 changes: 19 additions & 9 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4781,14 +4781,16 @@ def to_required(self):
for p in self.function.parameters.values():
p.group = -p.group

def state_parameter(self, line):
if self.parameter_continuation:
line = self.parameter_continuation + ' ' + line.lstrip()
self.parameter_continuation = ''
def state_parameter(self, line: str | None) -> None:
assert isinstance(self.function, Function)

if not self.valid_line(line):
return

if self.parameter_continuation:
line = self.parameter_continuation + ' ' + line.lstrip()
self.parameter_continuation = ''

assert self.indent.depth == 2
indent = self.indent.infer(line)
if indent == -1:
Expand Down Expand Up @@ -4839,6 +4841,7 @@ def state_parameter(self, line):
fields[0] = name
line = ' '.join(fields)

default: str | None
base, equals, default = line.rpartition('=')
if not equals:
base = default
Expand All @@ -4861,7 +4864,9 @@ def state_parameter(self, line):
if not module:
fail("Function " + self.function.name + " has an invalid parameter declaration:\n\t" + line)

function_args = module.body[0].args
function = module.body[0]
assert isinstance(function, ast.FunctionDef)
function_args = function.args

if len(function_args.args) > 1:
fail("Function " + self.function.name + " has an invalid parameter declaration (comma?):\n\t" + line)
Expand All @@ -4884,6 +4889,7 @@ def state_parameter(self, line):
if self.parameter_state is ParamState.OPTIONAL:
fail(f"Can't have a parameter without a default ({parameter_name!r})\n"
"after a parameter with a default!")
value: Sentinels | Null
if is_vararg:
value = NULL
kwargs.setdefault('c_default', "NULL")
Expand Down Expand Up @@ -4946,8 +4952,11 @@ def bad_node(self, node):
if bad:
fail("Unsupported expression as default value: " + repr(default))

expr = module.body[0].value
assignment = module.body[0]
assert isinstance(assignment, ast.Assign)
expr = assignment.value
# mild hack: explicitly support NULL as a default value
c_default: str | None
if isinstance(expr, ast.Name) and expr.id == 'NULL':
value = NULL
py_default = '<unrepresentable>'
Expand All @@ -4964,7 +4973,7 @@ def bad_node(self, node):
value = unknown
elif isinstance(expr, ast.Attribute):
a = []
n = expr
n: ast.expr | ast.Attribute = expr
while isinstance(n, ast.Attribute):
a.append(n.attr)
n = n.value
Expand All @@ -4984,7 +4993,7 @@ def bad_node(self, node):
else:
value = ast.literal_eval(expr)
py_default = repr(value)
if isinstance(value, (bool, None.__class__)):
if isinstance(value, (bool, NoneType)):
c_default = "Py_" + py_default
elif isinstance(value, str):
c_default = c_repr(value)
Expand All @@ -5011,6 +5020,7 @@ def bad_node(self, node):
# but the parameter object gets the python name
converter = dict[name](c_name or parameter_name, parameter_name, self.function, value, **kwargs)

kind: inspect._ParameterKind
if is_vararg:
kind = inspect.Parameter.VAR_POSITIONAL
elif self.keyword_only:
Expand Down Expand Up @@ -5130,7 +5140,7 @@ def parse_special_symbol(self, symbol):
fail("Function " + self.function.name + " mixes keyword-only and positional-only parameters, which is unsupported.")
p.kind = inspect.Parameter.POSITIONAL_ONLY

def state_parameter_docstring_start(self, line: str) -> None:
def state_parameter_docstring_start(self, line: str | None) -> None:
self.parameter_docstring_indent = len(self.indent.margin)
assert self.indent.depth == 3
return self.next(self.state_parameter_docstring, line)
Expand Down