qapi/common.py: move build_params into gen.py

Including it in common.py creates a circular import dependency; schema
relies on common, but common.build_params requires a type annotation
from schema. To type this properly, it needs to be moved outside the
cycle.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Message-Id: <20201009161558.107041-18-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
John Snow 2020-10-09 12:15:39 -04:00 committed by Markus Armbruster
parent 1cc7398dfa
commit e6a34cd7a4
4 changed files with 36 additions and 34 deletions

View File

@ -13,8 +13,13 @@
See the COPYING file in the top-level directory. See the COPYING file in the top-level directory.
""" """
from .common import build_params, c_name, mcgen from .common import c_name, mcgen
from .gen import QAPIGenCCode, QAPISchemaModularCVisitor, ifcontext from .gen import (
QAPIGenCCode,
QAPISchemaModularCVisitor,
build_params,
ifcontext,
)
def gen_command_decl(name, arg_type, boxed, ret_type): def gen_command_decl(name, arg_type, boxed, ret_type):

View File

@ -210,26 +210,3 @@ def gen_endif(ifcond: Sequence[str]) -> str:
#endif /* %(cond)s */ #endif /* %(cond)s */
''', cond=ifc) ''', cond=ifc)
return ret return ret
def build_params(arg_type,
boxed: bool,
extra: Optional[str] = None) -> str:
ret = ''
sep = ''
if boxed:
assert arg_type
ret += '%s arg' % arg_type.c_param_type()
sep = ', '
elif arg_type:
assert not arg_type.variants
for memb in arg_type.members:
ret += sep
sep = ', '
if memb.optional:
ret += 'bool has_%s, ' % c_name(memb.name)
ret += '%s %s' % (memb.type.c_param_type(),
c_name(memb.name))
if extra:
ret += sep + extra
return ret if ret else 'void'

View File

@ -12,13 +12,8 @@
See the COPYING file in the top-level directory. See the COPYING file in the top-level directory.
""" """
from .common import ( from .common import c_enum_const, c_name, mcgen
build_params, from .gen import QAPISchemaModularCVisitor, build_params, ifcontext
c_enum_const,
c_name,
mcgen,
)
from .gen import QAPISchemaModularCVisitor, ifcontext
from .schema import QAPISchemaEnumMember from .schema import QAPISchemaEnumMember
from .types import gen_enum, gen_enum_lookup from .types import gen_enum, gen_enum_lookup

View File

@ -2,7 +2,7 @@
# #
# QAPI code generation # QAPI code generation
# #
# Copyright (c) 2018-2019 Red Hat Inc. # Copyright (c) 2015-2019 Red Hat Inc.
# #
# Authors: # Authors:
# Markus Armbruster <armbru@redhat.com> # Markus Armbruster <armbru@redhat.com>
@ -15,16 +15,18 @@
import errno import errno
import os import os
import re import re
from typing import Optional
from .common import ( from .common import (
c_fname, c_fname,
c_name,
gen_endif, gen_endif,
gen_if, gen_if,
guardend, guardend,
guardstart, guardstart,
mcgen, mcgen,
) )
from .schema import QAPISchemaVisitor from .schema import QAPISchemaObjectType, QAPISchemaVisitor
class QAPIGen: class QAPIGen:
@ -90,6 +92,29 @@ def _wrap_ifcond(ifcond, before, after):
return out return out
def build_params(arg_type: Optional[QAPISchemaObjectType],
boxed: bool,
extra: Optional[str] = None) -> str:
ret = ''
sep = ''
if boxed:
assert arg_type
ret += '%s arg' % arg_type.c_param_type()
sep = ', '
elif arg_type:
assert not arg_type.variants
for memb in arg_type.members:
ret += sep
sep = ', '
if memb.optional:
ret += 'bool has_%s, ' % c_name(memb.name)
ret += '%s %s' % (memb.type.c_param_type(),
c_name(memb.name))
if extra:
ret += sep + extra
return ret if ret else 'void'
class QAPIGenCCode(QAPIGen): class QAPIGenCCode(QAPIGen):
def __init__(self, fname): def __init__(self, fname):