{"id":2230508,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230508/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260429192611.1581223-14-jsnow@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260429192611.1581223-14-jsnow@redhat.com>","date":"2026-04-29T19:26:11","name":"[v2,13/13] rfc: intro starts on next line","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"647bdfa89b117124b4e4c37f4351edc675b7fc78","submitter":{"id":64343,"url":"http://patchwork.ozlabs.org/api/1.1/people/64343/?format=json","name":"John Snow","email":"jsnow@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260429192611.1581223-14-jsnow@redhat.com/mbox/","series":[{"id":502140,"url":"http://patchwork.ozlabs.org/api/1.1/series/502140/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502140","date":"2026-04-29T19:25:59","name":"qapi: add formal \"intro\" section","version":2,"mbox":"http://patchwork.ozlabs.org/series/502140/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230508/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230508/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=ZS7cNX8f;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5S5d1mk9z1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 05:28:37 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wIAaE-00089X-C6; Wed, 29 Apr 2026 15:28:32 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wIAZ9-0007DR-D7\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 15:27:27 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wIAZ5-00080B-Fh\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 15:27:21 -0400","from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-345-dmwEv70RP6OK_uyN-fdJbw-1; Wed,\n 29 Apr 2026 15:27:14 -0400","from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 4E6371800352; Wed, 29 Apr 2026 19:27:13 +0000 (UTC)","from jsnow-thinkpadp16vgen1.westford.csb (unknown [10.22.80.204])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 4B75D1800446; Wed, 29 Apr 2026 19:27:08 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777490838;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=yvQrrTZJip/bbrHJViDv7QteLJ2uq7tVJhjkIuaDuSk=;\n b=ZS7cNX8fSGRCd23T15k9CfdpWmCKWEMZBf7U5TS/oX76smRZ2C17wfP0aMjCUT7ol9/AO4\n y9UWo2l4az6xAdCfFVJWnQ6SwhKNXwEyC1My+QqrWy4Nf5Z9kCF7lOs7PbdFYRXd0h3Zi+\n 8yf4nalHo5gYmuXqv71k9zaxvJpv524=","X-MC-Unique":"dmwEv70RP6OK_uyN-fdJbw-1","X-Mimecast-MFC-AGG-ID":"dmwEv70RP6OK_uyN-fdJbw_1777490833","From":"John Snow <jsnow@redhat.com>","To":"qemu-devel@nongnu.org","Cc":"Michael Roth <michael.roth@amd.com>, Eric Blake <eblake@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Richard Henderson <richard.henderson@linaro.org>,\n John Snow <jsnow@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,\n \"Michael S. Tsirkin\" <mst@redhat.com>,\n Peter Maydell <peter.maydell@linaro.org>,\n Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>,\n Igor Mammedov <imammedo@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>,\n Ani Sinha <anisinha@redhat.com>,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Markus Armbruster <armbru@redhat.com>","Subject":"[PATCH v2 13/13] rfc: intro starts on next line","Date":"Wed, 29 Apr 2026 15:26:11 -0400","Message-ID":"<20260429192611.1581223-14-jsnow@redhat.com>","In-Reply-To":"<20260429192611.1581223-1-jsnow@redhat.com>","References":"<20260429192611.1581223-1-jsnow@redhat.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.111","Received-SPF":"pass client-ip=170.10.129.124; envelope-from=jsnow@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Revert some parser changes that had allowed the intro section to start\non the same line as the definition name. If we go this route, the\nchanges need to be back-squashed into earlier commits and the\nqapi-code-gen.rst documentation needs to be rewritten and reworded a\nlittle bit.\n\nSigned-off-by: John Snow <jsnow@redhat.com>\n---\n docs/sphinx/qapidoc.py                  |  5 +-\n qapi/accelerator.json                   | 18 +++--\n qapi/acpi-hest.json                     |  5 +-\n qapi/acpi.json                          | 13 ++--\n qapi/audio.json                         | 88 ++++++++++++++++---------\n scripts/qapi/parser.py                  | 12 +---\n tests/qapi-schema/doc-missing-colon.err |  2 +-\n 7 files changed, 86 insertions(+), 57 deletions(-)","diff":"diff --git a/docs/sphinx/qapidoc.py b/docs/sphinx/qapidoc.py\nindex 6b8e4ecd76a..985954164b0 100644\n--- a/docs/sphinx/qapidoc.py\n+++ b/docs/sphinx/qapidoc.py\n@@ -156,8 +156,9 @@ def add_lines(\n         lines = content.splitlines(True)\n \n         if dedent:\n-            txt = \"\".join(lines[1:])\n-            lines[1:] = textwrap.dedent(txt).splitlines(True)\n+            lines = textwrap.dedent(content).splitlines(True)\n+        else:\n+            lines = content.splitlines(True)\n \n         for i, line in enumerate(lines):\n             self.add_line_raw(line, info.fname, info.line + i)\ndiff --git a/qapi/accelerator.json b/qapi/accelerator.json\nindex 71047538ee1..05dbef51c5d 100644\n--- a/qapi/accelerator.json\n+++ b/qapi/accelerator.json\n@@ -12,7 +12,8 @@\n { 'include': 'common.json' }\n \n ##\n-# @KvmInfo: Information about support for KVM acceleration\n+# @KvmInfo:\n+#     Information about support for KVM acceleration\n #\n # @enabled: true if KVM acceleration is active\n #\n@@ -23,7 +24,8 @@\n { 'struct': 'KvmInfo', 'data': {'enabled': 'bool', 'present': 'bool'} }\n \n ##\n-# @query-kvm: Return information about KVM acceleration\n+# @query-kvm:\n+#     Return information about KVM acceleration\n #\n # Since: 0.14\n #\n@@ -35,7 +37,8 @@\n { 'command': 'query-kvm', 'returns': 'KvmInfo' }\n \n ##\n-# @x-accel-stats: Query accelerator statistics\n+# @x-accel-stats:\n+#     Query accelerator statistics\n #\n # Features:\n #\n@@ -50,7 +53,8 @@\n   'features': [ 'unstable' ] }\n \n ##\n-# @Accelerator: Information about support for MSHV acceleration\n+# @Accelerator:\n+#     Information about support for MSHV acceleration\n #\n # @hvf: Apple Hypervisor.framework\n #\n@@ -73,7 +77,8 @@\n { 'enum': 'Accelerator', 'data': ['hvf', 'kvm', 'mshv', 'nvmm', 'qtest', 'tcg', 'whpx', 'xen'] }\n \n ##\n-# @AcceleratorInfo: Information about support for various accelerators\n+# @AcceleratorInfo:\n+#     Information about support for various accelerators\n #\n # @enabled: the accelerator that is in use\n #\n@@ -85,7 +90,8 @@\n { 'struct': 'AcceleratorInfo', 'data': {'enabled': 'Accelerator', 'present': ['Accelerator']} }\n \n ##\n-# @query-accelerators: Return information about accelerators\n+# @query-accelerators:\n+#     Return information about accelerators\n #\n # Returns: @AcceleratorInfo\n #\ndiff --git a/qapi/acpi-hest.json b/qapi/acpi-hest.json\nindex 6a48e80082e..8db804df197 100644\n--- a/qapi/acpi-hest.json\n+++ b/qapi/acpi-hest.json\n@@ -12,8 +12,9 @@\n ##\n \n ##\n-# @inject-ghes-v2-error: Inject an error with additional ACPI 6.1\n-#     GHESv2 error information\n+# @inject-ghes-v2-error:\n+#     Inject an error with additional ACPI 6.1 GHESv2 error\n+#     information\n #\n # @cper: contains a base64 encoded string with raw data for a single\n #     CPER record with Generic Error Status Block, Generic Error Data\ndiff --git a/qapi/acpi.json b/qapi/acpi.json\nindex ea6ad2cd45f..82e82d7cf89 100644\n--- a/qapi/acpi.json\n+++ b/qapi/acpi.json\n@@ -12,8 +12,8 @@\n ##\n \n ##\n-# @AcpiTableOptions: Specify an ACPI table on the\n-#     command line to load.\n+# @AcpiTableOptions:\n+#     Specify an ACPI table on the command line to load.\n #\n # At most one of @file and @data can be specified.  The list of files\n # specified by any one of them is loaded and concatenated in order.\n@@ -79,7 +79,8 @@\n { 'enum': 'ACPISlotType', 'data': [ 'DIMM', 'CPU' ] }\n \n ##\n-# @ACPIOSTInfo: OSPM Status Indication for a device.  For description\n+# @ACPIOSTInfo:\n+#     OSPM Status Indication for a device.  For description\n #     of possible values of @source and @status fields see \"_OST (OSPM\n #     Status Indication)\" chapter of ACPI5.0 spec.\n #\n@@ -103,7 +104,8 @@\n               'status': 'int' } }\n \n ##\n-# @query-acpi-ospm-status: Return a list of `ACPIOSTInfo` for devices\n+# @query-acpi-ospm-status:\n+#     Return a list of `ACPIOSTInfo` for devices\n #     that support status reporting via ACPI _OST method.\n #\n # Since: 2.1\n@@ -120,7 +122,8 @@\n { 'command': 'query-acpi-ospm-status', 'returns': ['ACPIOSTInfo'] }\n \n ##\n-# @ACPI_DEVICE_OST: Emitted when guest executes ACPI _OST method.\n+# @ACPI_DEVICE_OST:\n+#     Emitted when guest executes ACPI _OST method.\n #\n # @info: OSPM Status Indication\n #\ndiff --git a/qapi/audio.json b/qapi/audio.json\nindex 62d64eabf1c..72190f20993 100644\n--- a/qapi/audio.json\n+++ b/qapi/audio.json\n@@ -13,8 +13,9 @@\n ##\n \n ##\n-# @AudiodevPerDirectionOptions: General audio backend options that are\n-#     used for both playback and recording.\n+# @AudiodevPerDirectionOptions:\n+#     General audio backend options that are used for both playback\n+#     and recording.\n #\n # @mixing-engine: use QEMU's mixing engine to mix all streams inside\n #     QEMU and convert audio formats when not supported by the\n@@ -50,7 +51,8 @@\n     '*buffer-length':  'uint32' } }\n \n ##\n-# @AudiodevGenericOptions: Generic driver-specific options.\n+# @AudiodevGenericOptions:\n+#     Generic driver-specific options.\n #\n # @in: options of the capture stream\n #\n@@ -64,7 +66,8 @@\n     '*out': 'AudiodevPerDirectionOptions' } }\n \n ##\n-# @AudiodevDBusOptions: Options of the D-Bus audio backend.\n+# @AudiodevDBusOptions:\n+#     Options of the D-Bus audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -82,8 +85,9 @@\n     '*nsamples': 'uint32'} }\n \n ##\n-# @AudiodevAlsaPerDirectionOptions: Options of the ALSA backend that\n-#     are used for both playback and recording.\n+# @AudiodevAlsaPerDirectionOptions:\n+#     Options of the ALSA backend that are used for both playback and\n+#     recording.\n #\n # @dev: the name of the ALSA device to use (default 'default')\n #\n@@ -102,7 +106,8 @@\n     '*try-poll':      'bool' } }\n \n ##\n-# @AudiodevAlsaOptions: Options of the ALSA audio backend.\n+# @AudiodevAlsaOptions:\n+#     Options of the ALSA audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -119,7 +124,8 @@\n     '*threshold': 'uint32' } }\n \n ##\n-# @AudiodevSndioOptions: Options of the sndio audio backend.\n+# @AudiodevSndioOptions:\n+#     Options of the sndio audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -139,8 +145,9 @@\n     '*latency':   'uint32'} }\n \n ##\n-# @AudiodevCoreaudioPerDirectionOptions: Options of the Core Audio\n-#     backend that are used for both playback and recording.\n+# @AudiodevCoreaudioPerDirectionOptions:\n+#     Options of the Core Audio backend that are used for both\n+#     playback and recording.\n #\n # @buffer-count: number of buffers\n #\n@@ -152,7 +159,8 @@\n     '*buffer-count': 'uint32' } }\n \n ##\n-# @AudiodevCoreaudioOptions: Options of the coreaudio audio backend.\n+# @AudiodevCoreaudioOptions:\n+#     Options of the coreaudio audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -166,7 +174,8 @@\n     '*out': 'AudiodevCoreaudioPerDirectionOptions' } }\n \n ##\n-# @AudiodevDsoundOptions: Options of the DirectSound audio backend.\n+# @AudiodevDsoundOptions:\n+#     Options of the DirectSound audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -184,8 +193,9 @@\n     '*latency': 'uint32' } }\n \n ##\n-# @AudiodevJackPerDirectionOptions: Options of the JACK backend that\n-#     are used for both playback and recording.\n+# @AudiodevJackPerDirectionOptions:\n+#     Options of the JACK backend that are used for both playback and\n+#     recording.\n #\n # @server-name: select from among several possible concurrent server\n #     instances (default: environment variable $JACK_DEFAULT_SERVER if\n@@ -216,7 +226,8 @@\n     '*exact-name':    'bool' } }\n \n ##\n-# @AudiodevJackOptions: Options of the JACK audio backend.\n+# @AudiodevJackOptions:\n+#     Options of the JACK audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -230,8 +241,9 @@\n     '*out': 'AudiodevJackPerDirectionOptions' } }\n \n ##\n-# @AudiodevOssPerDirectionOptions: Options of the OSS backend that are\n-#     used for both playback and recording.\n+# @AudiodevOssPerDirectionOptions:\n+#     Options of the OSS backend that are used for both playback and\n+#     recording.\n #\n # @dev: file name of the OSS device (default '/dev/dsp')\n #\n@@ -250,7 +262,8 @@\n     '*try-poll':     'bool' } }\n \n ##\n-# @AudiodevOssOptions: Options of the OSS audio backend.\n+# @AudiodevOssOptions:\n+#     Options of the OSS audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -278,8 +291,9 @@\n     '*dsp-policy': 'uint32' } }\n \n ##\n-# @AudiodevPaPerDirectionOptions: Options of the Pulseaudio backend\n-#     that are used for both playback and recording.\n+# @AudiodevPaPerDirectionOptions:\n+#     Options of the Pulseaudio backend that are used for both\n+#     playback and recording.\n #\n # @name: name of the sink/source to use\n #\n@@ -301,7 +315,8 @@\n     '*latency': 'uint32' } }\n \n ##\n-# @AudiodevPaOptions: Options of the PulseAudio audio backend.\n+# @AudiodevPaOptions:\n+#     Options of the PulseAudio audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -318,8 +333,9 @@\n     '*server': 'str' } }\n \n ##\n-# @AudiodevPipewirePerDirectionOptions: Options of the PipeWire\n-#     backend that are used for both playback and recording.\n+# @AudiodevPipewirePerDirectionOptions:\n+#     Options of the PipeWire backend that are used for both playback\n+#     and recording.\n #\n # @name: name of the sink/source to use\n #\n@@ -341,7 +357,8 @@\n     '*latency': 'uint32' } }\n \n ##\n-# @AudiodevPipewireOptions: Options of the PipeWire audio backend.\n+# @AudiodevPipewireOptions:\n+#     Options of the PipeWire audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -355,8 +372,9 @@\n     '*out':    'AudiodevPipewirePerDirectionOptions' } }\n \n ##\n-# @AudiodevSdlPerDirectionOptions: Options of the SDL audio backend\n-#     that are used for both playback and recording.\n+# @AudiodevSdlPerDirectionOptions:\n+#     Options of the SDL audio backend that are used for both playback\n+#     and recording.\n #\n # @buffer-count: number of buffers (default 4)\n #\n@@ -368,7 +386,8 @@\n     '*buffer-count': 'uint32' } }\n \n ##\n-# @AudiodevSdlOptions: Options of the SDL audio backend.\n+# @AudiodevSdlOptions:\n+#     Options of the SDL audio backend.\n #\n # @in: options of the recording stream\n #\n@@ -382,7 +401,8 @@\n     '*out': 'AudiodevSdlPerDirectionOptions' } }\n \n ##\n-# @AudiodevWavOptions: Options of the wav audio backend.\n+# @AudiodevWavOptions:\n+#     Options of the wav audio backend.\n #\n # @in: options of the capture stream\n #\n@@ -399,7 +419,8 @@\n     '*path': 'str' } }\n \n ##\n-# @AudioFormat: An enumeration of possible audio formats.\n+# @AudioFormat:\n+#     An enumeration of possible audio formats.\n #\n # @u8: unsigned 8 bit integer\n #\n@@ -421,7 +442,8 @@\n   'data': [ 'u8', 's8', 'u16', 's16', 'u32', 's32', 'f32' ] }\n \n ##\n-# @AudiodevDriver: An enumeration of possible audio backend drivers.\n+# @AudiodevDriver:\n+#     An enumeration of possible audio backend drivers.\n #\n # @jack: JACK audio backend (since 5.1)\n #\n@@ -443,7 +465,8 @@\n             'wav' ] }\n \n ##\n-# @Audiodev: Options of an audio backend.\n+# @Audiodev:\n+#     Options of an audio backend.\n #\n # @id: identifier of the backend\n #\n@@ -487,7 +510,8 @@\n     'wav':       'AudiodevWavOptions' } }\n \n ##\n-# @query-audiodevs: Return information about audiodev configuration\n+# @query-audiodevs:\n+#     Return information about audiodev configuration\n #\n # Since: 8.0\n ##\ndiff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py\nindex c23fd26aaa7..8ff2a2c4c0b 100644\n--- a/scripts/qapi/parser.py\n+++ b/scripts/qapi/parser.py\n@@ -530,23 +530,17 @@ def _get_doc_intro(\n         line: str,\n         info: QAPISourceInfo\n     ) -> Tuple['QAPIDoc', Optional[str]]:\n-        match = self._match_at_name_colon(line)\n-        if not match:\n-            raise QAPIParseError(self, \"@name must end with ':'\")\n+        if not line.endswith(':'):\n+            raise QAPIParseError(self, \"line should end with ':'\")\n \n         # Invalid names are not checked here, but the name\n         # provided *must* match the following definition,\n         # which *is* validated in expr.py.\n-        symbol = match.group(1)\n+        symbol = line[1:-1]\n         if not symbol:\n             raise QAPIParseError(self, \"name required after '@'\")\n         doc = QAPIDoc(info, symbol)\n-\n         doc.ensure_untagged_section(info, QAPIDoc.Kind.INTRO)\n-        text = line[match.end():]\n-        if text:\n-            doc.append_line(text)\n-\n         return doc, self.get_doc_indented(doc)\n \n     def get_doc(self) -> 'QAPIDoc':\ndiff --git a/tests/qapi-schema/doc-missing-colon.err b/tests/qapi-schema/doc-missing-colon.err\nindex bd5862b30f3..cbcea007153 100644\n--- a/tests/qapi-schema/doc-missing-colon.err\n+++ b/tests/qapi-schema/doc-missing-colon.err\n@@ -1 +1 @@\n-doc-missing-colon.json:4:1: @name must end with ':'\n+doc-missing-colon.json:4:1: line should end with ':'\n","prefixes":["v2","13/13"]}