Remove dedicated pointers to single sections, instead preferring a
functional getter property that returns the same thing dynamically.

This is being done mainly for the benefit of being able to condense
the _append() function, but I'm not convinced it's worth it. I'm not
convinced it's not not worth it either, though.

Signed-off-by: John Snow <[email protected]>
---
 scripts/qapi/parser.py | 47 +++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py
index 1d8f1d39ab1..d4b5b3e5ab6 100644
--- a/scripts/qapi/parser.py
+++ b/scripts/qapi/parser.py
@@ -773,12 +773,6 @@ def __init__(self, info: QAPISourceInfo, symbol: 
Optional[str] = None):
         self._args: Dict[str, QAPIDoc.ArgSection] = {}
         self._features: Dict[str, QAPIDoc.ArgSection] = {}
 
-        # a command's "Returns" and "Errors" section
-        self._returns: Optional[QAPIDoc.Section] = None
-        self._errors: Optional[QAPIDoc.Section] = None
-        # "Since" section
-        self.since: Optional[QAPIDoc.Section] = None
-
     @property
     def has_features(self) -> bool:
         return bool(self._features)
@@ -790,21 +784,10 @@ def _append(self, section: 'QAPIDoc.Section') -> None:
         All other methods/helpers/etc ultimately use this and only
         this interface for appending a new section.
         """
-        if section.kind == QAPIDoc.Kind.RETURNS:
-            if self._returns:
-                raise QAPISemError(
-                    section.info, "duplicated '%s' section" % section.kind)
-            self._returns = section
-        elif section.kind == QAPIDoc.Kind.ERRORS:
-            if self._errors:
-                raise QAPISemError(
-                    section.info, "duplicated '%s' section" % section.kind)
-            self._errors = section
-        elif section.kind == QAPIDoc.Kind.SINCE:
-            if self.since:
-                raise QAPISemError(
-                    section.info, "duplicated '%s' section" % section.kind)
-            self.since = section
+        if str(section.kind) in ('Intro', 'Returns', 'Errors', 'Since'):
+            if self._sections[section.kind]:
+                raise QAPISemError(section.info,
+                                   "duplicated '%s' section" % section.kind)
         self._sections[section.kind].append(section)
         self._active_section = section
 
@@ -815,6 +798,28 @@ def __iter__(self) -> Iterator['QAPIDoc.Section']:
     def __len__(self) -> int:
         return sum(len(x) for x in self._sections.values())
 
+    def _single_section_property(
+        self,
+        kind: 'QAPIDoc.Kind'
+    ) -> Optional['QAPIDoc.Section']:
+        try:
+            return self._sections[kind][0]
+        except IndexError:
+            pass
+        return None
+
+    @property
+    def _returns(self) -> Optional['QAPIDoc.Section']:
+        return self._single_section_property(QAPIDoc.Kind.RETURNS)
+
+    @property
+    def _errors(self) -> Optional['QAPIDoc.Section']:
+        return self._single_section_property(QAPIDoc.Kind.ERRORS)
+
+    @property
+    def since(self) -> Optional['QAPIDoc.Section']:
+        return self._single_section_property(QAPIDoc.Kind.SINCE)
+
     def end(self) -> None:
         for section in self:
             section.text = section.text.strip('\n')
-- 
2.55.0


Reply via email to