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>
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
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)
 |