All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: michael.roth@amd.com, peter.maydell@linaro.org,
	pbonzini@redhat.com, marcandre.lureau@redhat.com,
	berrange@redhat.com, thuth@redhat.com, philmd@linaro.org,
	mst@redhat.com, imammedo@redhat.com, anisinha@redhat.com,
	eblake@redhat.com, kraxel@redhat.com, kwolf@redhat.com,
	hreitz@redhat.com, arei.gonglei@huawei.com,
	pizhenwei@bytedance.com, jsnow@redhat.com,
	vsementsov@yandex-team.ru, eduardo@habkost.net,
	marcel.apfelbaum@gmail.com, wangyanan55@huawei.com,
	quintela@redhat.com, peterx@redhat.com, leobras@redhat.com,
	jasowang@redhat.com, yuval.shaia.ml@gmail.com,
	pavel.dovgaluk@ispras.ru, jiri@resnulli.us,
	stefanb@linux.vnet.ibm.com, stefanha@redhat.com,
	lukasstraub2@web.de, kkostiuk@redhat.com, qemu-block@nongnu.org,
	victortoso@redhat.com
Subject: [PATCH 12/17] qapi: Rewrite parsing of doc comment section symbols and tags
Date: Fri, 28 Apr 2023 12:54:24 +0200	[thread overview]
Message-ID: <20230428105429.1687850-13-armbru@redhat.com> (raw)
In-Reply-To: <20230428105429.1687850-1-armbru@redhat.com>

To recognize a line starting with a section symbol and or tag, we
first split it at the first space, then examine the part left of the
space.  We can just as well examine the unsplit line, so do that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi/parser.py | 51 +++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 28 deletions(-)

diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py
index ddc14ceaba..fc04c4573e 100644
--- a/scripts/qapi/parser.py
+++ b/scripts/qapi/parser.py
@@ -560,12 +560,12 @@ def end_comment(self) -> None:
         self._switch_section(QAPIDoc.NullSection(self._parser))
 
     @staticmethod
-    def _is_section_tag(name: str) -> bool:
-        return name in ('Returns:', 'Since:',
-                        # those are often singular or plural
-                        'Note:', 'Notes:',
-                        'Example:', 'Examples:',
-                        'TODO:')
+    def _match_at_name_colon(string: str) -> re.Match:
+        return re.match(r'@([^:]*): *', string)
+
+    @staticmethod
+    def _match_section_tag(string: str) -> re.Match:
+        return re.match(r'(Returns|Since|Notes?|Examples?|TODO): *', string)
 
     def _append_body_line(self, line: str) -> None:
         """
@@ -581,7 +581,6 @@ def _append_body_line(self, line: str) -> None:
 
         Else, append the line to the current section.
         """
-        name = line.split(' ', 1)[0]
         # FIXME not nice: things like '#  @foo:' and '# @foo: ' aren't
         # recognized, and get silently treated as ordinary text
         if not self.symbol and not self.body.text and line.startswith('@'):
@@ -595,12 +594,12 @@ def _append_body_line(self, line: str) -> None:
                     self._parser, "name required after '@'")
         elif self.symbol:
             # This is a definition documentation block
-            if name.startswith('@') and name.endswith(':'):
+            if self._match_at_name_colon(line):
                 self._append_line = self._append_args_line
                 self._append_args_line(line)
             elif line == 'Features:':
                 self._append_line = self._append_features_line
-            elif self._is_section_tag(name):
+            elif self._match_section_tag(line):
                 self._append_line = self._append_various_line
                 self._append_various_line(line)
             else:
@@ -621,16 +620,15 @@ def _append_args_line(self, line: str) -> None:
         Else, append the line to the current section.
 
         """
-        name = line.split(' ', 1)[0]
-
-        if name.startswith('@') and name.endswith(':'):
+        if match := self._match_at_name_colon(line):
             # If line is "@arg:   first line of description", find
             # the index of 'f', which is the indent we expect for any
             # following lines.  We then remove the leading "@arg:"
             # from line and replace it with spaces so that 'f' has the
             # same index as it did in the original line and can be
             # handled the same way we will handle following lines.
-            indent = must_match(r'@\S*:\s*', line).end()
+            name = match.group(1)
+            indent = match.end()
             line = line[indent:]
             if not line:
                 # Line was just the "@arg:" header
@@ -638,8 +636,8 @@ def _append_args_line(self, line: str) -> None:
                 indent = -1
             else:
                 line = ' ' * indent + line
-            self._start_args_section(name[1:-1], indent)
-        elif self._is_section_tag(name):
+            self._start_args_section(name, indent)
+        elif self._match_section_tag(line):
             self._append_line = self._append_various_line
             self._append_various_line(line)
             return
@@ -656,16 +654,15 @@ def _append_args_line(self, line: str) -> None:
         self._append_freeform(line)
 
     def _append_features_line(self, line: str) -> None:
-        name = line.split(' ', 1)[0]
-
-        if name.startswith('@') and name.endswith(':'):
+        if match := self._match_at_name_colon(line):
             # If line is "@arg:   first line of description", find
             # the index of 'f', which is the indent we expect for any
             # following lines.  We then remove the leading "@arg:"
             # from line and replace it with spaces so that 'f' has the
             # same index as it did in the original line and can be
             # handled the same way we will handle following lines.
-            indent = must_match(r'@\S*:\s*', line).end()
+            name = match.group(1)
+            indent = match.end()
             line = line[indent:]
             if not line:
                 # Line was just the "@arg:" header
@@ -673,8 +670,8 @@ def _append_features_line(self, line: str) -> None:
                 indent = -1
             else:
                 line = ' ' * indent + line
-            self._start_features_section(name[1:-1], indent)
-        elif self._is_section_tag(name):
+            self._start_features_section(name, indent)
+        elif self._match_section_tag(line):
             self._append_line = self._append_various_line
             self._append_various_line(line)
             return
@@ -698,13 +695,11 @@ def _append_various_line(self, line: str) -> None:
 
         Else, append the line to the current section.
         """
