Skip to content

Commit

Permalink
pythongh-104050: Improve Argument Clinic type annotation coverage (py…
Browse files Browse the repository at this point in the history
…thon#106810)

Add various missing annotations in the following classes:
- BlockPrinter
- CConverter
- CLanguage
- FormatCounterFormatter
- Language
- _TextAccumulator

Co-authored-by: Alex Waygood <[email protected]>
  • Loading branch information
erlend-aasland and AlexWaygood authored Jul 17, 2023
1 parent 5ecedbd commit 036bb73
Showing 1 changed file with 31 additions and 18 deletions.
49 changes: 31 additions & 18 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,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 @@ -433,10 +433,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 @@ -447,18 +447,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 @@ -485,10 +492,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 @@ -749,10 +756,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 @@ -935,6 +942,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 @@ -1880,7 +1888,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 @@ -1931,7 +1944,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 @@ -2755,7 +2768,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 @@ -2948,7 +2961,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 @@ -3006,7 +3019,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

0 comments on commit 036bb73

Please sign in to comment.