Skip to content

Commit d3ec233

Browse files
committed
Enable multiline sig for C and C++
1 parent 581433b commit d3ec233

File tree

3 files changed

+45
-11
lines changed

3 files changed

+45
-11
lines changed

sphinx/domains/c.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -687,9 +687,15 @@ def describe_signature(self, signode: Any, mode: str,
687687

688688

689689
class ASTParameters(ASTBase):
690-
def __init__(self, args: list[ASTFunctionParameter], attrs: ASTAttributeList) -> None:
690+
def __init__(
691+
self,
692+
args: list[ASTFunctionParameter],
693+
attrs: ASTAttributeList,
694+
multiline: bool = False,
695+
) -> None:
691696
self.args = args
692697
self.attrs = attrs
698+
self.multiline = multiline
693699

694700
@property
695701
def function_params(self) -> list[ASTFunctionParameter]:
@@ -713,13 +719,17 @@ def _stringify(self, transform: StringifyTransform) -> str:
713719
def describe_signature(self, signode: TextElement, mode: str,
714720
env: BuildEnvironment, symbol: Symbol) -> None:
715721
verify_description_mode(mode)
722+
multiline = self.multiline
716723
# only use the desc_parameterlist for the outer list, not for inner lists
717724
if mode == 'lastIsName':
718-
paramlist = addnodes.desc_parameterlist()
725+
paramlist = addnodes.desc_multiline_parameterlist() if multiline else addnodes.desc_parameterlist()
719726
for arg in self.args:
727+
param_node = addnodes.desc_content() if multiline else paramlist
720728
param = addnodes.desc_parameter('', '', noemph=True)
721729
arg.describe_signature(param, 'param', env, symbol=symbol)
722-
paramlist += param
730+
param_node += param
731+
if multiline:
732+
paramlist += param_node
723733
signode += paramlist
724734
else:
725735
signode += addnodes.desc_sig_punctuation('(', '(')
@@ -2670,7 +2680,7 @@ def _parse_parameters(self, paramMode: str) -> ASTParameters | None:
26702680
'got "%s".' % self.current_char)
26712681

26722682
attrs = self._parse_attribute_list()
2673-
return ASTParameters(args, attrs)
2683+
return ASTParameters(args, attrs, multiline=self.multiline)
26742684

26752685
def _parse_decl_specs_simple(
26762686
self, outer: str | None, typed: bool
@@ -3149,6 +3159,7 @@ class CObject(ObjectDescription[ASTDeclaration]):
31493159
option_spec: OptionSpec = {
31503160
'noindexentry': directives.flag,
31513161
'nocontentsentry': directives.flag,
3162+
'singlelinesig': directives.flag,
31523163
}
31533164

31543165
def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
@@ -3254,7 +3265,14 @@ def run(self) -> list[Node]:
32543265
def handle_signature(self, sig: str, signode: TextElement) -> ASTDeclaration:
32553266
parentSymbol: Symbol = self.env.temp_data['c:parent_symbol']
32563267

3257-
parser = DefinitionParser(sig, location=signode, config=self.env.config)
3268+
max_len = self.env.config.c_maximum_signature_line_length
3269+
multiline = (
3270+
max_len >= 0
3271+
and 'singlelinesig' not in self.options
3272+
and len(sig) > max_len
3273+
)
3274+
signode['is_multiline'] = multiline
3275+
parser = DefinitionParser(sig, location=signode, config=self.env.config, multiline=multiline)
32583276
try:
32593277
ast = self.parse_definition(parser)
32603278
parser.assert_end()
@@ -3870,6 +3888,7 @@ def setup(app: Sphinx) -> dict[str, Any]:
38703888
app.add_config_value("c_id_attributes", [], 'env')
38713889
app.add_config_value("c_paren_attributes", [], 'env')
38723890
app.add_config_value("c_extra_keywords", _macroKeywords, 'env')
3891+
app.add_config_value("c_maximum_signature_line_length", -1, 'env')
38733892
app.add_post_transform(AliasTransform)
38743893

38753894
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: str | None, exceptionSpec: ASTNoexceptSpec,
20502050
trailingReturn: ASTType,
20512051
override: bool, final: bool, attrs: ASTAttributeList,
2052-
initializer: str | None) -> None:
2052+
initializer: str | None, 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('(', '(')
@@ -6240,7 +6245,7 @@ def _parse_parameters_and_qualifiers(self, paramMode: str) -> ASTParametersQuali
62406245

62416246
return ASTParametersQualifiers(
62426247
args, volatile, const, refQual, exceptionSpec, trailingReturn,
6243-
override, final, attrs, initializer)
6248+
override, final, attrs, initializer, multiline=self.multiline)
62446249

62456250
def _parse_decl_specs_simple(self, outer: str, typed: bool) -> ASTDeclSpecsSimple:
62466251
"""Just parse the simple ones."""
@@ -7194,6 +7199,7 @@ class CPPObject(ObjectDescription[ASTDeclaration]):
71947199
'noindexentry': directives.flag,
71957200
'nocontentsentry': directives.flag,
71967201
'tparam-line-spec': directives.flag,
7202+
'singlelinesig': directives.flag,
71977203
}
71987204

71997205
def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
@@ -7350,7 +7356,14 @@ def run(self) -> list[Node]:
73507356
def handle_signature(self, sig: str, signode: desc_signature) -> ASTDeclaration:
73517357
parentSymbol: Symbol = self.env.temp_data['cpp:parent_symbol']
73527358

7353-
parser = DefinitionParser(sig, location=signode, config=self.env.config)
7359+
max_len = self.env.config.cpp_maximum_signature_line_length
7360+
multiline = (
7361+
max_len >= 0
7362+
and 'singlelinesig' not in self.options
7363+
and len(sig) > max_len
7364+
)
7365+
signode['is_multiline'] = multiline
7366+
parser = DefinitionParser(sig, location=signode, config=self.env.config, multiline=multiline)
73547367
try:
73557368
ast = self.parse_definition(parser)
73567369
parser.assert_end()
@@ -8142,6 +8155,7 @@ def setup(app: Sphinx) -> dict[str, Any]:
81428155
app.add_config_value("cpp_index_common_prefix", [], 'env')
81438156
app.add_config_value("cpp_id_attributes", [], 'env')
81448157
app.add_config_value("cpp_paren_attributes", [], 'env')
8158+
app.add_config_value("cpp_maximum_signature_line_length", -1, 'env')
81458159
app.add_post_transform(AliasTransform)
81468160

81478161
# debug stuff

sphinx/util/cfamily.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,11 @@ class DefinitionError(Exception):
237237
class BaseParser:
238238
def __init__(self, definition: str, *,
239239
location: nodes.Node | tuple[str, int] | str,
240-
config: Config) -> None:
240+
config: Config, multiline: bool = False) -> None:
241241
self.definition = definition.strip()
242242
self.location = location # for warnings
243243
self.config = config
244+
self.multiline = multiline
244245

245246
self.pos = 0
246247
self.end = len(self.definition)

0 commit comments

Comments
 (0)