Skip to content

Commit 7f3a177

Browse files
committed
Enable multiline sig for C and C++
1 parent 48a4aae commit 7f3a177

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

sphinx/domains/c.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -686,9 +686,10 @@ def describe_signature(self, signode: Any, mode: str,
686686

687687

688688
class ASTParameters(ASTBase):
689-
def __init__(self, args: List[ASTFunctionParameter], attrs: ASTAttributeList) -> None:
689+
def __init__(self, args: List[ASTFunctionParameter], attrs: ASTAttributeList, multiline: bool = False) -> None:
690690
self.args = args
691691
self.attrs = attrs
692+
self.multiline = multiline
692693

693694
@property
694695
def function_params(self) -> List[ASTFunctionParameter]:
@@ -712,13 +713,17 @@ def _stringify(self, transform: StringifyTransform) -> str:
712713
def describe_signature(self, signode: TextElement, mode: str,
713714
env: "BuildEnvironment", symbol: "Symbol") -> None:
714715
verify_description_mode(mode)
716+
multiline = self.multiline
715717
# only use the desc_parameterlist for the outer list, not for inner lists
716718
if mode == 'lastIsName':
717-
paramlist = addnodes.desc_parameterlist()
719+
paramlist = addnodes.desc_multiline_parameterlist() if multiline else addnodes.desc_parameterlist()
718720
for arg in self.args:
721+
param_node = addnodes.desc_content() if multiline else paramlist
719722
param = addnodes.desc_parameter('', '', noemph=True)
720723
arg.describe_signature(param, 'param', env, symbol=symbol)
721-
paramlist += param
724+
param_node += param
725+
if multiline:
726+
paramlist += param_node
722727
signode += paramlist
723728
else:
724729
signode += addnodes.desc_sig_punctuation('(', '(')
@@ -2649,7 +2654,7 @@ def _parse_parameters(self, paramMode: str) -> Optional[ASTParameters]:
26492654
'got "%s".' % self.current_char)
26502655

26512656
attrs = self._parse_attribute_list()
2652-
return ASTParameters(args, attrs)
2657+
return ASTParameters(args, attrs, multiline=self.multiline)
26532658

26542659
def _parse_decl_specs_simple(self, outer: str, typed: bool) -> ASTDeclSpecsSimple:
26552660
"""Just parse the simple ones."""
@@ -3126,6 +3131,7 @@ class CObject(ObjectDescription[ASTDeclaration]):
31263131
option_spec: OptionSpec = {
31273132
'noindexentry': directives.flag,
31283133
'nocontentsentry': directives.flag,
3134+
'singlelinesig': directives.flag,
31293135
}
31303136

31313137
def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
@@ -3231,7 +3237,14 @@ def run(self) -> List[Node]:
32313237
def handle_signature(self, sig: str, signode: TextElement) -> ASTDeclaration:
32323238
parentSymbol: Symbol = self.env.temp_data['c:parent_symbol']
32333239

3234-
parser = DefinitionParser(sig, location=signode, config=self.env.config)
3240+
max_len = self.env.config.c_maximum_signature_line_length
3241+
multiline = (
3242+
max_len >= 0
3243+
and 'singlelinesig' not in self.options
3244+
and len(sig) > max_len
3245+
)
3246+
signode['is_multiline'] = multiline
3247+
parser = DefinitionParser(sig, location=signode, config=self.env.config, multiline=multiline)
32353248
try:
32363249
ast = self.parse_definition(parser)
32373250
parser.assert_end()
@@ -3842,6 +3855,7 @@ def setup(app: Sphinx) -> Dict[str, Any]:
38423855
app.add_config_value("c_id_attributes", [], 'env')
38433856
app.add_config_value("c_paren_attributes", [], 'env')
38443857
app.add_config_value("c_extra_keywords", _macroKeywords, 'env')
3858+
app.add_config_value("c_maximum_signature_line_length", -1, 'env')
38453859
app.add_post_transform(AliasTransform)
38463860

