mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
The current logic was storing symbols source code on a list, not linked to the actual KdocItem. While this works fine when kernel-doc markups are OK, on places where there is a "/**" without a valid kernel-doc markup, it ends that the 1:1 match between source code and KdocItem doesn't happen, causing problems to generate the YAML output. Fix it by storing the source code directly into the KdocItem structure. This shouldn't affect performance or memory footprint, except when --yaml option is used. While here, add a __repr__() function for KdocItem, as it helps debugging it. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Signed-off-by: Jonathan Corbet <corbet@lwn.net> Message-ID: <77902dafabb5c3250486aa2dc1568d5fafa95c5b.1774256269.git.mchehab+huawei@kernel.org>
99 lines
2.9 KiB
Python
99 lines
2.9 KiB
Python
# SPDX-License-Identifier: GPL-2.0
|
||
#
|
||
# A class that will, eventually, encapsulate all of the parsed data that we
|
||
# then pass into the output modules.
|
||
#
|
||
|
||
"""
|
||
Data class to store a kernel-doc Item.
|
||
"""
|
||
|
||
class KdocItem:
|
||
"""
|
||
A class that will, eventually, encapsulate all of the parsed data that we
|
||
then pass into the output modules.
|
||
"""
|
||
|
||
def __init__(self, name, fname, type, start_line,
|
||
**other_stuff):
|
||
self.name = name
|
||
self.fname = fname
|
||
self.type = type
|
||
self.declaration_start_line = start_line
|
||
self.sections = {}
|
||
self.sections_start_lines = {}
|
||
self.parameterlist = []
|
||
self.parameterdesc_start_lines = {}
|
||
self.parameterdescs = {}
|
||
self.parametertypes = {}
|
||
|
||
self.warnings = []
|
||
|
||
#
|
||
# Just save everything else into our own dict so that the output
|
||
# side can grab it directly as before. As we move things into more
|
||
# structured data, this will, hopefully, fade away.
|
||
#
|
||
known_keys = {
|
||
'declaration_start_line',
|
||
'sections',
|
||
'sections_start_lines',
|
||
'parameterlist',
|
||
'parameterdesc_start_lines',
|
||
'parameterdescs',
|
||
'parametertypes',
|
||
'warnings',
|
||
}
|
||
|
||
self.other_stuff = {}
|
||
for k, v in other_stuff.items():
|
||
if k in known_keys:
|
||
setattr(self, k, v) # real attribute
|
||
else:
|
||
self.other_stuff[k] = v
|
||
|
||
def get(self, key, default = None):
|
||
"""
|
||
Get a value from optional keys.
|
||
"""
|
||
return self.other_stuff.get(key, default)
|
||
|
||
def __getitem__(self, key):
|
||
return self.get(key)
|
||
|
||
def __repr__(self):
|
||
return f"KdocItem({self.name}, {self.fname}, {self.type}, {self.declaration_start_line})"
|
||
|
||
@classmethod
|
||
def from_dict(cls, d):
|
||
"""Create a KdocItem from a plain dict."""
|
||
|
||
cp = d.copy()
|
||
name = cp.pop('name', None)
|
||
fname = cp.pop('fname', None)
|
||
type = cp.pop('type', None)
|
||
start_line = cp.pop('start_line', 1)
|
||
other_stuff = cp.pop('other_stuff', {})
|
||
|
||
# Everything that’s left goes straight to __init__
|
||
return cls(name, fname, type, start_line, **cp, **other_stuff)
|
||
|
||
#
|
||
# Tracking of section and parameter information.
|
||
#
|
||
def set_sections(self, sections, start_lines):
|
||
"""
|
||
Set sections and start lines.
|
||
"""
|
||
self.sections = sections
|
||
self.sections_start_lines = start_lines
|
||
|
||
def set_params(self, names, descs, types, starts):
|
||
"""
|
||
Set parameter list: names, descriptions, types and start lines.
|
||
"""
|
||
self.parameterlist = names
|
||
self.parameterdescs = descs
|
||
self.parametertypes = types
|
||
self.parameterdesc_start_lines = starts
|