@@ -324,9 +324,9 @@ def version_splitter(s: str) -> tuple[int, ...]:
324324 c -> -1
325325 (This permits Python-style version strings such as "1.4b3".)
326326 """
327- version = []
327+ version : list [ int ] = []
328328accumulator :list [str ]= []
329- def flush ():
329+ def flush ()-> None :
330330if not accumulator :
331331raise ValueError ('Unsupported version string: ' + repr (s ))
332332version .append (int ('' .join (accumulator )))
@@ -4201,8 +4201,10 @@ def dedent(self, line):
42014201return line [indent :]
42024202
42034203
4204+ StateKeeper = Callable [[str | None ],None ]
4205+
42044206class DSLParser :
4205- def __init__ (self ,clinic ) :
4207+ def __init__ (self ,clinic : Clinic ) -> None :
42064208self .clinic = clinic
42074209
42084210self .directives = {}
@@ -4219,9 +4221,9 @@ def __init__(self, clinic):
42194221
42204222self .reset ()
42214223
4222- def reset (self ):
4224+ def reset (self )-> None :
42234225self .function = None
4224- self .state = self .state_dsl_start
4226+ self .state : StateKeeper = self .state_dsl_start
42254227self .parameter_indent = None
42264228self .keyword_only = False
42274229self .positional_only = False
@@ -4234,12 +4236,12 @@ def reset(self):
42344236self .parameter_continuation = ''
42354237self .preserve_output = False
42364238
4237- def directive_version (self ,required ) :
4239+ def directive_version (self ,required : str ) -> None :
42384240global version
42394241if version_comparitor (version ,required )< 0 :
42404242fail ("Insufficient Clinic version!\n Version: " + version + "\n Required: " + required )
42414243
4242- def directive_module (self ,name ) :
4244+ def directive_module (self ,name : str ) -> None :
42434245fields = name .split ('.' )[:- 1 ]
42444246module ,cls = self .clinic ._module_and_class (fields )
42454247if cls :
@@ -4252,9 +4254,13 @@ def directive_module(self, name):
42524254module .modules [name ]= m
42534255self .block .signatures .append (m )
42544256
4255- def directive_class (self ,name ,typedef ,type_object ):
4257+ def directive_class (
4258+ self ,
4259+ name :str ,
4260+ typedef :str ,
4261+ type_object :str
4262+ )-> None :
42564263fields = name .split ('.' )
4257- parent = self
42584264name = fields .pop ()
42594265module ,cls = self .clinic ._module_and_class (fields )
42604266
@@ -4266,7 +4272,7 @@ def directive_class(self, name, typedef, type_object):
42664272parent .classes [name ]= c
42674273self .block .signatures .append (c )
42684274
4269- def directive_set (self ,name ,value ) :
4275+ def directive_set (self ,name : str ,value : str ) -> None :
42704276if name not in ("line_prefix" ,"line_suffix" ):
42714277fail ("unknown variable" ,repr (name ))
42724278
@@ -4277,7 +4283,12 @@ def directive_set(self, name, value):
42774283
42784284self .clinic .__dict__ [name ]= value
42794285
4280- def directive_destination (self ,name ,command ,* args ):
4286+ def directive_destination (
4287+ self ,
4288+ name :str ,
4289+ command :str ,
4290+ * args
4291+ )-> None :
42814292if command == 'new' :
42824293self .clinic .add_destination (name ,* args )
42834294return
@@ -4287,7 +4298,11 @@ def directive_destination(self, name, command, *args):
42874298fail ("unknown destination command" ,repr (command ))
42884299
42894300
4290- def directive_output (self ,command_or_name ,destination = '' ):
4301+ def directive_output (
4302+ self ,
4303+ command_or_name :str ,
4304+ destination :str = ''
4305+ )-> None :
42914306fd = self .clinic .destination_buffers
42924307
42934308if command_or_name == "preset" :
@@ -4325,34 +4340,34 @@ def directive_output(self, command_or_name, destination=''):
43254340fail ("Invalid command / destination name " + repr (command_or_name )+ ", must be one of:\n preset push pop print everything " + " " .join (fd ))
43264341fd [command_or_name ]= d
43274342
4328- def directive_dump (self ,name ) :
4343+ def directive_dump (self ,name : str ) -> None :
43294344self .block .output .append (self .clinic .get_destination (name ).dump ())
43304345
4331- def directive_printout (self ,* args ) :
4346+ def directive_printout (self ,* args : str ) -> None :
43324347self .block .output .append (' ' .join (args ))
43334348self .block .output .append ('\n ' )
43344349
4335- def directive_preserve (self ):
4350+ def directive_preserve (self )-> None :
43364351if self .preserve_output :
43374352fail ("Can't have preserve twice in one block!" )
43384353self .preserve_output = True
43394354
4340- def at_classmethod (self ):
4355+ def at_classmethod (self )-> None :
43414356if self .kind is not CALLABLE :
43424357fail ("Can't set @classmethod, function is not a normal callable" )
43434358self .kind = CLASS_METHOD
43444359
4345- def at_staticmethod (self ):
4360+ def at_staticmethod (self )-> None :
43464361if self .kind is not CALLABLE :
43474362fail ("Can't set @staticmethod, function is not a normal callable" )
43484363self .kind = STATIC_METHOD
43494364
4350- def at_coexist (self ):
4365+ def at_coexist (self )-> None :
43514366if self .coexist :
43524367fail ("Called @coexist twice!" )
43534368self .coexist = True
43544369
4355- def parse (self ,block ) :
4370+ def parse (self ,block : Block ) -> None :
43564371self .reset ()
43574372self .block = block
43584373self .saved_output = self .block .output
@@ -4388,10 +4403,14 @@ def ignore_line(line):
43884403return False
43894404
43904405@staticmethod
4391- def calculate_indent (line ) :
4406+ def calculate_indent (line : str ) -> int :
43924407return len (line )- len (line .strip ())
43934408
4394- def next (self ,state ,line = None ):
4409+ def next (
4410+ self ,
4411+ state :StateKeeper ,
4412+ line :str | None = None
4413+ )-> None :
43954414# real_print(self.state.__name__, "->", state.__name__, ", line=", line)
43964415self .state = state
43974416if line is not None :