]>
Commit | Line | Data |
---|---|---|
98626572 MA |
1 | # |
2 | # QAPI parser test harness | |
3 | # | |
4 | # Copyright (c) 2013 Red Hat Inc. | |
5 | # | |
6 | # Authors: | |
7 | # Markus Armbruster <armbru@redhat.com> | |
8 | # | |
9 | # This work is licensed under the terms of the GNU GPL, version 2 or later. | |
10 | # See the COPYING file in the top-level directory. | |
11 | # | |
12 | ||
ef9d9108 | 13 | from __future__ import print_function |
98626572 | 14 | import sys |
181feaf3 | 15 | from qapi.common import QAPIError, QAPISchema, QAPISchemaVisitor |
98626572 | 16 | |
156402e5 MA |
17 | |
18 | class QAPISchemaTestVisitor(QAPISchemaVisitor): | |
cf40a0a5 MA |
19 | |
20 | def visit_module(self, name): | |
21 | print('module %s' % name) | |
22 | ||
23 | def visit_include(self, name, info): | |
24 | print('include %s' % name) | |
25 | ||
1962bd39 | 26 | def visit_enum_type(self, name, info, ifcond, members, prefix): |
1e381b65 | 27 | print('enum %s' % name) |
156402e5 | 28 | if prefix: |
ef9d9108 | 29 | print(' prefix %s' % prefix) |
1e381b65 MAL |
30 | for m in members: |
31 | print(' member %s' % m.name) | |
6cc32b0e | 32 | self._print_if(m.ifcond, indent=8) |
fbf09a2f | 33 | self._print_if(ifcond) |
156402e5 | 34 | |
ca0ac758 MA |
35 | def visit_array_type(self, name, info, ifcond, element_type): |
36 | if not info: | |
37 | return # suppress built-in arrays | |
38 | print('array %s %s' % (name, element_type.name)) | |
39 | self._print_if(ifcond) | |
40 | ||
6a8c0b51 KW |
41 | def visit_object_type(self, name, info, ifcond, base, members, variants, |
42 | features): | |
ef9d9108 | 43 | print('object %s' % name) |
156402e5 | 44 | if base: |
ef9d9108 | 45 | print(' base %s' % base.name) |
156402e5 | 46 | for m in members: |
b736e25a MA |
47 | print(' member %s: %s optional=%s' |
48 | % (m.name, m.type.name, m.optional)) | |
ccadd6bc | 49 | self._print_if(m.ifcond, 8) |
156402e5 | 50 | self._print_variants(variants) |
fbf09a2f | 51 | self._print_if(ifcond) |
8aa3a33e KW |
52 | if features: |
53 | for f in features: | |
54 | print(' feature %s' % f.name) | |
55 | self._print_if(f.ifcond, 8) | |
156402e5 | 56 | |
fbf09a2f | 57 | def visit_alternate_type(self, name, info, ifcond, variants): |
ef9d9108 | 58 | print('alternate %s' % name) |
156402e5 | 59 | self._print_variants(variants) |
fbf09a2f | 60 | self._print_if(ifcond) |
156402e5 | 61 | |
fbf09a2f | 62 | def visit_command(self, name, info, ifcond, arg_type, ret_type, gen, |
d6fe3d02 | 63 | success_response, boxed, allow_oob, allow_preconfig): |
b736e25a MA |
64 | print('command %s %s -> %s' |
65 | % (name, arg_type and arg_type.name, | |
66 | ret_type and ret_type.name)) | |
67 | print(' gen=%s success_response=%s boxed=%s oob=%s preconfig=%s' | |
68 | % (gen, success_response, boxed, allow_oob, allow_preconfig)) | |
fbf09a2f | 69 | self._print_if(ifcond) |
156402e5 | 70 | |
fbf09a2f | 71 | def visit_event(self, name, info, ifcond, arg_type, boxed): |
ef9d9108 DB |
72 | print('event %s %s' % (name, arg_type and arg_type.name)) |
73 | print(' boxed=%s' % boxed) | |
fbf09a2f | 74 | self._print_if(ifcond) |
156402e5 MA |
75 | |
76 | @staticmethod | |
77 | def _print_variants(variants): | |
78 | if variants: | |
ef9d9108 | 79 | print(' tag %s' % variants.tag_member.name) |
156402e5 | 80 | for v in variants.variants: |
ef9d9108 | 81 | print(' case %s: %s' % (v.name, v.type.name)) |
a2724280 | 82 | QAPISchemaTestVisitor._print_if(v.ifcond, indent=8) |
156402e5 | 83 | |
fbf09a2f MAL |
84 | @staticmethod |
85 | def _print_if(ifcond, indent=4): | |
86 | if ifcond: | |
87 | print('%sif %s' % (' ' * indent, ifcond)) | |
88 | ||
181feaf3 MA |
89 | |
90 | try: | |
91 | schema = QAPISchema(sys.argv[1]) | |
92 | except QAPIError as err: | |
93 | print(err, file=sys.stderr) | |
94 | exit(1) | |
95 | ||
156402e5 | 96 | schema.visit(QAPISchemaTestVisitor()) |
818c3318 MA |
97 | |
98 | for doc in schema.docs: | |
99 | if doc.symbol: | |
ef9d9108 | 100 | print('doc symbol=%s' % doc.symbol) |
818c3318 | 101 | else: |
ef9d9108 DB |
102 | print('doc freeform') |
103 | print(' body=\n%s' % doc.body.text) | |
2f848044 | 104 | for arg, section in doc.args.items(): |
ef9d9108 | 105 | print(' arg=%s\n%s' % (arg, section.text)) |
818c3318 | 106 | for section in doc.sections: |
ef9d9108 | 107 | print(' section=%s\n%s' % (section.name, section.text)) |