When iterating all_sections, this is helpful to be able to distinguish "members" from "features"; the only other way to do so is to cross-reference these sections against QAPIDoc.args or QAPIDoc.features, but if the desired end goal for QAPIDoc is to remove everything except all_sections, we need *something* accessible to distinguish them.
To keep types simple, add this semantic parameter to the base Section and not just ArgSection; we can use this to filter out paragraphs and tagged sections, too. Signed-off-by: John Snow <js...@redhat.com> --- scripts/qapi/parser.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py index 161768b8b96..cf4cbca1c1f 100644 --- a/scripts/qapi/parser.py +++ b/scripts/qapi/parser.py @@ -613,21 +613,27 @@ class QAPIDoc: class Section: # pylint: disable=too-few-public-methods - def __init__(self, info: QAPISourceInfo, - tag: Optional[str] = None): + def __init__( + self, + info: QAPISourceInfo, + tag: Optional[str] = None, + kind: str = 'paragraph', + ): # section source info, i.e. where it begins self.info = info # section tag, if any ('Returns', '@name', ...) self.tag = tag # section text without tag self.text = '' + # section type - {paragraph, feature, member, tagged} + self.kind = kind def append_line(self, line: str) -> None: self.text += line + '\n' class ArgSection(Section): - def __init__(self, info: QAPISourceInfo, tag: str): - super().__init__(info, tag) + def __init__(self, info: QAPISourceInfo, tag: str, kind: str): + super().__init__(info, tag, kind) self.member: Optional['QAPISchemaMember'] = None def connect(self, member: 'QAPISchemaMember') -> None: @@ -676,7 +682,7 @@ def ensure_untagged_section(self, info: QAPISourceInfo) -> None: self.all_sections.append(section) def new_tagged_section(self, info: QAPISourceInfo, tag: str) -> None: - section = self.Section(info, tag) + section = self.Section(info, tag, "tagged") if tag == 'Returns': if self.returns: raise QAPISemError( @@ -696,20 +702,21 @@ def new_tagged_section(self, info: QAPISourceInfo, tag: str) -> None: self.all_sections.append(section) def _new_description(self, info: QAPISourceInfo, name: str, + kind: str, desc: Dict[str, ArgSection]) -> None: if not name: raise QAPISemError(info, "invalid parameter name") if name in desc: raise QAPISemError(info, "'%s' parameter name duplicated" % name) - section = self.ArgSection(info, '@' + name) + section = self.ArgSection(info, '@' + name, kind) self.all_sections.append(section) desc[name] = section def new_argument(self, info: QAPISourceInfo, name: str) -> None: - self._new_description(info, name, self.args) + self._new_description(info, name, 'member', self.args) def new_feature(self, info: QAPISourceInfo, name: str) -> None: - self._new_description(info, name, self.features) + self._new_description(info, name, 'feature', self.features) def append_line(self, line: str) -> None: self.all_sections[-1].append_line(line) @@ -722,7 +729,7 @@ def connect_member(self, member: 'QAPISchemaMember') -> None: "%s '%s' lacks documentation" % (member.role, member.name)) self.args[member.name] = QAPIDoc.ArgSection( - self.info, '@' + member.name) + self.info, '@' + member.name, 'member') self.args[member.name].connect(member) def connect_feature(self, feature: 'QAPISchemaFeature') -> None: -- 2.44.0