From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44303) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAOWv-0003SO-Vv for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:22:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAOWs-00067d-B8 for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:22:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46929) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAOWs-00066f-2E for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:22:46 -0400 From: Markus Armbruster Date: Wed, 1 Jul 2015 22:22:11 +0200 Message-Id: <1435782155-31412-24-git-send-email-armbru@redhat.com> In-Reply-To: <1435782155-31412-1-git-send-email-armbru@redhat.com> References: <1435782155-31412-1-git-send-email-armbru@redhat.com> Subject: [Qemu-devel] [PATCH RFC v2 23/47] qapi: New QAPISchemaVisitor List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, berto@igalia.com, mdroth@linux.vnet.ibm.com The visitor will help keeping the code generation code simple and reasonably separated from QAPISchema details. Signed-off-by: Markus Armbruster --- scripts/qapi.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/scripts/qapi.py b/scripts/qapi.py index b5fa1be..cac7ab5 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -767,6 +767,28 @@ class QAPISchemaEntity(object): return c_name(self.name) def check(self, schema): pass + def visit(self, visitor): + pass + +class QAPISchemaVisitor(object): + def visit_begin(self): + pass + def visit_end(self): + pass + def visit_builtin_type(self, name, info, json_type): + pass + def visit_enum_type(self, name, info, values): + pass + def visit_array_type(self, name, info, element_type): + pass + def visit_object_type(self, name, info, base, members, variants): + pass + def visit_alternate_type(self, name, info, variants): + pass + def visit_command(self, name, info, args, rets, gen, success_response): + pass + def visit_event(self, name, info, data): + pass class QAPISchemaType(QAPISchemaEntity): def c_type(self, is_param=False): @@ -804,6 +826,8 @@ class QAPISchemaBuiltinType(QAPISchemaType): return self.c_null_val def json_type(self): return self.json_type_name + def visit(self, visitor): + visitor.visit_builtin_type(self.name, self.info, self.json_type()) class QAPISchemaEnumType(QAPISchemaType): def __init__(self, name, info, values): @@ -817,6 +841,8 @@ class QAPISchemaEnumType(QAPISchemaType): return c_enum_const(self.name, self.values[0]) def json_type(self): return 'string' + def visit(self, visitor): + visitor.visit_enum_type(self.name, self.info, self.values) class QAPISchemaArrayType(QAPISchemaType): def __init__(self, name, info, element_type): @@ -827,6 +853,8 @@ class QAPISchemaArrayType(QAPISchemaType): def check(self, schema): self.element_type = schema.lookup_type(self.element_type_name) assert self.element_type + def visit(self, visitor): + visitor.visit_array_type(self.name, self.info, self.element_type) class QAPISchemaObjectType(QAPISchemaType): def __init__(self, name, info, base, local_members, variants): @@ -868,6 +896,9 @@ class QAPISchemaObjectType(QAPISchemaType): return QAPISchemaType.c_type(self) def json_type(self): return 'object' + def visit(self, visitor): + visitor.visit_object_type(self.name, self.info, + self.base, self.local_members, self.variants) class QAPISchemaObjectTypeMember(object): def __init__(self, name, typ, optional): @@ -931,6 +962,8 @@ class QAPISchemaAlternateType(QAPISchemaType): self.variants = variants def check(self, schema): self.variants.check(schema, [], {}) + def visit(self, visitor): + visitor.visit_alternate_type(self.name, self.info, self.variants) class QAPISchemaCommand(QAPISchemaEntity): def __init__(self, name, info, args, rets, gen, success_response): @@ -953,6 +986,9 @@ class QAPISchemaCommand(QAPISchemaEntity): self.rets = schema.lookup_type(self.rets_name) assert isinstance(self.rets, QAPISchemaType) self.rets.check(schema) + def visit(self, visitor): + visitor.visit_command(self.name, self.info, self.args, self.rets, + self.gen, self.success_response) class QAPISchemaEvent(QAPISchemaEntity): def __init__(self, name, info, data): @@ -965,6 +1001,8 @@ class QAPISchemaEvent(QAPISchemaEntity): self.data = schema.lookup_type(self.data_name) assert isinstance(self.data, QAPISchemaObjectType) self.data.check(schema) + def visit(self, visitor): + visitor.visit_event(self.name, self.info, self.data) class QAPISchema(object): def __init__(self, fname): @@ -1152,6 +1190,12 @@ class QAPISchema(object): for ent in self.entity_dict.values(): ent.check(self) + def visit(self, visitor): + visitor.visit_begin() + for name in sorted(self.entity_dict.keys()): + self.entity_dict[name].visit(visitor) + visitor.visit_end() + # # Code generation helpers # -- 1.9.3