Skip to content

Commit a843d7c

Browse files
committed
implement visitor methods for type parameters
1 parent 4eaa0ed commit a843d7c

File tree

3 files changed

+65
-9
lines changed

3 files changed

+65
-9
lines changed

sphinx/writers/manpage.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,18 @@ def depart_desc_returns(self, node: Element) -> None:
184184
pass
185185

186186
def visit_desc_parameterlist(self, node: Element) -> None:
187-
self.body.append(node.list_left_delim) # type: ignore[attr-defined]
187+
self.body.append('(')
188188
self.first_param = 1
189189

190190
def depart_desc_parameterlist(self, node: Element) -> None:
191-
self.body.append(node.list_right_delim) # type: ignore[attr-defined]
191+
self.body.append(')')
192+
193+
def visit_desc_tparameterlist(self, node: Element) -> None:
194+
self.body.append('[')
195+
self.first_param = 1
196+
197+
def depart_desc_tparameterlist(self, node: Element) -> None:
198+
self.body.append(']')
192199

193200
def visit_desc_parameter(self, node: Element) -> None:
194201
if not self.first_param:
@@ -199,6 +206,12 @@ def visit_desc_parameter(self, node: Element) -> None:
199206
def depart_desc_parameter(self, node: Element) -> None:
200207
pass
201208

209+
def visit_desc_tparameter(self, node: Element) -> None:
210+
self.visit_desc_parameter(node)
211+
212+
def depart_desc_tparameter(self, node: Element) -> None:
213+
self.depart_desc_parameter(node)
214+
202215
def visit_desc_optional(self, node: Element) -> None:
203216
self.body.append('[')
204217

sphinx/writers/texinfo.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,11 +1462,18 @@ def depart_desc_returns(self, node: Element) -> None:
14621462
pass
14631463

14641464
def visit_desc_parameterlist(self, node: Element) -> None:
1465-
self.body.append(f' {node.list_left_delim}') # type: ignore[attr-defined]
1465+
self.body.append(' (')
14661466
self.first_param = 1
14671467

14681468
def depart_desc_parameterlist(self, node: Element) -> None:
1469-
self.body.append(node.list_right_delim) # type: ignore[attr-defined]
1469+
self.body.append(')')
1470+
1471+
def visit_desc_tparameterlist(self, node: Element) -> None:
1472+
self.body.append(' [')
1473+
self.first_param = 1
1474+
1475+
def depart_desc_tparameterlist(self, node: Element) -> None:
1476+
self.body.append(']')
14701477

14711478
def visit_desc_parameter(self, node: Element) -> None:
14721479
if not self.first_param:
@@ -1479,6 +1486,9 @@ def visit_desc_parameter(self, node: Element) -> None:
14791486
self.body.append(text)
14801487
raise nodes.SkipNode
14811488

1489+
def visit_desc_tparameter(self, node: Element) -> None:
1490+
self.visit_desc_parameter(node)
1491+
14821492
def visit_desc_optional(self, node: Element) -> None:
14831493
self.body.append('[')
14841494

sphinx/writers/text.py

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)