qapi: Pass file name to QAPIGen constructor instead of methods

Not much of an improvement now, but the next commit will profit.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20190301154051.23317-4-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Markus Armbruster 2019-03-01 16:40:47 +01:00
parent 0f20628b24
commit dddee4d7ba
3 changed files with 38 additions and 36 deletions

View file

@ -239,7 +239,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
QAPISchemaModularCVisitor.__init__( QAPISchemaModularCVisitor.__init__(
self, prefix, 'qapi-commands', self, prefix, 'qapi-commands',
' * Schema-defined QAPI/QMP commands', __doc__) ' * Schema-defined QAPI/QMP commands', __doc__)
self._regy = QAPIGenCCode() self._regy = QAPIGenCCode(None)
self._visited_ret_types = {} self._visited_ret_types = {}
def _begin_user_module(self, name): def _begin_user_module(self, name):

View file

@ -2158,7 +2158,8 @@ def build_params(arg_type, boxed, extra=None):
class QAPIGen(object): class QAPIGen(object):
def __init__(self): def __init__(self, fname):
self.fname = fname
self._preamble = '' self._preamble = ''
self._body = '' self._body = ''
@ -2168,18 +2169,17 @@ class QAPIGen(object):
def add(self, text): def add(self, text):
self._body += text self._body += text
def get_content(self, fname=None): def get_content(self):
return (self._top(fname) + self._preamble + self._body return self._top() + self._preamble + self._body + self._bottom()
+ self._bottom(fname))
def _top(self, fname): def _top(self):
return '' return ''
def _bottom(self, fname): def _bottom(self):
return '' return ''
def write(self, output_dir, fname): def write(self, output_dir):
pathname = os.path.join(output_dir, fname) pathname = os.path.join(output_dir, self.fname)
dir = os.path.dirname(pathname) dir = os.path.dirname(pathname)
if dir: if dir:
try: try:
@ -2192,7 +2192,7 @@ class QAPIGen(object):
f = open(fd, 'r+', encoding='utf-8') f = open(fd, 'r+', encoding='utf-8')
else: else:
f = os.fdopen(fd, 'r+') f = os.fdopen(fd, 'r+')
text = self.get_content(fname) text = self.get_content()
oldtext = f.read(len(text) + 1) oldtext = f.read(len(text) + 1)
if text != oldtext: if text != oldtext:
f.seek(0) f.seek(0)
@ -2229,8 +2229,8 @@ def ifcontext(ifcond, *args):
class QAPIGenCCode(QAPIGen): class QAPIGenCCode(QAPIGen):
def __init__(self): def __init__(self, fname):
QAPIGen.__init__(self) QAPIGen.__init__(self, fname)
self._start_if = None self._start_if = None
def start_if(self, ifcond): def start_if(self, ifcond):
@ -2248,20 +2248,20 @@ class QAPIGenCCode(QAPIGen):
self._preamble = _wrap_ifcond(self._start_if[0], self._preamble = _wrap_ifcond(self._start_if[0],
self._start_if[2], self._preamble) self._start_if[2], self._preamble)
def get_content(self, fname=None): def get_content(self):
assert self._start_if is None assert self._start_if is None
return QAPIGen.get_content(self, fname) return QAPIGen.get_content(self)
class QAPIGenC(QAPIGenCCode): class QAPIGenC(QAPIGenCCode):
def __init__(self, blurb, pydoc): def __init__(self, fname, blurb, pydoc):
QAPIGenCCode.__init__(self) QAPIGenCCode.__init__(self, fname)
self._blurb = blurb self._blurb = blurb
self._copyright = '\n * '.join(re.findall(r'^Copyright .*', pydoc, self._copyright = '\n * '.join(re.findall(r'^Copyright .*', pydoc,
re.MULTILINE)) re.MULTILINE))
def _top(self, fname): def _top(self):
return mcgen(''' return mcgen('''
/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ /* AUTOMATICALLY GENERATED, DO NOT MODIFY */
@ -2277,28 +2277,28 @@ class QAPIGenC(QAPIGenCCode):
''', ''',
blurb=self._blurb, copyright=self._copyright) blurb=self._blurb, copyright=self._copyright)
def _bottom(self, fname): def _bottom(self):
return mcgen(''' return mcgen('''
/* Dummy declaration to prevent empty .o file */ /* Dummy declaration to prevent empty .o file */
char dummy_%(name)s; char dummy_%(name)s;
''', ''',
name=c_name(fname)) name=c_name(self.fname))
class QAPIGenH(QAPIGenC): class QAPIGenH(QAPIGenC):
def _top(self, fname): def _top(self):
return QAPIGenC._top(self, fname) + guardstart(fname) return QAPIGenC._top(self) + guardstart(self.fname)
def _bottom(self, fname): def _bottom(self):
return guardend(fname) return guardend(self.fname)
class QAPIGenDoc(QAPIGen): class QAPIGenDoc(QAPIGen):
def _top(self, fname): def _top(self):
return (QAPIGen._top(self, fname) return (QAPIGen._top(self)
+ '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n') + '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n')
@ -2307,12 +2307,14 @@ class QAPISchemaMonolithicCVisitor(QAPISchemaVisitor):
def __init__(self, prefix, what, blurb, pydoc): def __init__(self, prefix, what, blurb, pydoc):
self._prefix = prefix self._prefix = prefix
self._what = what self._what = what
self._genc = QAPIGenC(blurb, pydoc) self._genc = QAPIGenC(self._prefix + self._what + '.c',
self._genh = QAPIGenH(blurb, pydoc) blurb, pydoc)
self._genh = QAPIGenH(self._prefix + self._what + '.h',
blurb, pydoc)
def write(self, output_dir): def write(self, output_dir):
self._genc.write(output_dir, self._prefix + self._what + '.c') self._genc.write(output_dir)
self._genh.write(output_dir, self._prefix + self._what + '.h') self._genh.write(output_dir)
class QAPISchemaModularCVisitor(QAPISchemaVisitor): class QAPISchemaModularCVisitor(QAPISchemaVisitor):
@ -2349,8 +2351,9 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
return ret return ret
def _add_module(self, name, blurb): def _add_module(self, name, blurb):
genc = QAPIGenC(blurb, self._pydoc) basename = self._module_basename(self._what, name)
genh = QAPIGenH(blurb, self._pydoc) genc = QAPIGenC(basename + '.c', blurb, self._pydoc)
genh = QAPIGenH(basename + '.h', blurb, self._pydoc)
self._module[name] = (genc, genh) self._module[name] = (genc, genh)
self._set_module(name) self._set_module(name)
@ -2370,10 +2373,9 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
for name in self._module: for name in self._module:
if self._is_builtin_module(name) and not opt_builtins: if self._is_builtin_module(name) and not opt_builtins:
continue continue
basename = self._module_basename(self._what, name)
(genc, genh) = self._module[name] (genc, genh) = self._module[name]
genc.write(output_dir, basename + '.c') genc.write(output_dir)
genh.write(output_dir, basename + '.h') genh.write(output_dir)
def _begin_user_module(self, name): def _begin_user_module(self, name):
pass pass

View file

@ -207,11 +207,11 @@ def texi_entity(doc, what, ifcond, base=None, variants=None,
class QAPISchemaGenDocVisitor(qapi.common.QAPISchemaVisitor): class QAPISchemaGenDocVisitor(qapi.common.QAPISchemaVisitor):
def __init__(self, prefix): def __init__(self, prefix):
self._prefix = prefix self._prefix = prefix
self._gen = qapi.common.QAPIGenDoc() self._gen = qapi.common.QAPIGenDoc(self._prefix + 'qapi-doc.texi')
self.cur_doc = None self.cur_doc = None
def write(self, output_dir): def write(self, output_dir):
self._gen.write(output_dir, self._prefix + 'qapi-doc.texi') self._gen.write(output_dir)
def visit_enum_type(self, name, info, ifcond, members, prefix): def visit_enum_type(self, name, info, ifcond, members, prefix):
doc = self.cur_doc doc = self.cur_doc