QAPI patches for 2020-03-05

-----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAl5g86cSHGFybWJydUBy
 ZWRoYXQuY29tAAoJEDhwtADrkYZTmKMP/R9d9Ce+UUuirtfKpwgcsNTsv3p+5QzC
 ZjkrIfPOiUr3ep6J4TW3NwWiarDlaoz2OM6fvCr4y8Iv4dQi8cNFqWxAOrvFPH+J
 c0YVR3RqIT3mQdYF+ad6AqpBy9e1Ggr0le9YsFMu1Hyy/wjAxVcik+d2qdQCHt0l
 px2w9HRUjmbmRzItMqXzj0pC65K2HEcA8I3FxhxPeali+feMf9uHLwLCLBoqgUjj
 k7mFR09j1IcPc04tV9n2p9ZDA9hqxofec+JTDvPP/7nFZD2X9JAxKyAJuphvEWEE
 +y6K7P5hyDBs0kN6jb4QgPMYe75TNEBPPCEPbl4LwWM0QBw3y2MRAFbRfnVPbWNw
 pFFnGGYHXdThW0I2/abtS2qOTz9KbYSCDN2/nl/PbXdyf+JmjB9mfwH2H1BmoBnM
 x+Ci1CstcUJXW9rk7NJLZ89O2r2abJjf5U7wRzQo7Jk2Wil1ACsiACyv99ttucJi
 3UVfsKPLRxhcbIg9oP6EBmtEdjC7QQwSWzcb1sy12XEgicIjbH2UyPNABux/Vtu5
 Yre4dOpnMPwCq8oBjczNyhnHijG1y+FSXqYiT3ShrvbhMxAMraPnUsmV5cXCLcTb
 nz/0bb8LFx0FV2WRFAP/O7vBsi2hXnWlRvuzj3QxPcFbf5xhsFz0LdPzlblxYIbJ
 czc83nVcdaVF
 =7P1K
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2020-03-05' into staging

QAPI patches for 2020-03-05

# gpg: Signature made Thu 05 Mar 2020 12:42:15 GMT
# gpg:                using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653
# gpg:                issuer "armbru@redhat.com"
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full]
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>" [full]
# Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867  4E5F 3870 B400 EB91 8653

* remotes/armbru/tags/pull-qapi-2020-03-05:
  qapi: Brush off some (py)lint
  qapi: Use super() now we have Python 3
  qapi: Drop conditionals for Python 2
  qapi: Inheriting from object is pointless with Python 3, drop

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-03-05 15:18:18 +00:00
commit af4378c39e
13 changed files with 74 additions and 94 deletions

View file

@ -237,8 +237,8 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor): class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
def __init__(self, prefix): def __init__(self, prefix):
QAPISchemaModularCVisitor.__init__( super().__init__(
self, prefix, 'qapi-commands', prefix, 'qapi-commands',
' * Schema-defined QAPI/QMP commands', None, __doc__) ' * Schema-defined QAPI/QMP commands', None, __doc__)
self._regy = QAPIGenCCode(None) self._regy = QAPIGenCCode(None)
self._visited_ret_types = {} self._visited_ret_types = {}
@ -274,7 +274,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
''', ''',
c_prefix=c_name(self._prefix, protect=False))) c_prefix=c_name(self._prefix, protect=False)))
self._genc.preamble_add(mcgen(''' self._genc.preamble_add(mcgen('''
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "%(prefix)sqapi-commands.h" #include "%(prefix)sqapi-commands.h"

View file

@ -12,7 +12,6 @@
# See the COPYING file in the top-level directory. # See the COPYING file in the top-level directory.
import re import re
import string
# ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1 # ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
@ -43,10 +42,7 @@ def c_enum_const(type_name, const_name, prefix=None):
return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper() return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper()
if hasattr(str, 'maketrans'): c_name_trans = str.maketrans('.-', '__')
c_name_trans = str.maketrans('.-', '__')
else:
c_name_trans = string.maketrans('.-', '__')
# Map @name to a valid C identifier. # Map @name to a valid C identifier.

View file

@ -35,9 +35,9 @@ class QAPIParseError(QAPIError):
col = (col + 7) % 8 + 1 col = (col + 7) % 8 + 1
else: else:
col += 1 col += 1
QAPIError.__init__(self, parser.info, col, msg) super().__init__(parser.info, col, msg)
class QAPISemError(QAPIError): class QAPISemError(QAPIError):
def __init__(self, info, msg): def __init__(self, info, msg):
QAPIError.__init__(self, info, None, msg) super().__init__(info, None, msg)

View file

@ -138,8 +138,8 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor): class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
def __init__(self, prefix): def __init__(self, prefix):
QAPISchemaModularCVisitor.__init__( super().__init__(
self, prefix, 'qapi-events', prefix, 'qapi-events',
' * Schema-defined QAPI/QMP events', None, __doc__) ' * Schema-defined QAPI/QMP events', None, __doc__)
self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False) self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
self._event_enum_members = [] self._event_enum_members = []

