From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Linux Doc Mailing List <linux-doc@vger.kernel.org>,
Jonathan Corbet <corbet@lwn.net>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
Kees Cook <mchehab+huawei@kernel.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH 18/24] docs: kernel_include.py: append line numbers to better report errors
Date: Thu, 21 Aug 2025 16:21:24 +0200 [thread overview]
Message-ID: <4e6309dbd113648a481c1bbe364bfe477cc3f598.1755784930.git.mchehab+huawei@kernel.org> (raw)
In-Reply-To: <cover.1755784929.git.mchehab+huawei@kernel.org>
It is best to point to the original line of code that generated
an error than to point to the beginning of a directive.
Add support for it. It should be noticed that this won't work
for literal or code blocks, as Sphinx will ignore it, pointing
to the beginning of the directive. Yet, when the output is known
to be in ReST format, like on TOC, this makes the error a lot
more easier to be handled.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
Documentation/sphinx/kernel_include.py | 81 ++++++++++++++------------
1 file changed, 44 insertions(+), 37 deletions(-)
diff --git a/Documentation/sphinx/kernel_include.py b/Documentation/sphinx/kernel_include.py
index 79682408105e..90ed8428f776 100755
--- a/Documentation/sphinx/kernel_include.py
+++ b/Documentation/sphinx/kernel_include.py
@@ -60,6 +60,7 @@ import re
import sys
from docutils import io, nodes, statemachine
+from docutils.statemachine import ViewList
from docutils.utils.error_reporting import SafeString, ErrorString
from docutils.parsers.rst import directives
from docutils.parsers.rst.directives.body import CodeBlock, NumberLines
@@ -112,7 +113,14 @@ class KernelInclude(Include):
except UnicodeError as error:
raise self.severe('Problem with directive:\n%s' % ErrorString(error))
- def read_rawtext_with_xrefs(self, env, path, output_type):
+ def xref_text(self, env, path, tab_width):
+ """
+ Read and add contents from a C file parsed to have cross references.
+
+ There are two types of supported output here:
+ - A C source code with cross-references;
+ - a TOC table containing cross references.
+ """
parser = ParseDataStructs()
parser.parse_file(path)
@@ -127,10 +135,33 @@ class KernelInclude(Include):
if 'warn-broken' in self.options:
env._xref_files.add(path)
- if output_type == "toc":
- return parser.gen_toc()
+ if "toc" in self.options:
+ rawtext = parser.gen_toc()
+ else:
+ rawtext = ".. parsed-literal::\n\n" + parser.gen_output()
+ self.apply_range(rawtext)
- return ".. parsed-literal::\n\n" + parser.gen_output()
+ title = os.path.basename(path)
+
+ include_lines = statemachine.string2lines(rawtext, tab_width,
+ convert_whitespace=True)
+
+ # Append line numbers data
+
+ startline = self.options.get('start-line', None)
+
+ result = ViewList()
+ if startline and startline > 0:
+ offset = startline - 1
+ else:
+ offset = 0
+
+ for ln, line in enumerate(include_lines, start=offset):
+ result.append(line, path, ln)
+
+ self.state_machine.insert_input(result, path)
+
+ return []
def apply_range(self, rawtext):
# Get to-be-included content
@@ -195,9 +226,12 @@ class KernelInclude(Include):
literal_block += nodes.Text(text, text)
return [literal_block]
- def code(self, path, include_lines):
+ def code(self, path, tab_width):
"""Output a code block"""
+ include_lines = statemachine.string2lines(rawtext, tab_width,
+ convert_whitespace=True)
+
self.options["source"] = path
codeblock = CodeBlock(self.name,
[self.options.pop("code")], # arguments
@@ -244,47 +278,20 @@ class KernelInclude(Include):
encoding = self.options.get("encoding",
self.state.document.settings.input_encoding)
- e_handler = self.state.document.settings.input_encoding_error_handler
tab_width = self.options.get("tab-width",
self.state.document.settings.tab_width)
- if "literal" in self.options:
- output_type = "literal"
- elif "code" in self.options:
- output_type = "code"
- else:
- output_type = "rst"
-
# Get optional arguments to related to cross-references generation
if "generate-cross-refs" in self.options:
- if "toc" in self.options:
- output_type = "toc"
-
- rawtext = self.read_rawtext_with_xrefs(env, path, output_type)
-
- # When :generate-cross-refs: is used, the input is always a C
- # file, so it has to be handled as a parsed-literal
- if output_type == "rst":
- output_type = "literal"
-
- title = os.path.basename(path)
- else:
- rawtext = self.read_rawtext(path, encoding)
+ return self.xref_text(env, path, tab_width)
+ rawtext = self.read_rawtext(path, encoding)
rawtext = self.apply_range(rawtext)
- if output_type == "literal":
- return self.literal(path, tab_width, rawtext)
+ if "code" in self.options:
+ return self.code(path, tab_width, rawtext)
- include_lines = statemachine.string2lines(rawtext, tab_width,
- convert_whitespace=True)
-
- if output_type == "code":
- return self.code(path, include_lines)
-
- self.state_machine.insert_input(include_lines, path)
-
- return []
+ return self.literal(path, tab_width, rawtext)
# ==============================================================================
--
2.50.1
next prev parent reply other threads:[~2025-08-21 14:21 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-21 14:21 [PATCH 00/24] better handle media headers Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 01/24] docs: parse-headers.pl: improve its debug output format Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 02/24] docs: parse-headers.py: convert parse-headers.pl Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 03/24] docs: parse-headers.py: improve --help logic Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 04/24] docs: parse-headers.py: better handle @var arguments Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 05/24] docs: parse-headers.py: simplify the rules for hashes Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 06/24] tools: docs: parse-headers.py: move it from sphinx dir Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 07/24] tools: docs: parse_data_structs.py: add methods to return output Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 08/24] MAINTAINERS: add files from tools/docs to documentation entry Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 09/24] docs: uapi: media: Makefile: use parse-headers.py Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 10/24] docs: kernel_include.py: Update its coding style Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 11/24] docs: kernel_include.py: allow cross-reference generation Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 12/24] docs: kernel_include.py: generate warnings for broken refs Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 13/24] docs: kernel_include.py: move rawtext logic to separate functions Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 14/24] docs: kernel_include.py: move range logic to a separate function Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 15/24] docs: kernel_include.py: remove range restriction for gen docs Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 16/24] docs: kernel_include.py: move code and literal functions Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 17/24] docs: kernel_include.py: add support to generate a TOC table Mauro Carvalho Chehab
2025-08-21 14:21 ` Mauro Carvalho Chehab [this message]
2025-08-21 14:21 ` [PATCH 19/24] docs: kernel_include.py: move apply_range() and add a docstring Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 20/24] docs: kernel_include.py: remove line numbers from parsed-literal Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 21/24] docs: kernel_include.py: remove Include class inheritance Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 22/24] docs: kernel_include.py: document all supported parameters Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 23/24] scripts: sphinx-build-wrapper: get rid of uapi/media Makefile Mauro Carvalho Chehab
2025-08-21 14:21 ` [PATCH 24/24] docs: sphinx: drop parse-headers.pl Mauro Carvalho Chehab
2025-08-25 7:48 ` [PATCH 00/24] better handle media headers Jani Nikula
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=4e6309dbd113648a481c1bbe364bfe477cc3f598.1755784930.git.mchehab+huawei@kernel.org \
--to=mchehab+huawei@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).