38473861
return {

sphinx/domains/cpp.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,7 +2049,7 @@ def __init__(self, args: List[ASTFunctionParameter], volatile: bool, const: bool
20492049
refQual: Optional[str], exceptionSpec: ASTNoexceptSpec,
20502050
trailingReturn: "ASTType",
20512051
override: bool, final: bool, attrs: ASTAttributeList,
2052-
initializer: Optional[str]) -> None:
2052+
initializer: Optional[str], multiline: bool = False) -> None:
20532053
self.args = args
20542054
self.volatile = volatile
20552055
self.const = const
@@ -2060,6 +2060,7 @@ def __init__(self, args: List[ASTFunctionParameter], volatile: bool, const: bool
20602060
self.final = final
20612061
self.attrs = attrs
20622062
self.initializer = initializer
2063+
self.multiline = multiline
20632064

20642065
@property
20652066
def function_params(self) -> List[ASTFunctionParameter]:
@@ -2129,13 +2130,17 @@ def _stringify(self, transform: StringifyTransform) -> str:
21292130
def describe_signature(self, signode: TextElement, mode: str,
21302131
env: "BuildEnvironment", symbol: "Symbol") -> None:
21312132
verify_description_mode(mode)
2133+
multiline = self.multiline
21322134
# only use the desc_parameterlist for the outer list, not for inner lists
21332135
if mode == 'lastIsName':
2134-
paramlist = addnodes.desc_parameterlist()
2136+
paramlist = addnodes.desc_multiline_parameterlist() if multiline else addnodes.desc_parameterlist()
21352137
for arg in self.args:
2138+
param_node = addnodes.desc_content() if multiline else paramlist
21362139
param = addnodes.desc_parameter('', '', noemph=True)
21372140
arg.describe_signature(param, 'param', env, symbol=symbol)
2138-
paramlist += param
2141+
param_node += param
2142+
if multiline:
2143+
paramlist += param_node
21392144
signode += paramlist
21402145
else:
21412146
signode += addnodes.desc_sig_punctuation('(', '(')
@@ -6235,7 +6240,7 @@ def _parse_parameters_and_qualifiers(self, paramMode: str) -> ASTParametersQuali
62356240

62366241
return ASTParametersQualifiers(
62376242
args, volatile, const, refQual, exceptionSpec, trailingReturn,
6238-
override, final, attrs, initializer)
6243+
override, final, attrs, initializer, multiline=self.multiline)
62396244

62406245
def _parse_decl_specs_simple(self, outer: str, typed: bool) -> ASTDeclSpecsSimple:
62416246
"""Just parse the simple ones."""
@@ -7189,6 +7194,7 @@ class CPPObject(ObjectDescription[ASTDeclaration]):
71897194
'noindexentry': directives.flag,
71907195
'nocontentsentry': directives.flag,
71917196
'tparam-line-spec': directives.flag,
7197+
'singlelinesig': directives.flag,
71927198
}
71937199

71947200
def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
@@ -7347,7 +7353,14 @@ def run(self) -> List[Node]:
73477353
def handle_signature(self, sig: str, signode: desc_signature) -> ASTDeclaration:
73487354
parentSymbol: Symbol = self.env.temp_data['cpp:parent_symbol']
73497355

7350-
parser = DefinitionParser(sig, location=signode, config=self.env.config)
7356+
max_len = self.env.config.cpp_maximum_signature_line_length
7357+
multiline = (
7358+
max_len >= 0
7359+
and 'singlelinesig' not in self.options
7360+
and len(sig) > max_len
7361+
)
7362+
signode['is_multiline'] = multiline
7363+
parser = DefinitionParser(sig, location=signode, config=self.env.config, multiline=multiline)
73517364
try:
73527365
ast = self.parse_definition(parser)
73537366
parser.assert_end()
@@ -8139,6 +8152,7 @@ def setup(app: Sphinx) -> Dict[str, Any]:
81398152
app.add_config_value("cpp_index_common_prefix", [], 'env')
81408153
app.add_config_value("cpp_id_attributes", [], 'env')
81418154
app.add_config_value("cpp_paren_attributes", [], 'env')
8155+
app.add_config_value("cpp_maximum_signature_line_length", -1, 'env')
81428156
app.add_post_transform(AliasTransform)
81438157

81448158
# debug stuff

sphinx/util/cfamily.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,11 @@ class DefinitionError(Exception):
235235
class BaseParser:
236236
def __init__(self, definition: str, *,
237237
location: Union[nodes.Node, Tuple[str, int], str],
238-
config: "Config") -> None:
238+
config: "Config", multiline: bool = False) -> None:
239239
self.definition = definition.strip()
240240
self.location = location # for warnings
241241
self.config = config
242+
self.multiline = multiline
242243

243244
self.pos = 0
244245
self.end = len(self.definition)

0 commit comments

Comments
 (0)