View file

@ -35,7 +35,6 @@ def check_name_is_str(name, info, source):
def check_name_str(name, info, source, def check_name_str(name, info, source,
allow_optional=False, enum_member=False, allow_optional=False, enum_member=False,
permit_upper=False): permit_upper=False):
global valid_name
membername = name membername = name
if allow_optional and name.startswith('*'): if allow_optional and name.startswith('*'):
@ -249,7 +248,7 @@ def check_union(expr, info):
def check_alternate(expr, info): def check_alternate(expr, info):
members = expr['data'] members = expr['data']
if len(members) == 0: if not members:
raise QAPISemError(info, "'data' must not be empty") raise QAPISemError(info, "'data' must not be empty")
for (key, value) in members.items(): for (key, value) in members.items():
source = "'data' member '%s'" % key source = "'data' member '%s'" % key

View file

@ -15,14 +15,13 @@
import errno import errno
import os import os
import re import re
import sys
from contextlib import contextmanager from contextlib import contextmanager
from qapi.common import * from qapi.common import *
from qapi.schema import QAPISchemaVisitor from qapi.schema import QAPISchemaVisitor
class QAPIGen(object): class QAPIGen:
def __init__(self, fname): def __init__(self, fname):
self.fname = fname self.fname = fname
@ -46,18 +45,15 @@ class QAPIGen(object):
def write(self, output_dir): def write(self, output_dir):
pathname = os.path.join(output_dir, self.fname) pathname = os.path.join(output_dir, self.fname)
dir = os.path.dirname(pathname) odir = os.path.dirname(pathname)
if dir: if odir:
try: try:
os.makedirs(dir) os.makedirs(odir)
except os.error as e: except os.error as e:
if e.errno != errno.EEXIST: if e.errno != errno.EEXIST:
raise raise
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666) fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
if sys.version_info[0] >= 3: f = open(fd, 'r+', encoding='utf-8')
f = open(fd, 'r+', encoding='utf-8')
else:
f = os.fdopen(fd, 'r+')
text = self.get_content() text = self.get_content()
oldtext = f.read(len(text) + 1) oldtext = f.read(len(text) + 1)
if text != oldtext: if text != oldtext:
@ -86,7 +82,7 @@ def _wrap_ifcond(ifcond, before, after):
class QAPIGenCCode(QAPIGen): class QAPIGenCCode(QAPIGen):
def __init__(self, fname): def __init__(self, fname):
QAPIGen.__init__(self, fname) super().__init__(fname)
self._start_if = None self._start_if = None
def start_if(self, ifcond): def start_if(self, ifcond):
@ -106,13 +102,13 @@ class QAPIGenCCode(QAPIGen):
def get_content(self): def get_content(self):
assert self._start_if is None assert self._start_if is None
return QAPIGen.get_content(self) return super().get_content()
class QAPIGenC(QAPIGenCCode): class QAPIGenC(QAPIGenCCode):
def __init__(self, fname, blurb, pydoc): def __init__(self, fname, blurb, pydoc):
QAPIGenCCode.__init__(self, fname) super().__init__(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))
@ -145,7 +141,7 @@ char qapi_dummy_%(name)s;
class QAPIGenH(QAPIGenC): class QAPIGenH(QAPIGenC):
def _top(self): def _top(self):
return QAPIGenC._top(self) + guardstart(self.fname) return super()._top() + guardstart(self.fname)
def _bottom(self): def _bottom(self):
return guardend(self.fname) return guardend(self.fname)
@ -180,7 +176,7 @@ def ifcontext(ifcond, *args):
class QAPIGenDoc(QAPIGen): class QAPIGenDoc(QAPIGen):
def _top(self): def _top(self):
return (QAPIGen._top(self) return (super()._top()
+ '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n') + '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n')
@ -265,6 +261,9 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
genc.write(output_dir) genc.write(output_dir)
genh.write(output_dir) genh.write(output_dir)
def _begin_system_module(self, name):
pass
def _begin_user_module(self, name): def _begin_user_module(self, name):
pass pass

