@@ -392,6 +392,12 @@ def __init__(self, document: nodes.document, builder: TextBuilder) -> None:
392392 self .sectionlevel = 0
393393 self .lineblocklevel = 0
394394 self .table : Table = None
395+ """Heterogeneous stack.
396+
397+ Used by visit_* and depart_* functions in conjunction with the tree
398+ traversal. Make sure that the pops correspond to the pushes.
399+ """
400+ self .context = []
395401
396402 def add_text (self , text : str ) -> None :
397403 self .states [- 1 ].append ((- 1 , text ))
@@ -592,24 +598,48 @@ def visit_desc_returns(self, node: Element) -> None:
592598 def depart_desc_returns (self , node : Element ) -> None :
593599 pass
594600
595- def visit_desc_parameterlist (self , node : Element ) -> None :
596- self .add_text (node .list_left_delim ) # type: ignore[attr-defined]
601+ def _visit_sig_parameter_list (
602+ self ,
603+ node : Element ,
604+ parameter_group : type [Element ],
605+ sig_open_paren : str ,
606+ sig_close_paren : str ,
607+ ) -> None :
608+ """Visit a signature parameters or type parameters list.
609+
610+ The *parameter_group* value is the type of a child node acting as a required parameter
611+ or as a set of contiguous optional parameters.
612+ """
613+ self .add_text (sig_open_paren )
597614 self .is_first_param = True
598615 self .optional_param_level = 0
599616 self .params_left_at_level = 0
600617 self .param_group_index = 0
601618 # Counts as what we call a parameter group are either a required parameter, or a
602619 # set of contiguous optional ones.
603- self .list_is_required_param = [isinstance (c , addnodes .desc_parameter )
604- for c in node .children ]
620+ self .list_is_required_param = [isinstance (c , parameter_group ) for c in node .children ]
605621 self .required_params_left = sum (self .list_is_required_param )
606622 self .param_separator = ', '
607623 self .multi_line_parameter_list = node .get ('multi_line_parameter_list' , False )
608624 if self .multi_line_parameter_list :
609625 self .param_separator = self .param_separator .rstrip ()
626+ self .context .append (sig_close_paren )
627+
628+ def _depart_sig_parameter_list (self , node : Element ) -> None :
629+ sig_close_paren = self .context .pop ()
630+ self .add_text (sig_close_paren )
631+
632+ def visit_desc_parameterlist (self , node : Element ) -> None :
633+ self ._visit_sig_parameter_list (node , addnodes .desc_parameter , '(' , ')' )
610634
611635 def depart_desc_parameterlist (self , node : Element ) -> None :
612- self .add_text (node .list_right_delim ) # type: ignore[attr-defined]
636+ self ._depart_sig_parameter_list (node )
637+
638+ def visit_desc_tparameterlist (self , node : Element ) -> None :
639+ self ._visit_sig_parameter_list (node , addnodes .desc_tparameter , '[' , ']' )
640+
641+ def depart_desc_tparameterlist (self , node : Element ) -> None :
642+ self ._depart_sig_parameter_list (node )
613643
614644 def visit_desc_parameter (self , node : Element ) -> None :
615645 on_separate_line = self .multi_line_parameter_list
@@ -645,6 +675,9 @@ def visit_desc_parameter(self, node: Element) -> None:
645675 self .param_group_index += 1
646676 raise nodes .SkipNode
647677
678+ def visit_desc_tparameter (self , node : Element ) -> None :
679+ self .visit_desc_parameter (node )
680+
648681 def visit_desc_optional (self , node : Element ) -> None :
649682 self .params_left_at_level = sum ([isinstance (c , addnodes .desc_parameter )
650683 for c in node .children ])
0 commit comments