-        name = line.split(' ', 1)[0]
-
-        if name.startswith('@') and name.endswith(':'):
+        if match := self._match_at_name_colon(line):
             raise QAPIParseError(self._parser,
-                                 "'%s' can't follow '%s' section"
-                                 % (name, self.sections[0].name))
-        if self._is_section_tag(name):
+                                 "'@%s:' can't follow '%s' section"
+                                 % (match.group(1), self.sections[0].name))
+        if match := self._match_section_tag(line):
             # If line is "Section:   first line of description", find
             # the index of 'f', which is the indent we expect for any
             # following lines.  We then remove the leading "Section:"
@@ -719,7 +714,7 @@ def _append_various_line(self, line: str) -> None:
                 indent = 0
             else:
                 line = ' ' * indent + line
-            self._start_section(name[:-1], indent)
+            self._start_section(match.group(1), indent)
 
         self._append_freeform(line)
 
-- 
2.39.2



  parent reply	other threads:[~2023-04-28 10:58 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-28 10:54 [PATCH 00/17] qapi: Reformat doc comments Markus Armbruster
2023-04-28 10:54 ` [PATCH 01/17] docs/devel/qapi-code-gen: Clean up use of quotes a bit Markus Armbruster
2023-04-28 11:21   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 02/17] docs/devel/qapi-code-gen: Turn FIXME admonitions into comments Markus Armbruster
2023-04-28 17:53   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 03/17] qapi: Fix crash on stray double quote character Markus Armbruster
2023-04-28 17:54   ` Juan Quintela
2023-05-09  7:03     ` Markus Armbruster
2023-04-28 10:54 ` [PATCH 04/17] meson: Fix to make QAPI generator output depend on main.py Markus Armbruster
2023-04-28 17:55   ` Juan Quintela
2023-05-09  7:10     ` Markus Armbruster
2023-04-28 10:54 ` [PATCH 05/17] Revert "qapi: BlockExportRemoveMode: move comments to TODO" Markus Armbruster
2023-04-28 17:57   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 06/17] sphinx/qapidoc: Do not emit TODO sections into user manuals Markus Armbruster
2023-04-28 13:30   ` Ani Sinha
2023-04-28 17:58   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 07/17] qapi: Tidy up a slightly awkward TODO comment Markus Armbruster
2023-04-28 13:25   ` Ani Sinha
2023-04-28 18:02   ` Juan Quintela
2023-05-09  7:12     ` Markus Armbruster
2023-04-28 10:54 ` [PATCH 08/17] qapi/dump: Indent bulleted lists consistently Markus Armbruster
2023-04-28 18:03   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 09/17] tests/qapi-schema/doc-good: Improve a comment Markus Armbruster
2023-04-28 18:05   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 10/17] tests/qapi-schema/doc-good: Improve argument description tests Markus Armbruster
2023-04-28 18:08   ` Juan Quintela
2023-05-09  7:25     ` Markus Armbruster
2023-05-09 10:06       ` Juan Quintela
2023-04-28 10:54 ` [PATCH 11/17] qapi: Fix argument description indentation stripping Markus Armbruster
2023-04-28 18:11   ` Juan Quintela
2023-04-28 10:54 ` Markus Armbruster [this message]
2023-04-28 18:30   ` [PATCH 12/17] qapi: Rewrite parsing of doc comment section symbols and tags Juan Quintela
2023-05-09  7:27     ` Markus Armbruster
2023-05-10  7:31   ` Markus Armbruster
2023-04-28 10:54 ` [PATCH 13/17] qapi: Relax doc string @name: description indentation rules Markus Armbruster
2023-04-28 18:25   ` Juan Quintela
2023-05-09  7:41     ` Markus Armbruster
2023-05-09  8:50       ` Markus Armbruster
2023-04-28 10:54 ` [PATCH 14/17] qapi: Section parameter @indent is no longer used, drop Markus Armbruster
2023-04-28 18:22   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 15/17] docs/devel/qapi-code-gen: Update doc comment conventions Markus Armbruster
2023-04-28 18:17   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 16/17] qga/qapi-schema: Reformat doc comments to conform to current conventions Markus Armbruster
2023-04-28 18:21   ` Juan Quintela
2023-04-28 10:54 ` [PATCH 17/17] qapi: " Markus Armbruster
2023-04-28 17:51   ` Juan Quintela
2023-04-28 18:33   ` Lukas Straub
2023-04-28 11:02 ` [PATCH 00/17] qapi: Reformat doc comments Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230428105429.1687850-13-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=anisinha@redhat.com \
    --cc=arei.gonglei@huawei.com \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=hreitz@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=jiri@resnulli.us \
    --cc=jsnow@redhat.com \
    --cc=kkostiuk@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=leobras@redhat.com \
    --cc=lukasstraub2@web.de \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=michael.roth@amd.com \
    --cc=mst@redhat.com \
    --cc=pavel.dovgaluk@ispras.ru \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=philmd@linaro.org \
    --cc=pizhenwei@bytedance.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanb@linux.vnet.ibm.com \
    --cc=stefanha@redhat.com \
    --cc=thuth@redhat.com \
    --cc=victortoso@redhat.com \
    --cc=vsementsov@yandex-team.ru \
    --cc=wangyanan55@huawei.com \
    --cc=yuval.shaia.ml@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.