View file

@ -10,8 +10,6 @@ This work is licensed under the terms of the GNU GPL, version 2.
See the COPYING file in the top-level directory. See the COPYING file in the top-level directory.
""" """
import string
from qapi.common import * from qapi.common import *
from qapi.gen import QAPISchemaMonolithicCVisitor from qapi.gen import QAPISchemaMonolithicCVisitor
from qapi.schema import (QAPISchemaArrayType, QAPISchemaBuiltinType, from qapi.schema import (QAPISchemaArrayType, QAPISchemaBuiltinType,
@ -76,8 +74,8 @@ def to_c_string(string):
class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor): class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor):
def __init__(self, prefix, unmask): def __init__(self, prefix, unmask):
QAPISchemaMonolithicCVisitor.__init__( super().__init__(
self, prefix, 'qapi-introspect', prefix, 'qapi-introspect',
' * QAPI/QMP schema introspection', __doc__) ' * QAPI/QMP schema introspection', __doc__)
self._unmask = unmask self._unmask = unmask
self._schema = None self._schema = None

View file

@ -16,24 +16,20 @@
import os import os
import re import re
import sys
from collections import OrderedDict from collections import OrderedDict
from qapi.error import QAPIParseError, QAPISemError from qapi.error import QAPIParseError, QAPISemError
from qapi.source import QAPISourceInfo from qapi.source import QAPISourceInfo
class QAPISchemaParser(object): class QAPISchemaParser:
def __init__(self, fname, previously_included=None, incl_info=None): def __init__(self, fname, previously_included=None, incl_info=None):
previously_included = previously_included or set() previously_included = previously_included or set()
previously_included.add(os.path.abspath(fname)) previously_included.add(os.path.abspath(fname))
try: try:
if sys.version_info[0] >= 3: fp = open(fname, 'r', encoding='utf-8')
fp = open(fname, 'r', encoding='utf-8')
else:
fp = open(fname, 'r')
self.src = fp.read() self.src = fp.read()
except IOError as e: except IOError as e:
raise QAPISemError(incl_info or QAPISourceInfo(None, None, None), raise QAPISemError(incl_info or QAPISourceInfo(None, None, None),
@ -286,14 +282,13 @@ class QAPISchemaParser(object):
doc.end_comment() doc.end_comment()
self.accept() self.accept()
return doc return doc
else: doc.append(self.val)
doc.append(self.val)
self.accept(False) self.accept(False)
raise QAPIParseError(self, "documentation comment must end with '##'") raise QAPIParseError(self, "documentation comment must end with '##'")
class QAPIDoc(object): class QAPIDoc:
""" """
A documentation comment block, either definition or free-form A documentation comment block, either definition or free-form
@ -312,7 +307,7 @@ class QAPIDoc(object):
Free-form documentation blocks consist only of a body section. Free-form documentation blocks consist only of a body section.
""" """
class Section(object): class Section:
def __init__(self, name=None): def __init__(self, name=None):
# optional section name (argument/member or section name) # optional section name (argument/member or section name)
self.name = name self.name = name
@ -324,7 +319,7 @@ class QAPIDoc(object):
class ArgSection(Section): class ArgSection(Section):
def __init__(self, name): def __init__(self, name):
QAPIDoc.Section.__init__(self, name) super().__init__(name)
self.member = None self.member = None
def connect(self, member): def connect(self, member):
@ -496,7 +491,7 @@ class QAPIDoc(object):
raise QAPIParseError(self._parser, raise QAPIParseError(self._parser,
"'%s' can't follow '%s' section" "'%s' can't follow '%s' section"
% (name, self.sections[0].name)) % (name, self.sections[0].name))
elif self._is_section_tag(name): if self._is_section_tag(name):
line = line[len(name)+1:] line = line[len(name)+1:]
self._start_section(name[:-1]) self._start_section(name[:-1])
@ -560,7 +555,6 @@ class QAPIDoc(object):
raise QAPISemError(feature.info, raise QAPISemError(feature.info,
"feature '%s' lacks documentation" "feature '%s' lacks documentation"
% feature.name) % feature.name)
self.features[feature.name] = QAPIDoc.ArgSection(feature.name)
self.features[feature.name].connect(feature) self.features[feature.name].connect(feature)
def check_expr(self, expr): def check_expr(self, expr):

View file

@ -19,12 +19,12 @@ import re
from collections import OrderedDict from collections import OrderedDict
from qapi.common import c_name, pointer_suffix from qapi.common import c_name, pointer_suffix
from qapi.error import QAPIError, QAPIParseError, QAPISemError from qapi.error import QAPIError, QAPISemError
from qapi.expr import check_exprs from qapi.expr import check_exprs
from qapi.parser import QAPISchemaParser from qapi.parser import QAPISchemaParser
class QAPISchemaEntity(object): class QAPISchemaEntity:
meta = None meta = None
def __init__(self, name, info, doc, ifcond=None, features=None): def __init__(self, name, info, doc, ifcond=None, features=None):
@ -89,21 +89,21 @@ class QAPISchemaEntity(object):
return "%s '%s'" % (self.meta, self.name) return "%s '%s'" % (self.meta, self.name)
class QAPISchemaVisitor(object): class QAPISchemaVisitor:
def visit_begin(self, schema): def visit_begin(self, schema):
pass pass
def visit_end(self): def visit_end(self):
pass pass
def visit_module(self, fname): def visit_module(self, name):
pass pass
def visit_needed(self, entity): def visit_needed(self, entity):
# Default to visiting everything # Default to visiting everything
return True return True
def visit_include(self, fname, info): def visit_include(self, name, info):
pass pass
def visit_builtin_type(self, name, info, json_type): def visit_builtin_type(self, name, info, json_type):
@ -135,7 +135,7 @@ class QAPISchemaVisitor(object):
pass pass
class QAPISchemaModule(object): class QAPISchemaModule:
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
self._entity_list = [] self._entity_list = []
@ -152,11 +152,11 @@ class QAPISchemaModule(object):
class QAPISchemaInclude(QAPISchemaEntity): class QAPISchemaInclude(QAPISchemaEntity):
def __init__(self, sub_module, info): def __init__(self, sub_module, info):
QAPISchemaEntity.__init__(self, None, info, None) super().__init__(None, info, None)
self._sub_module = sub_module self._sub_module = sub_module
def visit(self, visitor): def visit(self, visitor):
QAPISchemaEntity.visit(self, visitor) super().visit(visitor)
visitor.visit_include(self._sub_module.name, self.info) visitor.visit_include(self._sub_module.name, self.info)
@ -202,7 +202,7 @@ class QAPISchemaBuiltinType(QAPISchemaType):
meta = 'built-in' meta = 'built-in'
def __init__(self, name, json_type, c_type): def __init__(self, name, json_type, c_type):
QAPISchemaType.__init__(self, name, None, None) super().__init__(name, None, None)
assert not c_type or isinstance(c_type, str) assert not c_type or isinstance(c_type, str)
assert json_type in ('string', 'number', 'int', 'boolean', 'null', assert json_type in ('string', 'number', 'int', 'boolean', 'null',
'value') 'value')
@ -227,7 +227,7 @@ class QAPISchemaBuiltinType(QAPISchemaType):
return self.json_type() return self.json_type()
def visit(self, visitor): def visit(self, visitor):
QAPISchemaType.visit(self, visitor) super().visit(visitor)
visitor.visit_builtin_type(self.name, self.info, self.json_type()) visitor.visit_builtin_type(self.name, self.info, self.json_type())
@ -235,7 +235,7 @@ class QAPISchemaEnumType(QAPISchemaType):
meta = 'enum' meta = 'enum'
def __init__(self, name, info, doc, ifcond, members, prefix): def __init__(self, name, info, doc, ifcond, members, prefix):
QAPISchemaType.__init__(self, name, info, doc, ifcond) super().__init__(name, info, doc, ifcond)
for m in members: for m in members:
assert isinstance(m, QAPISchemaEnumMember) assert isinstance(m, QAPISchemaEnumMember)
m.set_defined_in(name) m.set_defined_in(name)
@ -244,7 +244,7 @@ class QAPISchemaEnumType(QAPISchemaType):
self.prefix = prefix self.prefix = prefix
def check(self, schema): def check(self, schema):
QAPISchemaType.check(self, schema) super().check(schema)
seen = {} seen = {}
for m in self.members: for m in self.members:
m.check_clash(self.info, seen) m.check_clash(self.info, seen)
@ -269,7 +269,7 @@ class QAPISchemaEnumType(QAPISchemaType):
return 'string' return 'string'
def visit(self, visitor): def visit(self, visitor):
QAPISchemaType.visit(self, visitor) super().visit(visitor)
visitor.visit_enum_type(self.name, self.info, self.ifcond, visitor.visit_enum_type(self.name, self.info, self.ifcond,
self.members, self.prefix) self.members, self.prefix)
@ -278,13 +278,13 @@ class QAPISchemaArrayType(QAPISchemaType):
meta = 'array' meta = 'array'
def __init__(self, name, info, element_type): def __init__(self, name, info, element_type):
QAPISchemaType.__init__(self, name, info, None, None) super().__init__(name, info, None, None)
assert isinstance(element_type, str) assert isinstance(element_type, str)
self._element_type_name = element_type self._element_type_name = element_type
self.element_type = None self.element_type = None
def check(self, schema): def check(self, schema):
QAPISchemaType.check(self, schema) super().check(schema)
self.element_type = schema.resolve_type( self.element_type = schema.resolve_type(
self._element_type_name, self.info, self._element_type_name, self.info,
self.info and self.info.defn_meta) self.info and self.info.defn_meta)
@ -314,7 +314,7 @@ class QAPISchemaArrayType(QAPISchemaType):
return 'array of ' + elt_doc_type return 'array of ' + elt_doc_type
def visit(self, visitor): def visit(self, visitor):
QAPISchemaType.visit(self, visitor) super().visit(visitor)
visitor.visit_array_type(self.name, self.info, self.ifcond, visitor.visit_array_type(self.name, self.info, self.ifcond,
self.element_type) self.element_type)
@ -329,7 +329,7 @@ class QAPISchemaObjectType(QAPISchemaType):
# struct has local_members, optional base, and no variants # struct has local_members, optional base, and no variants
# flat union has base, variants, and no local_members # flat union has base, variants, and no local_members
# simple union has local_members, variants, and no base # simple union has local_members, variants, and no base
QAPISchemaType.__init__(self, name, info, doc, ifcond, features) super().__init__(name, info, doc, ifcond, features)
self.meta = 'union' if variants else 'struct' self.meta = 'union' if variants else 'struct'
assert base is None or isinstance(base, str) assert base is None or isinstance(base, str)
for m in local_members: for m in local_members:
@ -356,7 +356,7 @@ class QAPISchemaObjectType(QAPISchemaType):
raise QAPISemError(self.info, raise QAPISemError(self.info,
"object %s contains itself" % self.name) "object %s contains itself" % self.name)
QAPISchemaType.check(self, schema) super().check(schema)
assert self._checked and self.members is None assert self._checked and self.members is None
seen = OrderedDict() seen = OrderedDict()
@ -419,7 +419,7 @@ class QAPISchemaObjectType(QAPISchemaType):
def c_name(self): def c_name(self):
assert self.name != 'q_empty' assert self.name != 'q_empty'
return QAPISchemaType.c_name(self) return super().c_name()
def c_type(self): def c_type(self):
assert not self.is_implicit() assert not self.is_implicit()
@ -432,7 +432,7 @@ class QAPISchemaObjectType(QAPISchemaType):
return 'object' return 'object'
def visit(self, visitor): def visit(self, visitor):
QAPISchemaType.visit(self, visitor) super().visit(visitor)
visitor.visit_object_type(self.name, self.info, self.ifcond, visitor.visit_object_type(self.name, self.info, self.ifcond,
self.base, self.local_members, self.variants, self.base, self.local_members, self.variants,
self.features) self.features)
@ -441,7 +441,7 @@ class QAPISchemaObjectType(QAPISchemaType):
self.features) self.features)
class QAPISchemaMember(object): class QAPISchemaMember:
""" Represents object members, enum members and features """ """ Represents object members, enum members and features """
role = 'member' role = 'member'
@ -506,7 +506,7 @@ class QAPISchemaFeature(QAPISchemaMember):
class QAPISchemaObjectTypeMember(QAPISchemaMember): class QAPISchemaObjectTypeMember(QAPISchemaMember):
def __init__(self, name, info, typ, optional, ifcond=None): def __init__(self, name, info, typ, optional, ifcond=None):
QAPISchemaMember.__init__(self, name, info, ifcond) super().__init__(name, info, ifcond)
assert isinstance(typ, str) assert isinstance(typ, str)
assert isinstance(optional, bool) assert isinstance(optional, bool)
self._type_name = typ self._type_name = typ
@ -519,7 +519,7 @@ class QAPISchemaObjectTypeMember(QAPISchemaMember):
self.describe) self.describe)
class QAPISchemaObjectTypeVariants(object): class QAPISchemaObjectTypeVariants:
def __init__(self, tag_name, info, tag_member, variants): def __init__(self, tag_name, info, tag_member, variants):
# Flat unions pass tag_name but not tag_member. # Flat unions pass tag_name but not tag_member.
# Simple unions and alternates pass tag_member but not tag_name. # Simple unions and alternates pass tag_member but not tag_name.
@ -576,7 +576,7 @@ class QAPISchemaObjectTypeVariants(object):
assert self.tag_member.ifcond == [] assert self.tag_member.ifcond == []
if self._tag_name: # flat union if self._tag_name: # flat union
# branches that are not explicitly covered get an empty type # branches that are not explicitly covered get an empty type
cases = set([v.name for v in self.variants]) cases = {v.name for v in self.variants}
for m in self.tag_member.type.members: for m in self.tag_member.type.members:
if m.name not in cases: if m.name not in cases:
v = QAPISchemaObjectTypeVariant(m.name, self.info, v = QAPISchemaObjectTypeVariant(m.name, self.info,
@ -614,15 +614,14 @@ class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
role = 'branch' role = 'branch'
def __init__(self, name, info, typ, ifcond=None): def __init__(self, name, info, typ, ifcond=None):
QAPISchemaObjectTypeMember.__init__(self, name, info, typ, super().__init__(name, info, typ, False, ifcond)
False, ifcond)
class QAPISchemaAlternateType(QAPISchemaType): class QAPISchemaAlternateType(QAPISchemaType):
meta = 'alternate' meta = 'alternate'
def __init__(self, name, info, doc, ifcond, variants): def __init__(self, name, info, doc, ifcond, variants):
QAPISchemaType.__init__(self, name, info, doc, ifcond) super().__init__(name, info, doc, ifcond)
assert isinstance(variants, QAPISchemaObjectTypeVariants) assert isinstance(variants, QAPISchemaObjectTypeVariants)
assert variants.tag_member assert variants.tag_member
variants.set_defined_in(name) variants.set_defined_in(name)
@ -630,7 +629,7 @@ class QAPISchemaAlternateType(QAPISchemaType):
self.variants = variants self.variants = variants
def check(self, schema): def check(self, schema):
QAPISchemaType.check(self, schema) super().check(schema)
self.variants.tag_member.check(schema) self.variants.tag_member.check(schema)
# Not calling self.variants.check_clash(), because there's nothing # Not calling self.variants.check_clash(), because there's nothing
# to clash with # to clash with
@ -680,7 +679,7 @@ class QAPISchemaAlternateType(QAPISchemaType):
return 'value' return 'value'
def visit(self, visitor): def visit(self, visitor):
QAPISchemaType.visit(self, visitor) super().visit(visitor)
visitor.visit_alternate_type(self.name, self.info, self.ifcond, visitor.visit_alternate_type(self.name, self.info, self.ifcond,
self.variants) self.variants)
@ -691,7 +690,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
def __init__(self, name, info, doc, ifcond, arg_type, ret_type, def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
gen, success_response, boxed, allow_oob, allow_preconfig, gen, success_response, boxed, allow_oob, allow_preconfig,
features): features):
QAPISchemaEntity.__init__(self, name, info, doc, ifcond, features) super().__init__(name, info, doc, ifcond, features)
assert not arg_type or isinstance(arg_type, str) assert not arg_type or isinstance(arg_type, str)
assert not ret_type or isinstance(ret_type, str) assert not ret_type or isinstance(ret_type, str)
self._arg_type_name = arg_type self._arg_type_name = arg_type
@ -705,7 +704,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
self.allow_preconfig = allow_preconfig self.allow_preconfig = allow_preconfig
def check(self, schema): def check(self, schema):
QAPISchemaEntity.check(self, schema) super().check(schema)
if self._arg_type_name: if self._arg_type_name:
self.arg_type = schema.resolve_type( self.arg_type = schema.resolve_type(
self._arg_type_name, self.info, "command's 'data'") self._arg_type_name, self.info, "command's 'data'")
@ -740,7 +739,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
self.arg_type.connect_doc(doc) self.arg_type.connect_doc(doc)
def visit(self, visitor): def visit(self, visitor):
QAPISchemaEntity.visit(self, visitor) super().visit(visitor)
visitor.visit_command(self.name, self.info, self.ifcond, visitor.visit_command(self.name, self.info, self.ifcond,
self.arg_type, self.ret_type, self.arg_type, self.ret_type,
self.gen, self.success_response, self.gen, self.success_response,
@ -753,14 +752,14 @@ class QAPISchemaEvent(QAPISchemaEntity):
meta = 'event' meta = 'event'
def __init__(self, name, info, doc, ifcond, arg_type, boxed): def __init__(self, name, info, doc, ifcond, arg_type, boxed):
QAPISchemaEntity.__init__(self, name, info, doc, ifcond) super().__init__(name, info, doc, ifcond)
assert not arg_type or isinstance(arg_type, str) assert not arg_type or isinstance(arg_type, str)
self._arg_type_name = arg_type self._arg_type_name = arg_type
self.arg_type = None self.arg_type = None
self.boxed = boxed self.boxed = boxed
def check(self, schema): def check(self, schema):
QAPISchemaEntity.check(self, schema) super().check(schema)
if self._arg_type_name: if self._arg_type_name:
self.arg_type = schema.resolve_type( self.arg_type = schema.resolve_type(
self._arg_type_name, self.info, "event's 'data'") self._arg_type_name, self.info, "event's 'data'")
@ -782,12 +781,12 @@ class QAPISchemaEvent(QAPISchemaEntity):
self.arg_type.connect_doc(doc) self.arg_type.connect_doc(doc)
def visit(self, visitor): def visit(self, visitor):
QAPISchemaEntity.visit(self, visitor) super().visit(visitor)
visitor.visit_event(self.name, self.info, self.ifcond, visitor.visit_event(self.name, self.info, self.ifcond,
self.arg_type, self.boxed) self.arg_type, self.boxed)
class QAPISchema(object): class QAPISchema:
def __init__(self, fname): def __init__(self, fname):
self.fname = fname self.fname = fname
parser = QAPISchemaParser(fname) parser = QAPISchemaParser(fname)
@ -849,7 +848,7 @@ class QAPISchema(object):
def _make_module(self, fname): def _make_module(self, fname):
name = self._module_name(fname) name = self._module_name(fname)
if not name in self._module_dict: if name not in self._module_dict:
self._module_dict[name] = QAPISchemaModule(name) self._module_dict[name] = QAPISchemaModule(name)
return self._module_dict[name] return self._module_dict[name]
@ -1098,7 +1097,6 @@ class QAPISchema(object):
def visit(self, visitor): def visit(self, visitor):
visitor.visit_begin(self) visitor.visit_begin(self)
module = None
for mod in self._module_dict.values(): for mod in self._module_dict.values():
mod.visit(visitor) mod.visit(visitor)
visitor.visit_end() visitor.visit_end()

View file

@ -13,7 +13,7 @@ import copy
import sys import sys
class QAPISchemaPragma(object): class QAPISchemaPragma:
def __init__(self): def __init__(self):
# Are documentation comments required? # Are documentation comments required?
self.doc_required = False self.doc_required = False
@ -23,7 +23,7 @@ class QAPISchemaPragma(object):
self.name_case_whitelist = [] self.name_case_whitelist = []
class QAPISourceInfo(object): class QAPISourceInfo:
def __init__(self, fname, line, parent): def __init__(self, fname, line, parent):
self.fname = fname self.fname = fname
self.line = line self.line = line

View file

@ -241,8 +241,8 @@ void qapi_free_%(c_name)s(%(c_name)s *obj)
class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor): class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
def __init__(self, prefix): def __init__(self, prefix):
QAPISchemaModularCVisitor.__init__( super().__init__(
self, prefix, 'qapi-types', ' * Schema-defined QAPI types', prefix, 'qapi-types', ' * Schema-defined QAPI types',
' * Built-in QAPI types', __doc__) ' * Built-in QAPI types', __doc__)
def _begin_system_module(self, name): def _begin_system_module(self, name):

View file

@ -283,8 +283,8 @@ out:
class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor): class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
def __init__(self, prefix): def __init__(self, prefix):
QAPISchemaModularCVisitor.__init__( super().__init__(
self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors', prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
' * Built-in QAPI visitors', __doc__) ' * Built-in QAPI visitors', __doc__)
def _begin_system_module(self, name): def _begin_system_module(self, name):

View file

@ -16,15 +16,11 @@ import argparse
import difflib import difflib
import os import os
import sys import sys
from io import StringIO
from qapi.error import QAPIError from qapi.error import QAPIError
from qapi.schema import QAPISchema, QAPISchemaVisitor from qapi.schema import QAPISchema, QAPISchemaVisitor
if sys.version_info[0] < 3:
from cStringIO import StringIO
else:
from io import StringIO
class QAPISchemaTestVisitor(QAPISchemaVisitor): class QAPISchemaTestVisitor(QAPISchemaVisitor):