Skip to content

Commit

Permalink
qapi: Memorize since & returns sections
Browse files Browse the repository at this point in the history
This is chiefly to make code that looks up these sections easier to
read.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240227113921.236097-2-armbru@redhat.com>
  • Loading branch information
Markus Armbruster committed Mar 4, 2024
1 parent e1007b6 commit ba7f63f
Showing 1 changed file with 17 additions and 14 deletions.
31 changes: 17 additions & 14 deletions scripts/qapi/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,10 @@ def __init__(self, info: QAPISourceInfo, symbol: Optional[str] = None):
# dicts mapping parameter/feature names to their description
self.args: Dict[str, QAPIDoc.ArgSection] = {}
self.features: Dict[str, QAPIDoc.ArgSection] = {}
# a command's "Returns" section
self.returns: Optional[QAPIDoc.Section] = None
# "Since" section
self.since: Optional[QAPIDoc.Section] = None
# sections other than .body, .args, .features
self.sections: List[QAPIDoc.Section] = []

Expand All @@ -660,14 +664,17 @@ def ensure_untagged_section(self, info: QAPISourceInfo) -> None:
self.all_sections.append(section)

def new_tagged_section(self, info: QAPISourceInfo, tag: str) -> None:
if tag in ('Returns', 'Since'):
for section in self.all_sections:
if isinstance(section, self.ArgSection):
continue
if section.tag == tag:
raise QAPISemError(
info, "duplicated '%s' section" % tag)
section = self.Section(info, tag)
if tag == 'Returns':
if self.returns:
raise QAPISemError(
info, "duplicated '%s' section" % tag)
self.returns = section
elif tag == 'Since':
if self.since:
raise QAPISemError(
info, "duplicated '%s' section" % tag)
self.since = section
self.sections.append(section)
self.all_sections.append(section)

Expand Down Expand Up @@ -708,13 +715,9 @@ def connect_feature(self, feature: 'QAPISchemaFeature') -> None:
self.features[feature.name].connect(feature)

def check_expr(self, expr: QAPIExpression) -> None:
if 'command' not in expr:
sec = next((sec for sec in self.sections
if sec.tag == 'Returns'),
None)
if sec:
raise QAPISemError(sec.info,
"'Returns:' is only valid for commands")
if self.returns and 'command' not in expr:
raise QAPISemError(self.returns.info,
"'Returns:' is only valid for commands")

def check(self) -> None:

Expand Down

0 comments on commit ba7f63f

Please sign in to comment.