This method is intended to become the sole point of appending new
sections to the section list, prohibiting outside callers from
accessing the list of sections directly.

A forthcoming commit will actually convert the "all_sections" field to
be a private field to begin enforcing that no outside callers are
manipulating the section list from outside of this class.

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

diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py
index 5fc9c18c81d..0dca1acba4c 100644
--- a/scripts/qapi/parser.py
+++ b/scripts/qapi/parser.py
@@ -542,7 +542,7 @@ def get_doc(self) -> 'QAPIDoc':
             if not symbol:
                 raise QAPIParseError(self, "name required after '@'")
             doc = QAPIDoc(info, symbol)
-            doc.all_sections.append(QAPIDoc.Section(info, QAPIDoc.Kind.INTRO))
+            doc.new_tagged_section(info, QAPIDoc.Kind.INTRO)
             line = self.get_doc_indented(doc)
             no_more_args = False
             last_ordered_section = QAPIDoc.Kind.INTRO
@@ -772,6 +772,33 @@ def __init__(self, info: QAPISourceInfo, symbol: 
Optional[str] = None):
     def has_features(self) -> bool:
         return bool(self._features)
 
+    def _append(self, section: 'QAPIDoc.Section') -> None:
+        """
+        Primary internal interface for adding a new section.
+
+        It is intended to become the sole access point for adding new
+        sections to the QAPIDoc section list, but we are currently in
+        a transitional phase where other methods access the section
+        list directly to do insertions of generated sections at
+        targeted points.
+        """
+        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
+        self.all_sections.append(section)
+
     def end(self) -> None:
         for section in self.all_sections:
             section.text = section.text.strip('\n')
@@ -797,7 +824,7 @@ def ensure_untagged_section(self, info: QAPISourceInfo) -> 
None:
 
         # start new section
         section = self.Section(info, kind)
-        self.all_sections.append(section)
+        self._append(section)
 
     def new_tagged_section(
         self,
@@ -805,22 +832,7 @@ def new_tagged_section(
         kind: 'QAPIDoc.Kind',
     ) -> None:
         section = self.Section(info, kind)
-        if kind == QAPIDoc.Kind.RETURNS:
-            if self._returns:
-                raise QAPISemError(
-                    info, "duplicated '%s' section" % kind)
-            self._returns = section
-        elif kind == QAPIDoc.Kind.ERRORS:
-            if self._errors:
-                raise QAPISemError(
-                    info, "duplicated '%s' section" % kind)
-            self._errors = section
-        elif kind == QAPIDoc.Kind.SINCE:
-            if self.since:
-                raise QAPISemError(
-                    info, "duplicated '%s' section" % kind)
-            self.since = section
-        self.all_sections.append(section)
+        self._append(section)
 
     def _new_description(
         self,
@@ -834,7 +846,7 @@ def _new_description(
         if name in desc:
             raise QAPISemError(info, "'%s' parameter name duplicated" % name)
         section = self.ArgSection(info, kind, name)
-        self.all_sections.append(section)
+        self._append(section)
         desc[name] = section
 
     def new_argument(self, info: QAPISourceInfo, name: str) -> None:
-- 
2.55.0


Reply via email to