Skip to content

gh-104050: Improve Argument Clinic type annotation coverage #106810

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

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
49 changes: 31 additions & 18 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class _TextAccumulator(NamedTuple):

def _text_accumulator() -> _TextAccumulator:
text: list[str] = []
def output():
def output() -> str:
s = ''.join(text)
text.clear()
return s
Expand Down Expand Up @@ -432,10 +432,10 @@ class FormatCounterFormatter(string.Formatter):
the counts dict would now look like
{'a': 2, 'b': 1, 'c': 1}
"""
def __init__(self):
self.counts = collections.Counter()
def __init__(self) -> None:
self.counts = collections.Counter[str]()

def get_value(self, key, args, kwargs):
def get_value(self, key: str, args, kwargs) -> str: # type: ignore[override]
self.counts[key] += 1
return ''

Expand All @@ -446,18 +446,25 @@ class Language(metaclass=abc.ABCMeta):
stop_line = ""
checksum_line = ""

def __init__(self, filename):
def __init__(self, filename: str) -> None:
pass

@abc.abstractmethod
def render(self, clinic, signatures):
def render(
self,
clinic: Clinic | None,
signatures: Iterable[Module | Class | Function]
) -> str:
pass

def parse_line(self, line):
def parse_line(self, line: str) -> None:
pass

def validate(self):
def assert_only_one(attr, *additional_fields):
def validate(self) -> None:
def assert_only_one(
attr: str,
*additional_fields: str
) -> None:
"""
Ensures that the string found at getattr(self, attr)
contains exactly one formatter replacement string for
Expand All @@ -484,10 +491,10 @@ def assert_only_one(attr, *additional_fields):
"""
fields = ['dsl_name']
fields.extend(additional_fields)
line = getattr(self, attr)
line: str = getattr(self, attr)
fcf = FormatCounterFormatter()
fcf.format(line)
def local_fail(should_be_there_but_isnt):
def local_fail(should_be_there_but_isnt: bool) -> None:
if should_be_there_but_isnt:
fail("{} {} must contain {{{}}} exactly once!".format(
self.__class__.__name__, attr, name))
Expand Down Expand Up @@ -748,10 +755,10 @@ class CLanguage(Language):
stop_line = "[{dsl_name} start generated code]*/"
checksum_line = "/*[{dsl_name} end generated code: {arguments}]*/"

def __init__(self, filename):
def __init__(self, filename: str) -> None:
super().__init__(filename)
self.cpp = cpp.Monitor(filename)
self.cpp.fail = fail
self.cpp.fail = fail # type: ignore[method-assign]

def parse_line(self, line: str) -> None:
self.cpp.writeline(line)
Expand Down Expand Up @@ -934,6 +941,7 @@ def parser_body(
add(field)
return linear_format(output(), parser_declarations=declarations)

parsearg: str | None
if not parameters:
parser_code: list[str] | None
if not requires_defining_class:
Expand Down Expand Up @@ -1879,7 +1887,12 @@ class BlockPrinter:
language: Language
f: io.StringIO = dc.field(default_factory=io.StringIO)

def print_block(self, block, *, core_includes=False):
def print_block(
self,
block: Block,
*,
core_includes: bool = False
) -> None:
input = block.input
output = block.output
dsl_name = block.dsl_name
Expand Down Expand Up @@ -1930,7 +1943,7 @@ def print_block(self, block, *, core_includes=False):
write(self.language.checksum_line.format(dsl_name=dsl_name, arguments=arguments))
write("\n")

def write(self, text):
def write(self, text: str) -> None:
self.f.write(text)


Expand Down Expand Up @@ -2749,7 +2762,7 @@ class CConverter(metaclass=CConverterAutoRegister):
# If not None, should be a string representing a pointer to a
# PyTypeObject (e.g. "&PyUnicode_Type").
# Only used by the 'O!' format unit (and the "object" converter).
subclass_of = None
subclass_of: str | None = None

# Do we want an adjacent '_length' variable for this variable?
# Only used by format units ending with '#'.
Expand Down Expand Up @@ -2942,7 +2955,7 @@ def simple_declaration(self, by_reference=False, *, in_parser=False):
prototype.append(name)
return "".join(prototype)

def declaration(self, *, in_parser=False):
def declaration(self, *, in_parser=False) -> str:
"""
The C statement to declare this variable.
"""
Expand Down Expand Up @@ -3000,7 +3013,7 @@ def pre_render(self):
"""
pass

def parse_arg(self, argname, displayname):
def parse_arg(self, argname: str, displayname: str):
if self.format_unit == 'O&':
return """
if (!{converter}({argname}, &{paramname})) {{{{
Expand Down