domains: c: add support for named variadic argument

Add support for gcc extensions which allow variadic arguments to be
named: https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

A named variadic argument takes the form "<name>..." with spaces around
allowed and must be the last argument.

Currently it generates a warning "Invalid C declaration: Expected
identifier, ')', or ',' in macro parameter list."

Signed-off-by: Fabio Utzig <fabio.utzig@nordicsemi.no>
This commit is contained in:
Fabio Utzig 2020-07-23 12:27:16 -03:00
parent d8064a8b8f
commit 15d93d2c76

View File

@ -1200,13 +1200,17 @@ class ASTTypeWithInit(ASTBase):
class ASTMacroParameter(ASTBase): class ASTMacroParameter(ASTBase):
def __init__(self, arg: ASTNestedName, ellipsis: bool = False) -> None: def __init__(self, arg: ASTNestedName, ellipsis: bool = False,
variadic: bool = False) -> None:
self.arg = arg self.arg = arg
self.ellipsis = ellipsis self.ellipsis = ellipsis
self.variadic = variadic
def _stringify(self, transform: StringifyTransform) -> str: def _stringify(self, transform: StringifyTransform) -> str:
if self.ellipsis: if self.ellipsis:
return '...' return '...'
elif self.variadic:
return transform(self.arg) + '...'
else: else:
return transform(self.arg) return transform(self.arg)
@ -1215,6 +1219,9 @@ class ASTMacroParameter(ASTBase):
verify_description_mode(mode) verify_description_mode(mode)
if self.ellipsis: if self.ellipsis:
signode += nodes.Text('...') signode += nodes.Text('...')
elif self.variadic:
name = str(self)
signode += nodes.emphasis(name, name)
else: else:
self.arg.describe_signature(signode, mode, env, symbol=symbol) self.arg.describe_signature(signode, mode, env, symbol=symbol)
@ -2915,9 +2922,14 @@ class DefinitionParser(BaseParser):
if not self.match(identifier_re): if not self.match(identifier_re):
self.fail("Expected identifier in macro parameters.") self.fail("Expected identifier in macro parameters.")
nn = ASTNestedName([ASTIdentifier(self.matched_text)], rooted=False) nn = ASTNestedName([ASTIdentifier(self.matched_text)], rooted=False)
arg = ASTMacroParameter(nn)
args.append(arg)
self.skip_ws() self.skip_ws()
if self.skip_string_and_ws('...'):
args.append(ASTMacroParameter(nn, False, True))
self.skip_ws()
if not self.skip_string(')'):
self.fail('Expected ")" after "..." in macro parameters.')
break
args.append(ASTMacroParameter(nn))
if self.skip_string_and_ws(','): if self.skip_string_and_ws(','):
continue continue
elif self.skip_string_and_ws(')'): elif self.skip_string_and_ws(')'):