@@ -148,17 +148,26 @@ def visit_desc_returns(self, node: Element) -> None:
148148 def depart_desc_returns (self , node : Element ) -> None :
149149 self .body .append ('</span></span>' )
150150
151- def visit_desc_parameterlist (self , node : Element ) -> None :
152- list_left_delim = node .list_left_delim # type: ignore[attr-defined]
153- self .body .append (f'<span class="sig-paren">{ list_left_delim } </span>' )
151+ def _visit_sig_parameter_list (
152+ self ,
153+ node : Element ,
154+ parameter_group : type [Element ],
155+ sig_open_paren : str ,
156+ sig_close_paren : str ,
157+ ) -> None :
158+ """Visit a signature parameters or type parameters list.
159+
160+ The *parameter_group* value is the type of a child node acting as a required parameter
161+ or as a set of contiguous optional parameters.
162+ """
163+ self .body .append (f'<span class="sig-paren">{ sig_open_paren } </span>' )
154164 self .is_first_param = True
155165 self .optional_param_level = 0
156166 self .params_left_at_level = 0
157167 self .param_group_index = 0
158168 # Counts as what we call a parameter group either a required parameter, or a
159169 # set of contiguous optional ones.
160- self .list_is_required_param = [isinstance (c , addnodes .desc_parameter )
161- for c in node .children ]
170+ self .list_is_required_param = [isinstance (c , parameter_group ) for c in node .children ]
162171 # How many required parameters are left.
163172 self .required_params_left = sum (self .list_is_required_param )
164173 self .param_separator = node .child_text_separator
@@ -167,12 +176,25 @@ def visit_desc_parameterlist(self, node: Element) -> None:
167176 self .body .append ('\n \n ' )
168177 self .body .append (self .starttag (node , 'dl' ))
169178 self .param_separator = self .param_separator .rstrip ()
179+ self .context .append (sig_close_paren )
170180
171- def depart_desc_parameterlist (self , node : Element ) -> None :
181+ def _depart_sig_parameter_list (self , node : Element ) -> None :
172182 if node .get ('multi_line_parameter_list' ):
173183 self .body .append ('</dl>\n \n ' )
174- list_right_delim = node .list_right_delim # type: ignore[attr-defined]
175- self .body .append (f'<span class="sig-paren">{ list_right_delim } </span>' )
184+ sig_close_paren = self .context .pop ()
185+ self .body .append (f'<span class="sig-paren">{ sig_close_paren } </span>' )
186+
187+ def visit_desc_parameterlist (self , node : Element ) -> None :
188+ self ._visit_sig_parameter_list (node , addnodes .desc_parameter , '(' , ')' )
189+
190+ def depart_desc_parameterlist (self , node : Element ) -> None :
191+ self ._depart_sig_parameter_list (node )
192+
193+ def visit_desc_tparameterlist (self , node : Element ) -> None :
194+ self ._visit_sig_parameter_list (node , addnodes .desc_tparameter , '[' , ']' )
195+
196+ def depart_desc_tparameterlist (self , node : Element ) -> None :
197+ self ._depart_sig_parameter_list (node )
176198
177199 # If required parameters are still to come, then put the comma after
178200 # the parameter. Otherwise, put the comma before. This ensures that
@@ -216,6 +238,12 @@ def depart_desc_parameter(self, node: Element) -> None:
216238 if is_required :
217239 self .param_group_index += 1
218240
241+ def visit_desc_tparameter (self , node : Element ) -> None :
242+ self .visit_desc_parameter (node )
243+
244+ def depart_desc_tparameter (self , node : Element ) -> None :
245+ self .depart_desc_parameter (node )
246+
219247 def visit_desc_optional (self , node : Element ) -> None :
220248 self .params_left_at_level = sum ([isinstance (c , addnodes .desc_parameter )
221249 for c in node .children ])
0 commit comments