Browse Source
This replaces use of the constants from the QapiSpecialFeatures enum, with constants from the auto-generate QapiFeatures enum in qapi-features.h The 'deprecated' and 'unstable' features still have a little bit of special handling, being force defined to be the 1st + 2nd features in the enum, regardless of whether they're used in the schema. This retains compatibility with common code that references the features via the QapiSpecialFeatures constants. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20250205123550.2754387-5-berrange@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Imports tidied up with isort] Signed-off-by: Markus Armbruster <armbru@redhat.com>pull/281/head
committed by
Markus Armbruster
13 changed files with 110 additions and 7 deletions
@ -0,0 +1,48 @@ |
|||||
|
""" |
||||
|
QAPI features generator |
||||
|
|
||||
|
Copyright 2024 Red Hat |
||||
|
|
||||
|
This work is licensed under the terms of the GNU GPL, version 2. |
||||
|
# See the COPYING file in the top-level directory. |
||||
|
""" |
||||
|
|
||||
|
from typing import ValuesView |
||||
|
|
||||
|
from .common import c_enum_const, c_name |
||||
|
from .gen import QAPISchemaMonolithicCVisitor |
||||
|
from .schema import QAPISchema, QAPISchemaFeature |
||||
|
|
||||
|
|
||||
|
class QAPISchemaGenFeatureVisitor(QAPISchemaMonolithicCVisitor): |
||||
|
|
||||
|
def __init__(self, prefix: str): |
||||
|
super().__init__( |
||||
|
prefix, 'qapi-features', |
||||
|
' * Schema-defined QAPI features', |
||||
|
__doc__) |
||||
|
|
||||
|
self.features: ValuesView[QAPISchemaFeature] |
||||
|
|
||||
|
def visit_begin(self, schema: QAPISchema) -> None: |
||||
|
self.features = schema.features() |
||||
|
self._genh.add("#include \"qapi/util.h\"\n\n") |
||||
|
|
||||
|
def visit_end(self) -> None: |
||||
|
self._genh.add("typedef enum {\n") |
||||
|
for f in self.features: |
||||
|
self._genh.add(f" {c_enum_const('qapi_feature', f.name)}") |
||||
|
if f.name in QAPISchemaFeature.SPECIAL_NAMES: |
||||
|
self._genh.add(f" = {c_enum_const('qapi', f.name)},\n") |
||||
|
else: |
||||
|
self._genh.add(",\n") |
||||
|
|
||||
|
self._genh.add("} " + c_name('QapiFeature') + ";\n") |
||||
|
|
||||
|
|
||||
|
def gen_features(schema: QAPISchema, |
||||
|
output_dir: str, |
||||
|
prefix: str) -> None: |
||||
|
vis = QAPISchemaGenFeatureVisitor(prefix) |
||||
|
schema.visit(vis) |
||||
|
vis.write(output_dir) |
||||
@ -0,0 +1,2 @@ |
|||||
|
features-too-many.json: In command 'go-fish': |
||||
|
features-too-many.json:2: Maximum of 64 schema features is permitted |
||||
@ -0,0 +1,13 @@ |
|||||
|
# Max 64 features, with 2 specials, so 63rd custom is invalid |
||||
|
{ 'command': 'go-fish', |
||||
|
'features': [ |
||||
|
'f00', 'f01', 'f02', 'f03', 'f04', 'f05', 'f06', 'f07', |
||||
|
'f08', 'f09', 'f0a', 'f0b', 'f0c', 'f0d', 'f0e', 'f0f', |
||||
|
'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', |
||||
|
'f18', 'f19', 'f1a', 'f1b', 'f1c', 'f1d', 'f1e', 'f1f', |
||||
|
'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', |
||||
|
'f28', 'f29', 'f2a', 'f2b', 'f2c', 'f2d', 'f2e', 'f2f', |
||||
|
'f30', 'f31', 'f32', 'f33', 'f34', 'f35', 'f36', 'f37', |
||||
|
'f38', 'f39', 'f3a', 'f3b', 'f3c', 'f3d', 'f3e' |
||||
|
] |
||||
|
} |
||||
Loading…
Reference in new issue