kernel-doc: add support to handle DEFINE_ variables

Improve the parser and output plugin to work with macros,
adding support for the common pattern of using DEFINE_*
to create variables.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Message-ID: <757a45100cfc493984574ff780aa9d90506eecb4.1765894964.git.mchehab+huawei@kernel.org>
master
Mauro Carvalho Chehab 2025-12-16 15:26:13 +01:00 committed by Jonathan Corbet
parent 1045ec382c
commit bdd1cf8784
2 changed files with 23 additions and 7 deletions

View File

@ -486,7 +486,7 @@ class RestFormat(OutputFormat):
self.lineprefix = " "
self.data += f"\n\n.. c:macro:: {name}\n\n{self.lineprefix}{full_proto}\n\n"
self.data += f"\n\n.. c:macro:: {name}\n\n{self.lineprefix}``{full_proto}``\n\n"
self.print_lineno(ln)
self.output_highlight(args.get('purpose', ''))
@ -801,13 +801,12 @@ class ManFormat(OutputFormat):
def out_var(self, fname, name, args):
out_name = self.arg_name(args, name)
prototype = args.other_stuff["var_type"]
full_proto = args.other_stuff["full_proto"]
self.data += f'.TH "{self.modulename}" 9 "{out_name}" "{self.man_date}" "API Manual" LINUX' + "\n"
self.data += ".SH NAME\n"
self.data += f"{prototype} \\- {args['purpose']}\n"
self.data += f"{name} \\- {args['purpose']}\n"
self.data += ".SH SYNOPSIS\n"
self.data += f"{full_proto}\n"

View File

@ -949,12 +949,27 @@ class KernelDoc:
# Store the full prototype before modifying it
#
full_proto = proto
declaration_name = None
#
# Handle macro definitions
#
macro_prefixes = [
KernRe(r"DEFINE_[\w_]+\s*\(([\w_]+)\)"),
]
for r in macro_prefixes:
match = r.search(proto)
if match:
declaration_name = match.group(1)
break
#
# Drop comments and macros to have a pure C prototype
#
for search, sub in sub_prefixes:
proto = search.sub(sub, proto)
if not declaration_name:
for r, sub in sub_prefixes:
proto = r.sub(sub, proto)
proto = proto.rstrip()
@ -968,14 +983,16 @@ class KernelDoc:
return
var_type = r.group(0)
declaration_name = r.group(1)
if not declaration_name:
declaration_name = r.group(1)
default_val = r.group(2)
if default_val:
default_val = default_val.lstrip("=").strip()
self.output_declaration("var", declaration_name,
full_proto=full_proto,
var_type=var_type,
default_val=default_val,
purpose=self.entry.declaration_purpose)