From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Jonathan Corbet <corbet@lwn.net>, Kees Cook <kees@kernel.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
linux-doc@vger.kernel.org, linux-hardening@vger.kernel.org,
linux-kernel@vger.kernel.org,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
Aleksandr Loktionov <aleksandr.loktionov@intel.com>,
Randy Dunlap <rdunlap@infradead.org>,
Shuah Khan <skhan@linuxfoundation.org>,
Vincent Mailhol <mailhol@kernel.org>
Subject: [PATCH v3 00/22] kernel-doc: use a C lexical tokenizer for transforms
Date: Tue, 17 Mar 2026 19:09:20 +0100 [thread overview]
Message-ID: <cover.1773770483.git.mchehab+huawei@kernel.org> (raw)
Hi Jon,
It follows v3 of the series. I basically addressed there the
points you mentioned. Besides that, I did a fix at CMatch
group(0) logic, and opted to create a special token for ";",
as it simplifies the code a little bit and will likely help to
simplify future changes.
-
This patch series change how kdoc parser handles macro replacements.
Instead of heavily relying on regular expressions that can sometimes
be very complex, it uses a C lexical tokenizer. This ensures that
BEGIN/END blocks on functions and structs are properly handled,
even when nested.
Checking before/after the patch series, for both man pages and
rst only had:
- whitespace differences;
- struct_group macros now are shown as inner anonimous structs
as it should be.
Also, I didn't notice any relevant change on the documentation build
time. With that regards, right now, every time a CMatch replacement
rule takes in place, it does:
for each transform:
- tokenizes the source code;
- handle CMatch;
- convert tokens back to a string.
A possible optimization would be to do, instead:
- tokenizes source code;
- for each transform handle CMatch;
- convert tokens back to a string.
For now, I opted not do do it, because:
- too much changes on a single row;
- docs build time is taking ~3:30 minutes, which is
about the same time it ws taken before the changes;
- there is a very dirty hack inside function_xforms:
(KernRe(r"_noprof"), ""). This is meant to change
function prototypes instead of function arguments.
So, if ok for you, I would prefer to merge this one first. We can later
optimize kdoc_parser to avoid multiple token <-> string conversions.
-
One important aspect of this series is that it introduces unittests
for kernel-doc. I used it a lot during the development of this series,
to ensure that the changes I was doing were producing the expected
results. Tests are on two separate files that can be executed directly.
Alternatively, there is a run.py script that runs all of them (and
any other python script named tools/unittests/test_*.py"):
$ tools/unittests/run.py
test_cmatch:
TestSearch:
test_search_acquires_multiple: OK
test_search_acquires_nested_paren: OK
test_search_acquires_simple: OK
test_search_must_hold: OK
test_search_must_hold_shared: OK
test_search_no_false_positive: OK
test_search_no_function: OK
test_search_no_macro_remains: OK
TestSubMultipleMacros:
test_acquires_multiple: OK
test_acquires_nested_paren: OK
test_acquires_simple: OK
test_mixed_macros: OK
test_must_hold: OK
test_must_hold_shared: OK
test_no_false_positive: OK
test_no_function: OK
test_no_macro_remains: OK
TestSubSimple:
test_rise_early_greedy: OK
test_rise_multiple_greedy: OK
test_strip_multiple_acquires: OK
test_sub_count_parameter: OK
test_sub_mixed_placeholders: OK
test_sub_multiple_placeholders: OK
test_sub_no_placeholder: OK
test_sub_single_placeholder: OK
test_sub_with_capture: OK
test_sub_zero_placeholder: OK
TestSubWithLocalXforms:
test_functions_with_acquires_and_releases: OK
test_raw_struct_group: OK
test_raw_struct_group_tagged: OK
test_struct_group: OK
test_struct_group_attr: OK
test_struct_group_tagged_with_private: OK
test_struct_kcov: OK
test_vars_stackdepot: OK
test_tokenizer:
TestPublicPrivate:
test_balanced_inner_private: OK
test_balanced_non_greddy_private: OK
test_balanced_private: OK
test_no private: OK
test_unbalanced_inner_private: OK
test_unbalanced_private: OK
test_unbalanced_struct_group_tagged_with_private: OK
test_unbalanced_two_struct_group_tagged_first_with_private: OK
test_unbalanced_without_end_of_line: OK
TestTokenizer:
test_basic_tokens: OK
test_depth_counters: OK
test_mismatch_error: OK
Ran 47 tests
---
v3:
- Avoided code addition/removal by applying the changes directly
at the new kdoc/c_lex.py file;
- ";" has now its own token (ENDSTMT). That simplifies the code
a little bit and will help further improvements;
- renamed TOKEN_LIST to RE_SCANNER_LIST;
- simplified regular expressions where possible;
- added some comments for some weird stuff like \s\S regex;
- CTokenizer __init__() method moved to the beginning of the class;
- fixed a logic parsing CToken.BEGIN when picking group(0);
- fixed two typos.
v2:
- Added 8 more patches fixing several bugs and modifying unittests
accordingly:
- don't raise exceptions when not needed;
- don't report errors reporting lack of END if there's no BEGIN
at the last replacement string;
- document private scope propagation;
- some changes at unittests to reflect current status;
- addition of two unittests to check error raise logic at c_lex.
Mauro Carvalho Chehab (22):
docs: python: add helpers to run unit tests
unittests: add a testbench to check public/private kdoc comments
docs: kdoc: don't add broken comments inside prototypes
docs: kdoc: properly handle empty enum arguments
docs: add a C tokenizer to be used by kernel-doc
docs: kdoc: use tokenizer to handle comments on structs
unittests: test_private: modify it to use CTokenizer directly
unittests: test_tokenizer: check if the tokenizer works
unittests: add a runner to execute all unittests
docs: kdoc: create a CMatch to match nested C blocks
tools: unittests: add tests for CMatch
docs: c_lex: properly implement a sub() method for CMatch
unittests: test_cmatch: add tests for sub()
docs: kdoc: replace NestedMatch with CMatch
docs: kdoc_re: get rid of NestedMatch class
docs: xforms_lists: handle struct_group directly
docs: xforms_lists: better evaluate struct_group macros
docs: c_lex: setup a logger to report tokenizer issues
docs: kernel-doc.rst: document private: scope propagation
docs: kdoc: ensure that comments are dropped before calling
split_struct_proto()
docs: kdoc_parser: avoid tokenizing structs everytime
docs: xforms_lists: use CMatch for all identifiers
Documentation/doc-guide/kernel-doc.rst | 6 +
Documentation/tools/python.rst | 2 +
Documentation/tools/unittest.rst | 24 +
tools/lib/python/kdoc/c_lex.py | 655 ++++++++++++++++++++
tools/lib/python/kdoc/kdoc_parser.py | 35 +-
tools/lib/python/kdoc/kdoc_re.py | 201 ------
tools/lib/python/kdoc/xforms_lists.py | 237 ++++---
tools/lib/python/unittest_helper.py | 353 +++++++++++
tools/unittests/run.py | 17 +
tools/unittests/test_cmatch.py | 821 +++++++++++++++++++++++++
tools/unittests/test_tokenizer.py | 462 ++++++++++++++
11 files changed, 2470 insertions(+), 343 deletions(-)
create mode 100644 Documentation/tools/unittest.rst
create mode 100644 tools/lib/python/kdoc/c_lex.py
create mode 100755 tools/lib/python/unittest_helper.py
create mode 100755 tools/unittests/run.py
create mode 100755 tools/unittests/test_cmatch.py
create mode 100755 tools/unittests/test_tokenizer.py
--
2.52.0
next reply other threads:[~2026-03-17 18:09 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-17 18:09 Mauro Carvalho Chehab [this message]
2026-03-17 18:09 ` [PATCH v3 01/22] docs: python: add helpers to run unit tests Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 02/22] unittests: add a testbench to check public/private kdoc comments Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 03/22] docs: kdoc: don't add broken comments inside prototypes Mauro Carvalho Chehab
2026-03-18 7:47 ` Loktionov, Aleksandr
2026-03-17 18:09 ` [PATCH v3 04/22] docs: kdoc: properly handle empty enum arguments Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 05/22] docs: add a C tokenizer to be used by kernel-doc Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 06/22] docs: kdoc: use tokenizer to handle comments on structs Mauro Carvalho Chehab
2026-03-18 7:48 ` Loktionov, Aleksandr
2026-03-17 18:09 ` [PATCH v3 07/22] unittests: test_private: modify it to use CTokenizer directly Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 08/22] unittests: test_tokenizer: check if the tokenizer works Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 09/22] unittests: add a runner to execute all unittests Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 10/22] docs: kdoc: create a CMatch to match nested C blocks Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 11/22] tools: unittests: add tests for CMatch Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 12/22] docs: c_lex: properly implement a sub() method " Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 13/22] unittests: test_cmatch: add tests for sub() Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 14/22] docs: kdoc: replace NestedMatch with CMatch Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 15/22] docs: kdoc_re: get rid of NestedMatch class Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 16/22] docs: xforms_lists: handle struct_group directly Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 17/22] docs: xforms_lists: better evaluate struct_group macros Mauro Carvalho Chehab
2026-03-18 7:44 ` Loktionov, Aleksandr
2026-03-17 18:09 ` [PATCH v3 18/22] docs: c_lex: setup a logger to report tokenizer issues Mauro Carvalho Chehab
2026-03-18 7:45 ` Loktionov, Aleksandr
2026-03-17 18:09 ` [PATCH v3 19/22] docs: kernel-doc.rst: document private: scope propagation Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 20/22] docs: kdoc: ensure that comments are dropped before calling split_struct_proto() Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 21/22] docs: kdoc_parser: avoid tokenizing structs everytime Mauro Carvalho Chehab
2026-03-17 18:09 ` [PATCH v3 22/22] docs: xforms_lists: use CMatch for all identifiers Mauro Carvalho Chehab
2026-03-22 21:08 ` [PATCH v3 00/22] kernel-doc: use a C lexical tokenizer for transforms Jonathan Corbet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1773770483.git.mchehab+huawei@kernel.org \
--to=mchehab+huawei@kernel.org \
--cc=aleksandr.loktionov@intel.com \
--cc=corbet@lwn.net \
--cc=gustavoars@kernel.org \
--cc=kees@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mailhol@kernel.org \
--cc=mchehab@kernel.org \
--cc=rdunlap@infradead.org \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.