diff mbox series

[v2,2/2] qapi: Rename .json to .qapi

Message ID 20180419223151.623174-3-eblake@redhat.com
State New
Headers show
Series QAPI file renames | expand

Commit Message

Eric Blake April 19, 2018, 10:31 p.m. UTC
Our QAPI input files aren't quite true JSON (comments being one obvious
difference); naming things .json doesn't make that obvious.  Use a new
suffix .qapi that makes it easy to identify our files.

This change is mostly mechanical, but it is not just a global
search-and-replace as some instances of '.json' really do refer
to JSON files, or to a URL that can't change, and so on.

Signed-off-by: Eric Blake <eblake@redhat.com>

---
v2: rebase to master
---
 docs/devel/blkdebug.txt                            |   2 +-
 docs/devel/qapi-code-gen.txt                       |   6 +-
 docs/devel/testing.rst                             |   4 +-
 docs/devel/writing-qmp-commands.txt                |   4 +-
 docs/interop/live-block-operations.rst             |   4 +-
 docs/interop/qmp-intro.txt                         |   2 +-
 Makefile                                           |  32 +-
 qapi/{block-core.json => block-core.qapi}          |   6 +-
 qapi/{block.json => block.qapi}                    |   2 +-
 qapi/{char.json => char.qapi}                      |   2 +-
 qapi/{common.json => common.qapi}                  |   0
 qapi/{crypto.json => crypto.qapi}                  |   0
 qapi/{introspect.json => introspect.qapi}          |   0
 qapi/{migration.json => migration.qapi}            |   2 +-
 qapi/{misc.json => misc.qapi}                      |   0
 qapi/{net.json => net.qapi}                        |   2 +-
 qapi/{qga-schema.json => qga-schema.qapi}          |   0
 qapi/{qmp-schema.json => qmp-schema.qapi}          |  30 +-
 qapi/{rocker.json => rocker.qapi}                  |   0
 qapi/{run-state.json => run-state.qapi}            |   0
 qapi/{sockets.json => sockets.qapi}                |   2 +-
 qapi/{tpm.json => tpm.qapi}                        |   0
 qapi/{trace.json => trace.qapi}                    |   0
 qapi/{transaction.json => transaction.qapi}        |   2 +-
 qapi/{ui.json => ui.qapi}                          |   2 +-
 include/crypto/block.h                             |   2 +-
 include/crypto/cipher.h                            |   2 +-
 include/crypto/hash.h                              |   2 +-
 include/crypto/ivgen.h                             |   2 +-
 MAINTAINERS                                        |  26 +-
 scripts/git.orderfile                              |   2 +-
 tests/Makefile.include                             | 336 ++++++++++-----------
 tests/qapi-schema/alternate-any.err                |   2 +-
 .../{alternate-any.json => alternate-any.qapi}     |   0
 tests/qapi-schema/alternate-array.err              |   2 +-
 .../{alternate-array.json => alternate-array.qapi} |   0
 tests/qapi-schema/alternate-base.err               |   2 +-
 .../{alternate-base.json => alternate-base.qapi}   |   0
 tests/qapi-schema/alternate-clash.err              |   2 +-
 .../{alternate-clash.json => alternate-clash.qapi} |   0
 .../qapi-schema/alternate-conflict-bool-string.err |   2 +-
 ...ng.json => alternate-conflict-bool-string.qapi} |   0
 tests/qapi-schema/alternate-conflict-dict.err      |   2 +-
 ...lict-dict.json => alternate-conflict-dict.qapi} |   0
 tests/qapi-schema/alternate-conflict-enum-bool.err |   2 +-
 ...bool.json => alternate-conflict-enum-bool.qapi} |   0
 tests/qapi-schema/alternate-conflict-enum-int.err  |   2 +-
 ...m-int.json => alternate-conflict-enum-int.qapi} |   0
 .../qapi-schema/alternate-conflict-num-string.err  |   2 +-
 ...ing.json => alternate-conflict-num-string.qapi} |   0
 tests/qapi-schema/alternate-conflict-string.err    |   2 +-
 ...-string.json => alternate-conflict-string.qapi} |   0
 tests/qapi-schema/alternate-empty.err              |   2 +-
 .../{alternate-empty.json => alternate-empty.qapi} |   0
 tests/qapi-schema/alternate-nested.err             |   2 +-
 ...alternate-nested.json => alternate-nested.qapi} |   0
 tests/qapi-schema/alternate-unknown.err            |   2 +-
 ...ternate-unknown.json => alternate-unknown.qapi} |   0
 tests/qapi-schema/args-alternate.err               |   2 +-
 .../{args-alternate.json => args-alternate.qapi}   |   0
 tests/qapi-schema/args-any.err                     |   2 +-
 tests/qapi-schema/{args-any.json => args-any.qapi} |   0
 tests/qapi-schema/args-array-empty.err             |   2 +-
 ...args-array-empty.json => args-array-empty.qapi} |   0
 tests/qapi-schema/args-array-unknown.err           |   2 +-
 ...-array-unknown.json => args-array-unknown.qapi} |   0
 tests/qapi-schema/args-bad-boxed.err               |   2 +-
 .../{args-bad-boxed.json => args-bad-boxed.qapi}   |   0
 tests/qapi-schema/args-boxed-anon.err              |   2 +-
 .../{args-boxed-anon.json => args-boxed-anon.qapi} |   0
 tests/qapi-schema/args-boxed-empty.err             |   2 +-
 ...args-boxed-empty.json => args-boxed-empty.qapi} |   0
 tests/qapi-schema/args-boxed-string.err            |   2 +-
 ...gs-boxed-string.json => args-boxed-string.qapi} |   0
 tests/qapi-schema/args-int.err                     |   2 +-
 tests/qapi-schema/{args-int.json => args-int.qapi} |   0
 tests/qapi-schema/args-invalid.err                 |   2 +-
 .../{args-invalid.json => args-invalid.qapi}       |   0
 tests/qapi-schema/args-member-array-bad.err        |   2 +-
 ...r-array-bad.json => args-member-array-bad.qapi} |   0
 tests/qapi-schema/args-member-case.err             |   2 +-
 ...args-member-case.json => args-member-case.qapi} |   0
 tests/qapi-schema/args-member-unknown.err          |   2 +-
 ...ember-unknown.json => args-member-unknown.qapi} |   0
 tests/qapi-schema/args-name-clash.err              |   2 +-
 .../{args-name-clash.json => args-name-clash.qapi} |   0
 tests/qapi-schema/args-union.err                   |   2 +-
 .../{args-union.json => args-union.qapi}           |   0
 tests/qapi-schema/args-unknown.err                 |   2 +-
 .../{args-unknown.json => args-unknown.qapi}       |   0
 tests/qapi-schema/bad-base.err                     |   2 +-
 tests/qapi-schema/{bad-base.json => bad-base.qapi} |   0
 tests/qapi-schema/bad-data.err                     |   2 +-
 tests/qapi-schema/{bad-data.json => bad-data.qapi} |   0
 tests/qapi-schema/bad-ident.err                    |   2 +-
 .../qapi-schema/{bad-ident.json => bad-ident.qapi} |   0
 tests/qapi-schema/bad-type-bool.err                |   2 +-
 .../{bad-type-bool.json => bad-type-bool.qapi}     |   0
 tests/qapi-schema/bad-type-dict.err                |   2 +-
 .../{bad-type-dict.json => bad-type-dict.qapi}     |   0
 tests/qapi-schema/bad-type-int.err                 |   2 +-
 .../{bad-type-int.json => bad-type-int.qapi}       |   0
 tests/qapi-schema/base-cycle-direct.err            |   2 +-
 ...se-cycle-direct.json => base-cycle-direct.qapi} |   0
 tests/qapi-schema/base-cycle-indirect.err          |   2 +-
 ...ycle-indirect.json => base-cycle-indirect.qapi} |   0
 tests/qapi-schema/command-int.err                  |   2 +-
 .../{command-int.json => command-int.qapi}         |   0
 tests/qapi-schema/comments.out                     |   2 +-
 tests/qapi-schema/{comments.json => comments.qapi} |   0
 tests/qapi-schema/doc-bad-alternate-member.err     |   2 +-
 ...e-member.json => doc-bad-alternate-member.qapi} |   0
 tests/qapi-schema/doc-bad-command-arg.err          |   2 +-
 ...d-command-arg.json => doc-bad-command-arg.qapi} |   0
 tests/qapi-schema/doc-bad-section.out              |   2 +-
 .../{doc-bad-section.json => doc-bad-section.qapi} |   0
 tests/qapi-schema/doc-bad-symbol.err               |   2 +-
 .../{doc-bad-symbol.json => doc-bad-symbol.qapi}   |   0
 tests/qapi-schema/doc-bad-union-member.err         |   2 +-
 ...union-member.json => doc-bad-union-member.qapi} |   0
 tests/qapi-schema/doc-before-include.err           |   2 +-
 ...before-include.json => doc-before-include.qapi} |   2 +-
 tests/qapi-schema/doc-before-pragma.err            |   2 +-
 ...c-before-pragma.json => doc-before-pragma.qapi} |   0
 tests/qapi-schema/doc-duplicated-arg.err           |   2 +-
 ...duplicated-arg.json => doc-duplicated-arg.qapi} |   0
 tests/qapi-schema/doc-duplicated-return.err        |   2 +-
 ...ated-return.json => doc-duplicated-return.qapi} |   0
 tests/qapi-schema/doc-duplicated-since.err         |   2 +-
 ...icated-since.json => doc-duplicated-since.qapi} |   0
 tests/qapi-schema/doc-empty-arg.err                |   2 +-
 .../{doc-empty-arg.json => doc-empty-arg.qapi}     |   0
 tests/qapi-schema/doc-empty-section.err            |   2 +-
 ...c-empty-section.json => doc-empty-section.qapi} |   0
 tests/qapi-schema/doc-empty-symbol.err             |   2 +-
 ...doc-empty-symbol.json => doc-empty-symbol.qapi} |   0
 tests/qapi-schema/doc-good.out                     |   2 +-
 tests/qapi-schema/{doc-good.json => doc-good.qapi} |   0
 tests/qapi-schema/doc-interleaved-section.err      |   2 +-
 ...d-section.json => doc-interleaved-section.qapi} |   0
 tests/qapi-schema/doc-invalid-end.err              |   2 +-
 .../{doc-invalid-end.json => doc-invalid-end.qapi} |   0
 tests/qapi-schema/doc-invalid-end2.err             |   2 +-
 ...doc-invalid-end2.json => doc-invalid-end2.qapi} |   0
 tests/qapi-schema/doc-invalid-return.err           |   2 +-
 ...invalid-return.json => doc-invalid-return.qapi} |   0
 tests/qapi-schema/doc-invalid-section.err          |   2 +-
 ...valid-section.json => doc-invalid-section.qapi} |   0
 tests/qapi-schema/doc-invalid-start.err            |   2 +-
 ...c-invalid-start.json => doc-invalid-start.qapi} |   0
 tests/qapi-schema/doc-missing-colon.err            |   2 +-
 ...c-missing-colon.json => doc-missing-colon.qapi} |   0
 tests/qapi-schema/doc-missing-expr.err             |   2 +-
 ...doc-missing-expr.json => doc-missing-expr.qapi} |   0
 tests/qapi-schema/doc-missing-space.err            |   2 +-
 ...c-missing-space.json => doc-missing-space.qapi} |   0
 tests/qapi-schema/doc-missing.err                  |   2 +-
 .../{doc-missing.json => doc-missing.qapi}         |   0
 tests/qapi-schema/doc-no-symbol.err                |   2 +-
 .../{doc-no-symbol.json => doc-no-symbol.qapi}     |   0
 tests/qapi-schema/double-data.err                  |   2 +-
 .../{double-data.json => double-data.qapi}         |   0
 tests/qapi-schema/double-type.err                  |   2 +-
 .../{double-type.json => double-type.qapi}         |   0
 tests/qapi-schema/duplicate-key.err                |   2 +-
 .../{duplicate-key.json => duplicate-key.qapi}     |   0
 tests/qapi-schema/{empty.json => empty.qapi}       |   0
 tests/qapi-schema/enum-bad-name.err                |   2 +-
 .../{enum-bad-name.json => enum-bad-name.qapi}     |   0
 tests/qapi-schema/enum-bad-prefix.err              |   2 +-
 .../{enum-bad-prefix.json => enum-bad-prefix.qapi} |   0
 tests/qapi-schema/enum-clash-member.err            |   2 +-
 ...um-clash-member.json => enum-clash-member.qapi} |   0
 tests/qapi-schema/enum-dict-member.err             |   2 +-
 ...enum-dict-member.json => enum-dict-member.qapi} |   0
 tests/qapi-schema/enum-int-member.err              |   2 +-
 .../{enum-int-member.json => enum-int-member.qapi} |   0
 tests/qapi-schema/enum-member-case.err             |   2 +-
 ...enum-member-case.json => enum-member-case.qapi} |   0
 tests/qapi-schema/enum-missing-data.err            |   2 +-
 ...um-missing-data.json => enum-missing-data.qapi} |   0
 tests/qapi-schema/enum-wrong-data.err              |   2 +-
 .../{enum-wrong-data.json => enum-wrong-data.qapi} |   0
 tests/qapi-schema/escape-outside-string.err        |   2 +-
 ...side-string.json => escape-outside-string.qapi} |   0
 tests/qapi-schema/escape-too-big.err               |   2 +-
 .../{escape-too-big.json => escape-too-big.qapi}   |   0
 tests/qapi-schema/escape-too-short.err             |   2 +-
 ...escape-too-short.json => escape-too-short.qapi} |   0
 tests/qapi-schema/event-boxed-empty.err            |   2 +-
 ...ent-boxed-empty.json => event-boxed-empty.qapi} |   0
 tests/qapi-schema/event-case.out                   |   2 +-
 .../{event-case.json => event-case.qapi}           |   0
 tests/qapi-schema/event-nest-struct.err            |   2 +-
 ...ent-nest-struct.json => event-nest-struct.qapi} |   0
 tests/qapi-schema/flat-union-array-branch.err      |   2 +-
 ...ay-branch.json => flat-union-array-branch.qapi} |   0
 tests/qapi-schema/flat-union-bad-base.err          |   2 +-
 ...nion-bad-base.json => flat-union-bad-base.qapi} |   0
 tests/qapi-schema/flat-union-bad-discriminator.err |   2 +-
 ...ator.json => flat-union-bad-discriminator.qapi} |   0
 tests/qapi-schema/flat-union-base-any.err          |   2 +-
 ...nion-base-any.json => flat-union-base-any.qapi} |   0
 tests/qapi-schema/flat-union-base-union.err        |   2 +-
 ...-base-union.json => flat-union-base-union.qapi} |   0
 tests/qapi-schema/flat-union-clash-member.err      |   2 +-
 ...sh-member.json => flat-union-clash-member.qapi} |   0
 tests/qapi-schema/flat-union-empty.err             |   2 +-
 ...flat-union-empty.json => flat-union-empty.qapi} |   0
 tests/qapi-schema/flat-union-incomplete-branch.err |   2 +-
 ...anch.json => flat-union-incomplete-branch.qapi} |   0
 tests/qapi-schema/flat-union-inline.err            |   2 +-
 ...at-union-inline.json => flat-union-inline.qapi} |   0
 tests/qapi-schema/flat-union-int-branch.err        |   2 +-
 ...-int-branch.json => flat-union-int-branch.qapi} |   0
 .../qapi-schema/flat-union-invalid-branch-key.err  |   2 +-
 ...key.json => flat-union-invalid-branch-key.qapi} |   0
 .../flat-union-invalid-discriminator.err           |   2 +-
 ....json => flat-union-invalid-discriminator.qapi} |   0
 tests/qapi-schema/flat-union-no-base.err           |   2 +-
 ...-union-no-base.json => flat-union-no-base.qapi} |   0
 .../flat-union-optional-discriminator.err          |   2 +-
 ...json => flat-union-optional-discriminator.qapi} |   0
 .../flat-union-string-discriminator.err            |   2 +-
 ...r.json => flat-union-string-discriminator.qapi} |   0
 tests/qapi-schema/funny-char.err                   |   2 +-
 .../{funny-char.json => funny-char.qapi}           |   0
 tests/qapi-schema/ident-with-escape.out            |   2 +-
 ...ent-with-escape.json => ident-with-escape.qapi} |   0
 tests/qapi-schema/include-before-err.err           |   2 +-
 tests/qapi-schema/include-before-err.json          |   2 -
 tests/qapi-schema/include-before-err.qapi          |   2 +
 tests/qapi-schema/include-cycle-b.json             |   1 -
 tests/qapi-schema/include-cycle-b.qapi             |   1 +
 tests/qapi-schema/include-cycle-c.json             |   1 -
 tests/qapi-schema/include-cycle-c.qapi             |   1 +
 tests/qapi-schema/include-cycle.err                |   6 +-
 tests/qapi-schema/include-cycle.json               |   1 -
 tests/qapi-schema/include-cycle.qapi               |   1 +
 tests/qapi-schema/include-extra-junk.err           |   2 +-
 tests/qapi-schema/include-extra-junk.json          |   3 -
 tests/qapi-schema/include-extra-junk.qapi          |   3 +
 tests/qapi-schema/include-format-err.err           |   2 +-
 tests/qapi-schema/include-format-err.json          |   2 -
 tests/qapi-schema/include-format-err.qapi          |   2 +
 tests/qapi-schema/include-nested-err.err           |   4 +-
 tests/qapi-schema/include-nested-err.json          |   1 -
 tests/qapi-schema/include-nested-err.qapi          |   1 +
 tests/qapi-schema/include-no-file.err              |   2 +-
 tests/qapi-schema/include-no-file.json             |   1 -
 tests/qapi-schema/include-no-file.qapi             |   1 +
 tests/qapi-schema/include-non-file.err             |   2 +-
 ...include-non-file.json => include-non-file.qapi} |   0
 ...e-relpath-sub.json => include-relpath-sub.qapi} |   0
 tests/qapi-schema/include-relpath.json             |   1 -
 tests/qapi-schema/include-relpath.out              |  10 +-
 tests/qapi-schema/include-relpath.qapi             |   1 +
 tests/qapi-schema/include-repetition-sub.json      |   2 -
 tests/qapi-schema/include-repetition-sub.qapi      |   2 +
 tests/qapi-schema/include-repetition.json          |   3 -
 tests/qapi-schema/include-repetition.out           |  20 +-
 tests/qapi-schema/include-repetition.qapi          |   3 +
 tests/qapi-schema/include-self-cycle.err           |   2 +-
 tests/qapi-schema/include-self-cycle.json          |   1 -
 tests/qapi-schema/include-self-cycle.qapi          |   1 +
 ...ude-simple-sub.json => include-simple-sub.qapi} |   0
 tests/qapi-schema/include-simple.json              |   1 -
 tests/qapi-schema/include-simple.out               |   6 +-
 tests/qapi-schema/include-simple.qapi              |   1 +
 tests/qapi-schema/include/relpath.json             |   1 -
 tests/qapi-schema/include/relpath.qapi             |   1 +
 tests/qapi-schema/indented-expr.out                |   2 +-
 .../{indented-expr.json => indented-expr.qapi}     |   0
 tests/qapi-schema/leading-comma-list.err           |   2 +-
 ...ing-comma-list.json => leading-comma-list.qapi} |   0
 tests/qapi-schema/leading-comma-object.err         |   2 +-
 ...comma-object.json => leading-comma-object.qapi} |   0
 tests/qapi-schema/missing-colon.err                |   2 +-
 .../{missing-colon.json => missing-colon.qapi}     |   0
 tests/qapi-schema/missing-comma-list.err           |   2 +-
 ...ing-comma-list.json => missing-comma-list.qapi} |   0
 tests/qapi-schema/missing-comma-object.err         |   2 +-
 ...comma-object.json => missing-comma-object.qapi} |   0
 tests/qapi-schema/missing-type.err                 |   2 +-
 .../{missing-type.json => missing-type.qapi}       |   0
 tests/qapi-schema/nested-struct-data.err           |   2 +-
 ...ed-struct-data.json => nested-struct-data.qapi} |   0
 tests/qapi-schema/non-objects.err                  |   2 +-
 .../{non-objects.json => non-objects.qapi}         |   0
 tests/qapi-schema/oob-test.err                     |   2 +-
 tests/qapi-schema/{oob-test.json => oob-test.qapi} |   0
 tests/qapi-schema/pragma-doc-required-crap.err     |   2 +-
 ...red-crap.json => pragma-doc-required-crap.qapi} |   0
 tests/qapi-schema/pragma-extra-junk.err            |   2 +-
 ...agma-extra-junk.json => pragma-extra-junk.qapi} |   0
 .../pragma-name-case-whitelist-crap.err            |   2 +-
 ...p.json => pragma-name-case-whitelist-crap.qapi} |   0
 tests/qapi-schema/pragma-non-dict.err              |   2 +-
 .../{pragma-non-dict.json => pragma-non-dict.qapi} |   0
 .../qapi-schema/pragma-returns-whitelist-crap.err  |   2 +-
 ...rap.json => pragma-returns-whitelist-crap.qapi} |   0
 tests/qapi-schema/qapi-schema-test.out             |   2 +-
 ...qapi-schema-test.json => qapi-schema-test.qapi} |   0
 tests/qapi-schema/quoted-structural-chars.err      |   2 +-
 ...ral-chars.json => quoted-structural-chars.qapi} |   0
 tests/qapi-schema/redefined-builtin.err            |   2 +-
 ...defined-builtin.json => redefined-builtin.qapi} |   0
 tests/qapi-schema/redefined-command.err            |   2 +-
 ...defined-command.json => redefined-command.qapi} |   0
 tests/qapi-schema/redefined-event.err              |   2 +-
 .../{redefined-event.json => redefined-event.qapi} |   0
 tests/qapi-schema/redefined-type.err               |   2 +-
 .../{redefined-type.json => redefined-type.qapi}   |   0
 tests/qapi-schema/reserved-command-q.err           |   2 +-
 ...rved-command-q.json => reserved-command-q.qapi} |   0
 tests/qapi-schema/reserved-enum-q.err              |   2 +-
 .../{reserved-enum-q.json => reserved-enum-q.qapi} |   0
 tests/qapi-schema/reserved-member-has.err          |   2 +-
 ...ed-member-has.json => reserved-member-has.qapi} |   0
 tests/qapi-schema/reserved-member-q.err            |   2 +-
 ...served-member-q.json => reserved-member-q.qapi} |   0
 tests/qapi-schema/reserved-member-u.err            |   2 +-
 ...served-member-u.json => reserved-member-u.qapi} |   0
 tests/qapi-schema/reserved-member-underscore.err   |   2 +-
 ...rscore.json => reserved-member-underscore.qapi} |   0
 tests/qapi-schema/reserved-type-kind.err           |   2 +-
 ...rved-type-kind.json => reserved-type-kind.qapi} |   0
 tests/qapi-schema/reserved-type-list.err           |   2 +-
 ...rved-type-list.json => reserved-type-list.qapi} |   0
 tests/qapi-schema/returns-alternate.err            |   2 +-
 ...turns-alternate.json => returns-alternate.qapi} |   0
 tests/qapi-schema/returns-array-bad.err            |   2 +-
 ...turns-array-bad.json => returns-array-bad.qapi} |   0
 tests/qapi-schema/returns-dict.err                 |   2 +-
 .../{returns-dict.json => returns-dict.qapi}       |   0
 tests/qapi-schema/returns-unknown.err              |   2 +-
 .../{returns-unknown.json => returns-unknown.qapi} |   0
 tests/qapi-schema/returns-whitelist.err            |   2 +-
 ...turns-whitelist.json => returns-whitelist.qapi} |   0
 tests/qapi-schema/struct-base-clash-deep.err       |   2 +-
 ...clash-deep.json => struct-base-clash-deep.qapi} |   0
 tests/qapi-schema/struct-base-clash.err            |   2 +-
 ...ruct-base-clash.json => struct-base-clash.qapi} |   0
 tests/qapi-schema/struct-data-invalid.err          |   2 +-
 ...-data-invalid.json => struct-data-invalid.qapi} |   0
 tests/qapi-schema/struct-member-invalid.err        |   2 +-
 ...ber-invalid.json => struct-member-invalid.qapi} |   0
 tests/qapi-schema/trailing-comma-list.err          |   2 +-
 ...ng-comma-list.json => trailing-comma-list.qapi} |   0
 tests/qapi-schema/trailing-comma-object.err        |   2 +-
 ...omma-object.json => trailing-comma-object.qapi} |   0
 tests/qapi-schema/type-bypass-bad-gen.err          |   2 +-
 ...ypass-bad-gen.json => type-bypass-bad-gen.qapi} |   0
 tests/qapi-schema/unclosed-list.err                |   2 +-
 .../{unclosed-list.json => unclosed-list.qapi}     |   0
 tests/qapi-schema/unclosed-object.err              |   2 +-
 .../{unclosed-object.json => unclosed-object.qapi} |   0
 tests/qapi-schema/unclosed-string.err              |   2 +-
 .../{unclosed-string.json => unclosed-string.qapi} |   0
 tests/qapi-schema/unicode-str.err                  |   2 +-
 .../{unicode-str.json => unicode-str.qapi}         |   0
 tests/qapi-schema/union-base-empty.err             |   2 +-
 ...union-base-empty.json => union-base-empty.qapi} |   0
 tests/qapi-schema/union-base-no-discriminator.err  |   2 +-
 ...nator.json => union-base-no-discriminator.qapi} |   0
 tests/qapi-schema/union-branch-case.err            |   2 +-
 ...ion-branch-case.json => union-branch-case.qapi} |   0
 tests/qapi-schema/union-clash-branches.err         |   2 +-
 ...ash-branches.json => union-clash-branches.qapi} |   0
 tests/qapi-schema/union-empty.err                  |   2 +-
 .../{union-empty.json => union-empty.qapi}         |   0
 tests/qapi-schema/union-invalid-base.err           |   2 +-
 ...n-invalid-base.json => union-invalid-base.qapi} |   0
 tests/qapi-schema/union-optional-branch.err        |   2 +-
 ...onal-branch.json => union-optional-branch.qapi} |   0
 tests/qapi-schema/union-unknown.err                |   2 +-
 .../{union-unknown.json => union-unknown.qapi}     |   0
 tests/qapi-schema/unknown-escape.err               |   2 +-
 .../{unknown-escape.json => unknown-escape.qapi}   |   0
 tests/qapi-schema/unknown-expr-key.err             |   2 +-
 ...unknown-expr-key.json => unknown-expr-key.qapi} |   0
 381 files changed, 442 insertions(+), 442 deletions(-)
 rename qapi/{block-core.json => block-core.qapi} (99%)
 rename qapi/{block.json => block.qapi} (99%)
 rename qapi/{char.json => char.qapi} (99%)
 rename qapi/{common.json => common.qapi} (100%)
 rename qapi/{crypto.json => crypto.qapi} (100%)
 rename qapi/{introspect.json => introspect.qapi} (100%)
 rename qapi/{migration.json => migration.qapi} (99%)
 rename qapi/{misc.json => misc.qapi} (100%)
 rename qapi/{net.json => net.qapi} (99%)
 rename qapi/{qga-schema.json => qga-schema.qapi} (100%)
 rename qapi/{qmp-schema.json => qmp-schema.qapi} (88%)
 rename qapi/{rocker.json => rocker.qapi} (100%)
 rename qapi/{run-state.json => run-state.qapi} (100%)
 rename qapi/{sockets.json => sockets.qapi} (99%)
 rename qapi/{tpm.json => tpm.qapi} (100%)
 rename qapi/{trace.json => trace.qapi} (100%)
 rename qapi/{transaction.json => transaction.qapi} (99%)
 rename qapi/{ui.json => ui.qapi} (99%)
 rename tests/qapi-schema/{alternate-any.json => alternate-any.qapi} (100%)
 rename tests/qapi-schema/{alternate-array.json => alternate-array.qapi} (100%)
 rename tests/qapi-schema/{alternate-base.json => alternate-base.qapi} (100%)
 rename tests/qapi-schema/{alternate-clash.json => alternate-clash.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-bool-string.json => alternate-conflict-bool-string.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-dict.json => alternate-conflict-dict.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-enum-bool.json => alternate-conflict-enum-bool.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-enum-int.json => alternate-conflict-enum-int.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-num-string.json => alternate-conflict-num-string.qapi} (100%)
 rename tests/qapi-schema/{alternate-conflict-string.json => alternate-conflict-string.qapi} (100%)
 rename tests/qapi-schema/{alternate-empty.json => alternate-empty.qapi} (100%)
 rename tests/qapi-schema/{alternate-nested.json => alternate-nested.qapi} (100%)
 rename tests/qapi-schema/{alternate-unknown.json => alternate-unknown.qapi} (100%)
 rename tests/qapi-schema/{args-alternate.json => args-alternate.qapi} (100%)
 rename tests/qapi-schema/{args-any.json => args-any.qapi} (100%)
 rename tests/qapi-schema/{args-array-empty.json => args-array-empty.qapi} (100%)
 rename tests/qapi-schema/{args-array-unknown.json => args-array-unknown.qapi} (100%)
 rename tests/qapi-schema/{args-bad-boxed.json => args-bad-boxed.qapi} (100%)
 rename tests/qapi-schema/{args-boxed-anon.json => args-boxed-anon.qapi} (100%)
 rename tests/qapi-schema/{args-boxed-empty.json => args-boxed-empty.qapi} (100%)
 rename tests/qapi-schema/{args-boxed-string.json => args-boxed-string.qapi} (100%)
 rename tests/qapi-schema/{args-int.json => args-int.qapi} (100%)
 rename tests/qapi-schema/{args-invalid.json => args-invalid.qapi} (100%)
 rename tests/qapi-schema/{args-member-array-bad.json => args-member-array-bad.qapi} (100%)
 rename tests/qapi-schema/{args-member-case.json => args-member-case.qapi} (100%)
 rename tests/qapi-schema/{args-member-unknown.json => args-member-unknown.qapi} (100%)
 rename tests/qapi-schema/{args-name-clash.json => args-name-clash.qapi} (100%)
 rename tests/qapi-schema/{args-union.json => args-union.qapi} (100%)
 rename tests/qapi-schema/{args-unknown.json => args-unknown.qapi} (100%)
 rename tests/qapi-schema/{bad-base.json => bad-base.qapi} (100%)
 rename tests/qapi-schema/{bad-data.json => bad-data.qapi} (100%)
 rename tests/qapi-schema/{bad-ident.json => bad-ident.qapi} (100%)
 rename tests/qapi-schema/{bad-type-bool.json => bad-type-bool.qapi} (100%)
 rename tests/qapi-schema/{bad-type-dict.json => bad-type-dict.qapi} (100%)
 rename tests/qapi-schema/{bad-type-int.json => bad-type-int.qapi} (100%)
 rename tests/qapi-schema/{base-cycle-direct.json => base-cycle-direct.qapi} (100%)
 rename tests/qapi-schema/{base-cycle-indirect.json => base-cycle-indirect.qapi} (100%)
 rename tests/qapi-schema/{command-int.json => command-int.qapi} (100%)
 rename tests/qapi-schema/{comments.json => comments.qapi} (100%)
 rename tests/qapi-schema/{doc-bad-alternate-member.json => doc-bad-alternate-member.qapi} (100%)
 rename tests/qapi-schema/{doc-bad-command-arg.json => doc-bad-command-arg.qapi} (100%)
 rename tests/qapi-schema/{doc-bad-section.json => doc-bad-section.qapi} (100%)
 rename tests/qapi-schema/{doc-bad-symbol.json => doc-bad-symbol.qapi} (100%)
 rename tests/qapi-schema/{doc-bad-union-member.json => doc-bad-union-member.qapi} (100%)
 rename tests/qapi-schema/{doc-before-include.json => doc-before-include.qapi} (81%)
 rename tests/qapi-schema/{doc-before-pragma.json => doc-before-pragma.qapi} (100%)
 rename tests/qapi-schema/{doc-duplicated-arg.json => doc-duplicated-arg.qapi} (100%)
 rename tests/qapi-schema/{doc-duplicated-return.json => doc-duplicated-return.qapi} (100%)
 rename tests/qapi-schema/{doc-duplicated-since.json => doc-duplicated-since.qapi} (100%)
 rename tests/qapi-schema/{doc-empty-arg.json => doc-empty-arg.qapi} (100%)
 rename tests/qapi-schema/{doc-empty-section.json => doc-empty-section.qapi} (100%)
 rename tests/qapi-schema/{doc-empty-symbol.json => doc-empty-symbol.qapi} (100%)
 rename tests/qapi-schema/{doc-good.json => doc-good.qapi} (100%)
 rename tests/qapi-schema/{doc-interleaved-section.json => doc-interleaved-section.qapi} (100%)
 rename tests/qapi-schema/{doc-invalid-end.json => doc-invalid-end.qapi} (100%)
 rename tests/qapi-schema/{doc-invalid-end2.json => doc-invalid-end2.qapi} (100%)
 rename tests/qapi-schema/{doc-invalid-return.json => doc-invalid-return.qapi} (100%)
 rename tests/qapi-schema/{doc-invalid-section.json => doc-invalid-section.qapi} (100%)
 rename tests/qapi-schema/{doc-invalid-start.json => doc-invalid-start.qapi} (100%)
 rename tests/qapi-schema/{doc-missing-colon.json => doc-missing-colon.qapi} (100%)
 rename tests/qapi-schema/{doc-missing-expr.json => doc-missing-expr.qapi} (100%)
 rename tests/qapi-schema/{doc-missing-space.json => doc-missing-space.qapi} (100%)
 rename tests/qapi-schema/{doc-missing.json => doc-missing.qapi} (100%)
 rename tests/qapi-schema/{doc-no-symbol.json => doc-no-symbol.qapi} (100%)
 rename tests/qapi-schema/{double-data.json => double-data.qapi} (100%)
 rename tests/qapi-schema/{double-type.json => double-type.qapi} (100%)
 rename tests/qapi-schema/{duplicate-key.json => duplicate-key.qapi} (100%)
 rename tests/qapi-schema/{empty.json => empty.qapi} (100%)
 rename tests/qapi-schema/{enum-bad-name.json => enum-bad-name.qapi} (100%)
 rename tests/qapi-schema/{enum-bad-prefix.json => enum-bad-prefix.qapi} (100%)
 rename tests/qapi-schema/{enum-clash-member.json => enum-clash-member.qapi} (100%)
 rename tests/qapi-schema/{enum-dict-member.json => enum-dict-member.qapi} (100%)
 rename tests/qapi-schema/{enum-int-member.json => enum-int-member.qapi} (100%)
 rename tests/qapi-schema/{enum-member-case.json => enum-member-case.qapi} (100%)
 rename tests/qapi-schema/{enum-missing-data.json => enum-missing-data.qapi} (100%)
 rename tests/qapi-schema/{enum-wrong-data.json => enum-wrong-data.qapi} (100%)
 rename tests/qapi-schema/{escape-outside-string.json => escape-outside-string.qapi} (100%)
 rename tests/qapi-schema/{escape-too-big.json => escape-too-big.qapi} (100%)
 rename tests/qapi-schema/{escape-too-short.json => escape-too-short.qapi} (100%)
 rename tests/qapi-schema/{event-boxed-empty.json => event-boxed-empty.qapi} (100%)
 rename tests/qapi-schema/{event-case.json => event-case.qapi} (100%)
 rename tests/qapi-schema/{event-nest-struct.json => event-nest-struct.qapi} (100%)
 rename tests/qapi-schema/{flat-union-array-branch.json => flat-union-array-branch.qapi} (100%)
 rename tests/qapi-schema/{flat-union-bad-base.json => flat-union-bad-base.qapi} (100%)
 rename tests/qapi-schema/{flat-union-bad-discriminator.json => flat-union-bad-discriminator.qapi} (100%)
 rename tests/qapi-schema/{flat-union-base-any.json => flat-union-base-any.qapi} (100%)
 rename tests/qapi-schema/{flat-union-base-union.json => flat-union-base-union.qapi} (100%)
 rename tests/qapi-schema/{flat-union-clash-member.json => flat-union-clash-member.qapi} (100%)
 rename tests/qapi-schema/{flat-union-empty.json => flat-union-empty.qapi} (100%)
 rename tests/qapi-schema/{flat-union-incomplete-branch.json => flat-union-incomplete-branch.qapi} (100%)
 rename tests/qapi-schema/{flat-union-inline.json => flat-union-inline.qapi} (100%)
 rename tests/qapi-schema/{flat-union-int-branch.json => flat-union-int-branch.qapi} (100%)
 rename tests/qapi-schema/{flat-union-invalid-branch-key.json => flat-union-invalid-branch-key.qapi} (100%)
 rename tests/qapi-schema/{flat-union-invalid-discriminator.json => flat-union-invalid-discriminator.qapi} (100%)
 rename tests/qapi-schema/{flat-union-no-base.json => flat-union-no-base.qapi} (100%)
 rename tests/qapi-schema/{flat-union-optional-discriminator.json => flat-union-optional-discriminator.qapi} (100%)
 rename tests/qapi-schema/{flat-union-string-discriminator.json => flat-union-string-discriminator.qapi} (100%)
 rename tests/qapi-schema/{funny-char.json => funny-char.qapi} (100%)
 rename tests/qapi-schema/{ident-with-escape.json => ident-with-escape.qapi} (100%)
 delete mode 100644 tests/qapi-schema/include-before-err.json
 create mode 100644 tests/qapi-schema/include-before-err.qapi
 delete mode 100644 tests/qapi-schema/include-cycle-b.json
 create mode 100644 tests/qapi-schema/include-cycle-b.qapi
 delete mode 100644 tests/qapi-schema/include-cycle-c.json
 create mode 100644 tests/qapi-schema/include-cycle-c.qapi
 delete mode 100644 tests/qapi-schema/include-cycle.json
 create mode 100644 tests/qapi-schema/include-cycle.qapi
 delete mode 100644 tests/qapi-schema/include-extra-junk.json
 create mode 100644 tests/qapi-schema/include-extra-junk.qapi
 delete mode 100644 tests/qapi-schema/include-format-err.json
 create mode 100644 tests/qapi-schema/include-format-err.qapi
 delete mode 100644 tests/qapi-schema/include-nested-err.json
 create mode 100644 tests/qapi-schema/include-nested-err.qapi
 delete mode 100644 tests/qapi-schema/include-no-file.json
 create mode 100644 tests/qapi-schema/include-no-file.qapi
 rename tests/qapi-schema/{include-non-file.json => include-non-file.qapi} (100%)
 rename tests/qapi-schema/{include-relpath-sub.json => include-relpath-sub.qapi} (100%)
 delete mode 100644 tests/qapi-schema/include-relpath.json
 create mode 100644 tests/qapi-schema/include-relpath.qapi
 delete mode 100644 tests/qapi-schema/include-repetition-sub.json
 create mode 100644 tests/qapi-schema/include-repetition-sub.qapi
 delete mode 100644 tests/qapi-schema/include-repetition.json
 create mode 100644 tests/qapi-schema/include-repetition.qapi
 delete mode 100644 tests/qapi-schema/include-self-cycle.json
 create mode 100644 tests/qapi-schema/include-self-cycle.qapi
 rename tests/qapi-schema/{include-simple-sub.json => include-simple-sub.qapi} (100%)
 delete mode 100644 tests/qapi-schema/include-simple.json
 create mode 100644 tests/qapi-schema/include-simple.qapi
 delete mode 100644 tests/qapi-schema/include/relpath.json
 create mode 100644 tests/qapi-schema/include/relpath.qapi
 rename tests/qapi-schema/{indented-expr.json => indented-expr.qapi} (100%)
 rename tests/qapi-schema/{leading-comma-list.json => leading-comma-list.qapi} (100%)
 rename tests/qapi-schema/{leading-comma-object.json => leading-comma-object.qapi} (100%)
 rename tests/qapi-schema/{missing-colon.json => missing-colon.qapi} (100%)
 rename tests/qapi-schema/{missing-comma-list.json => missing-comma-list.qapi} (100%)
 rename tests/qapi-schema/{missing-comma-object.json => missing-comma-object.qapi} (100%)
 rename tests/qapi-schema/{missing-type.json => missing-type.qapi} (100%)
 rename tests/qapi-schema/{nested-struct-data.json => nested-struct-data.qapi} (100%)
 rename tests/qapi-schema/{non-objects.json => non-objects.qapi} (100%)
 rename tests/qapi-schema/{oob-test.json => oob-test.qapi} (100%)
 rename tests/qapi-schema/{pragma-doc-required-crap.json => pragma-doc-required-crap.qapi} (100%)
 rename tests/qapi-schema/{pragma-extra-junk.json => pragma-extra-junk.qapi} (100%)
 rename tests/qapi-schema/{pragma-name-case-whitelist-crap.json => pragma-name-case-whitelist-crap.qapi} (100%)
 rename tests/qapi-schema/{pragma-non-dict.json => pragma-non-dict.qapi} (100%)
 rename tests/qapi-schema/{pragma-returns-whitelist-crap.json => pragma-returns-whitelist-crap.qapi} (100%)
 rename tests/qapi-schema/{qapi-schema-test.json => qapi-schema-test.qapi} (100%)
 rename tests/qapi-schema/{quoted-structural-chars.json => quoted-structural-chars.qapi} (100%)
 rename tests/qapi-schema/{redefined-builtin.json => redefined-builtin.qapi} (100%)
 rename tests/qapi-schema/{redefined-command.json => redefined-command.qapi} (100%)
 rename tests/qapi-schema/{redefined-event.json => redefined-event.qapi} (100%)
 rename tests/qapi-schema/{redefined-type.json => redefined-type.qapi} (100%)
 rename tests/qapi-schema/{reserved-command-q.json => reserved-command-q.qapi} (100%)
 rename tests/qapi-schema/{reserved-enum-q.json => reserved-enum-q.qapi} (100%)
 rename tests/qapi-schema/{reserved-member-has.json => reserved-member-has.qapi} (100%)
 rename tests/qapi-schema/{reserved-member-q.json => reserved-member-q.qapi} (100%)
 rename tests/qapi-schema/{reserved-member-u.json => reserved-member-u.qapi} (100%)
 rename tests/qapi-schema/{reserved-member-underscore.json => reserved-member-underscore.qapi} (100%)
 rename tests/qapi-schema/{reserved-type-kind.json => reserved-type-kind.qapi} (100%)
 rename tests/qapi-schema/{reserved-type-list.json => reserved-type-list.qapi} (100%)
 rename tests/qapi-schema/{returns-alternate.json => returns-alternate.qapi} (100%)
 rename tests/qapi-schema/{returns-array-bad.json => returns-array-bad.qapi} (100%)
 rename tests/qapi-schema/{returns-dict.json => returns-dict.qapi} (100%)
 rename tests/qapi-schema/{returns-unknown.json => returns-unknown.qapi} (100%)
 rename tests/qapi-schema/{returns-whitelist.json => returns-whitelist.qapi} (100%)
 rename tests/qapi-schema/{struct-base-clash-deep.json => struct-base-clash-deep.qapi} (100%)
 rename tests/qapi-schema/{struct-base-clash.json => struct-base-clash.qapi} (100%)
 rename tests/qapi-schema/{struct-data-invalid.json => struct-data-invalid.qapi} (100%)
 rename tests/qapi-schema/{struct-member-invalid.json => struct-member-invalid.qapi} (100%)
 rename tests/qapi-schema/{trailing-comma-list.json => trailing-comma-list.qapi} (100%)
 rename tests/qapi-schema/{trailing-comma-object.json => trailing-comma-object.qapi} (100%)
 rename tests/qapi-schema/{type-bypass-bad-gen.json => type-bypass-bad-gen.qapi} (100%)
 rename tests/qapi-schema/{unclosed-list.json => unclosed-list.qapi} (100%)
 rename tests/qapi-schema/{unclosed-object.json => unclosed-object.qapi} (100%)
 rename tests/qapi-schema/{unclosed-string.json => unclosed-string.qapi} (100%)
 rename tests/qapi-schema/{unicode-str.json => unicode-str.qapi} (100%)
 rename tests/qapi-schema/{union-base-empty.json => union-base-empty.qapi} (100%)
 rename tests/qapi-schema/{union-base-no-discriminator.json => union-base-no-discriminator.qapi} (100%)
 rename tests/qapi-schema/{union-branch-case.json => union-branch-case.qapi} (100%)
 rename tests/qapi-schema/{union-clash-branches.json => union-clash-branches.qapi} (100%)
 rename tests/qapi-schema/{union-empty.json => union-empty.qapi} (100%)
 rename tests/qapi-schema/{union-invalid-base.json => union-invalid-base.qapi} (100%)
 rename tests/qapi-schema/{union-optional-branch.json => union-optional-branch.qapi} (100%)
 rename tests/qapi-schema/{union-unknown.json => union-unknown.qapi} (100%)
 rename tests/qapi-schema/{unknown-escape.json => unknown-escape.qapi} (100%)
 rename tests/qapi-schema/{unknown-expr-key.json => unknown-expr-key.qapi} (100%)

Comments

Markus Armbruster April 20, 2018, 8:35 a.m. UTC | #1
Eric Blake <eblake@redhat.com> writes:

> Our QAPI input files aren't quite true JSON (comments being one obvious
> difference); naming things .json doesn't make that obvious.  Use a new
> suffix .qapi that makes it easy to identify our files.

I agree that .json is sub-optimal.  Evidence: we add Emacs file
variables to get Python mode, because that's less wrong than JavaScript
mode.  Except for "trivial" files, where we can't be bothered.

The rename lessens the human confusion, but increases the Editor
confusion somewhat: we get Fundamental mode for "trivial" files, which
is more wrong than JavaScript mode.

One way to avoid that would be adding file variables to all files.

Permit me to digress.  I figure the (sane part of the) rationale for
picking JSON as programming language syntax was "do not invent syntax,
do profit from existing tooling".  Except JSON is unfit for the purpose
as is; you need at least comments.  Our "fixes" for "unfit" turned the
thing into an original work, destroying the "profit" part.  To
paraphrase a German saying, what we built with our hands we upset with
the ass.  Too late to correct, I guess, but I'm open to different
opinions.

[...]
Dr. David Alan Gilbert April 20, 2018, 9:27 a.m. UTC | #2
* Markus Armbruster (armbru@redhat.com) wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
> > Our QAPI input files aren't quite true JSON (comments being one obvious
> > difference); naming things .json doesn't make that obvious.  Use a new
> > suffix .qapi that makes it easy to identify our files.
> 
> I agree that .json is sub-optimal.  Evidence: we add Emacs file
> variables to get Python mode, because that's less wrong than JavaScript
> mode.  Except for "trivial" files, where we can't be bothered.
> 
> The rename lessens the human confusion, but increases the Editor
> confusion somewhat: we get Fundamental mode for "trivial" files, which
> is more wrong than JavaScript mode.
> 
> One way to avoid that would be adding file variables to all files.

That depends on your editor;  this rename makes life **much** better
in vim;   with them as .json files they display with white text on
bright red background (I guess because it's upset by syntax somewhere)
but as .qapi files it's readable (I'm not entirely sure which syntax
it's using)

Dave

> Permit me to digress.  I figure the (sane part of the) rationale for
> picking JSON as programming language syntax was "do not invent syntax,
> do profit from existing tooling".  Except JSON is unfit for the purpose
> as is; you need at least comments.  Our "fixes" for "unfit" turned the
> thing into an original work, destroying the "profit" part.  To
> paraphrase a German saying, what we built with our hands we upset with
> the ass.  Too late to correct, I guess, but I'm open to different
> opinions.
> 
> [...]
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Dr. David Alan Gilbert April 20, 2018, 9:46 a.m. UTC | #3
* Eric Blake (eblake@redhat.com) wrote:
> Our QAPI input files aren't quite true JSON (comments being one obvious
> difference); naming things .json doesn't make that obvious.  Use a new
> suffix .qapi that makes it easy to identify our files.
> 
> This change is mostly mechanical, but it is not just a global
> search-and-replace as some instances of '.json' really do refer
> to JSON files, or to a URL that can't change, and so on.
> 
> Signed-off-by: Eric Blake <eblake@redhat.com>

For migration and HMP

Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

> 
> ---
> v2: rebase to master
> ---
>  docs/devel/blkdebug.txt                            |   2 +-
>  docs/devel/qapi-code-gen.txt                       |   6 +-
>  docs/devel/testing.rst                             |   4 +-
>  docs/devel/writing-qmp-commands.txt                |   4 +-
>  docs/interop/live-block-operations.rst             |   4 +-
>  docs/interop/qmp-intro.txt                         |   2 +-
>  Makefile                                           |  32 +-
>  qapi/{block-core.json => block-core.qapi}          |   6 +-
>  qapi/{block.json => block.qapi}                    |   2 +-
>  qapi/{char.json => char.qapi}                      |   2 +-
>  qapi/{common.json => common.qapi}                  |   0
>  qapi/{crypto.json => crypto.qapi}                  |   0
>  qapi/{introspect.json => introspect.qapi}          |   0
>  qapi/{migration.json => migration.qapi}            |   2 +-
>  qapi/{misc.json => misc.qapi}                      |   0
>  qapi/{net.json => net.qapi}                        |   2 +-
>  qapi/{qga-schema.json => qga-schema.qapi}          |   0
>  qapi/{qmp-schema.json => qmp-schema.qapi}          |  30 +-
>  qapi/{rocker.json => rocker.qapi}                  |   0
>  qapi/{run-state.json => run-state.qapi}            |   0
>  qapi/{sockets.json => sockets.qapi}                |   2 +-
>  qapi/{tpm.json => tpm.qapi}                        |   0
>  qapi/{trace.json => trace.qapi}                    |   0
>  qapi/{transaction.json => transaction.qapi}        |   2 +-
>  qapi/{ui.json => ui.qapi}                          |   2 +-
>  include/crypto/block.h                             |   2 +-
>  include/crypto/cipher.h                            |   2 +-
>  include/crypto/hash.h                              |   2 +-
>  include/crypto/ivgen.h                             |   2 +-
>  MAINTAINERS                                        |  26 +-
>  scripts/git.orderfile                              |   2 +-
>  tests/Makefile.include                             | 336 ++++++++++-----------
>  tests/qapi-schema/alternate-any.err                |   2 +-
>  .../{alternate-any.json => alternate-any.qapi}     |   0
>  tests/qapi-schema/alternate-array.err              |   2 +-
>  .../{alternate-array.json => alternate-array.qapi} |   0
>  tests/qapi-schema/alternate-base.err               |   2 +-
>  .../{alternate-base.json => alternate-base.qapi}   |   0
>  tests/qapi-schema/alternate-clash.err              |   2 +-
>  .../{alternate-clash.json => alternate-clash.qapi} |   0
>  .../qapi-schema/alternate-conflict-bool-string.err |   2 +-
>  ...ng.json => alternate-conflict-bool-string.qapi} |   0
>  tests/qapi-schema/alternate-conflict-dict.err      |   2 +-
>  ...lict-dict.json => alternate-conflict-dict.qapi} |   0
>  tests/qapi-schema/alternate-conflict-enum-bool.err |   2 +-
>  ...bool.json => alternate-conflict-enum-bool.qapi} |   0
>  tests/qapi-schema/alternate-conflict-enum-int.err  |   2 +-
>  ...m-int.json => alternate-conflict-enum-int.qapi} |   0
>  .../qapi-schema/alternate-conflict-num-string.err  |   2 +-
>  ...ing.json => alternate-conflict-num-string.qapi} |   0
>  tests/qapi-schema/alternate-conflict-string.err    |   2 +-
>  ...-string.json => alternate-conflict-string.qapi} |   0
>  tests/qapi-schema/alternate-empty.err              |   2 +-
>  .../{alternate-empty.json => alternate-empty.qapi} |   0
>  tests/qapi-schema/alternate-nested.err             |   2 +-
>  ...alternate-nested.json => alternate-nested.qapi} |   0
>  tests/qapi-schema/alternate-unknown.err            |   2 +-
>  ...ternate-unknown.json => alternate-unknown.qapi} |   0
>  tests/qapi-schema/args-alternate.err               |   2 +-
>  .../{args-alternate.json => args-alternate.qapi}   |   0
>  tests/qapi-schema/args-any.err                     |   2 +-
>  tests/qapi-schema/{args-any.json => args-any.qapi} |   0
>  tests/qapi-schema/args-array-empty.err             |   2 +-
>  ...args-array-empty.json => args-array-empty.qapi} |   0
>  tests/qapi-schema/args-array-unknown.err           |   2 +-
>  ...-array-unknown.json => args-array-unknown.qapi} |   0
>  tests/qapi-schema/args-bad-boxed.err               |   2 +-
>  .../{args-bad-boxed.json => args-bad-boxed.qapi}   |   0
>  tests/qapi-schema/args-boxed-anon.err              |   2 +-
>  .../{args-boxed-anon.json => args-boxed-anon.qapi} |   0
>  tests/qapi-schema/args-boxed-empty.err             |   2 +-
>  ...args-boxed-empty.json => args-boxed-empty.qapi} |   0
>  tests/qapi-schema/args-boxed-string.err            |   2 +-
>  ...gs-boxed-string.json => args-boxed-string.qapi} |   0
>  tests/qapi-schema/args-int.err                     |   2 +-
>  tests/qapi-schema/{args-int.json => args-int.qapi} |   0
>  tests/qapi-schema/args-invalid.err                 |   2 +-
>  .../{args-invalid.json => args-invalid.qapi}       |   0
>  tests/qapi-schema/args-member-array-bad.err        |   2 +-
>  ...r-array-bad.json => args-member-array-bad.qapi} |   0
>  tests/qapi-schema/args-member-case.err             |   2 +-
>  ...args-member-case.json => args-member-case.qapi} |   0
>  tests/qapi-schema/args-member-unknown.err          |   2 +-
>  ...ember-unknown.json => args-member-unknown.qapi} |   0
>  tests/qapi-schema/args-name-clash.err              |   2 +-
>  .../{args-name-clash.json => args-name-clash.qapi} |   0
>  tests/qapi-schema/args-union.err                   |   2 +-
>  .../{args-union.json => args-union.qapi}           |   0
>  tests/qapi-schema/args-unknown.err                 |   2 +-
>  .../{args-unknown.json => args-unknown.qapi}       |   0
>  tests/qapi-schema/bad-base.err                     |   2 +-
>  tests/qapi-schema/{bad-base.json => bad-base.qapi} |   0
>  tests/qapi-schema/bad-data.err                     |   2 +-
>  tests/qapi-schema/{bad-data.json => bad-data.qapi} |   0
>  tests/qapi-schema/bad-ident.err                    |   2 +-
>  .../qapi-schema/{bad-ident.json => bad-ident.qapi} |   0
>  tests/qapi-schema/bad-type-bool.err                |   2 +-
>  .../{bad-type-bool.json => bad-type-bool.qapi}     |   0
>  tests/qapi-schema/bad-type-dict.err                |   2 +-
>  .../{bad-type-dict.json => bad-type-dict.qapi}     |   0
>  tests/qapi-schema/bad-type-int.err                 |   2 +-
>  .../{bad-type-int.json => bad-type-int.qapi}       |   0
>  tests/qapi-schema/base-cycle-direct.err            |   2 +-
>  ...se-cycle-direct.json => base-cycle-direct.qapi} |   0
>  tests/qapi-schema/base-cycle-indirect.err          |   2 +-
>  ...ycle-indirect.json => base-cycle-indirect.qapi} |   0
>  tests/qapi-schema/command-int.err                  |   2 +-
>  .../{command-int.json => command-int.qapi}         |   0
>  tests/qapi-schema/comments.out                     |   2 +-
>  tests/qapi-schema/{comments.json => comments.qapi} |   0
>  tests/qapi-schema/doc-bad-alternate-member.err     |   2 +-
>  ...e-member.json => doc-bad-alternate-member.qapi} |   0
>  tests/qapi-schema/doc-bad-command-arg.err          |   2 +-
>  ...d-command-arg.json => doc-bad-command-arg.qapi} |   0
>  tests/qapi-schema/doc-bad-section.out              |   2 +-
>  .../{doc-bad-section.json => doc-bad-section.qapi} |   0
>  tests/qapi-schema/doc-bad-symbol.err               |   2 +-
>  .../{doc-bad-symbol.json => doc-bad-symbol.qapi}   |   0
>  tests/qapi-schema/doc-bad-union-member.err         |   2 +-
>  ...union-member.json => doc-bad-union-member.qapi} |   0
>  tests/qapi-schema/doc-before-include.err           |   2 +-
>  ...before-include.json => doc-before-include.qapi} |   2 +-
>  tests/qapi-schema/doc-before-pragma.err            |   2 +-
>  ...c-before-pragma.json => doc-before-pragma.qapi} |   0
>  tests/qapi-schema/doc-duplicated-arg.err           |   2 +-
>  ...duplicated-arg.json => doc-duplicated-arg.qapi} |   0
>  tests/qapi-schema/doc-duplicated-return.err        |   2 +-
>  ...ated-return.json => doc-duplicated-return.qapi} |   0
>  tests/qapi-schema/doc-duplicated-since.err         |   2 +-
>  ...icated-since.json => doc-duplicated-since.qapi} |   0
>  tests/qapi-schema/doc-empty-arg.err                |   2 +-
>  .../{doc-empty-arg.json => doc-empty-arg.qapi}     |   0
>  tests/qapi-schema/doc-empty-section.err            |   2 +-
>  ...c-empty-section.json => doc-empty-section.qapi} |   0
>  tests/qapi-schema/doc-empty-symbol.err             |   2 +-
>  ...doc-empty-symbol.json => doc-empty-symbol.qapi} |   0
>  tests/qapi-schema/doc-good.out                     |   2 +-
>  tests/qapi-schema/{doc-good.json => doc-good.qapi} |   0
>  tests/qapi-schema/doc-interleaved-section.err      |   2 +-
>  ...d-section.json => doc-interleaved-section.qapi} |   0
>  tests/qapi-schema/doc-invalid-end.err              |   2 +-
>  .../{doc-invalid-end.json => doc-invalid-end.qapi} |   0
>  tests/qapi-schema/doc-invalid-end2.err             |   2 +-
>  ...doc-invalid-end2.json => doc-invalid-end2.qapi} |   0
>  tests/qapi-schema/doc-invalid-return.err           |   2 +-
>  ...invalid-return.json => doc-invalid-return.qapi} |   0
>  tests/qapi-schema/doc-invalid-section.err          |   2 +-
>  ...valid-section.json => doc-invalid-section.qapi} |   0
>  tests/qapi-schema/doc-invalid-start.err            |   2 +-
>  ...c-invalid-start.json => doc-invalid-start.qapi} |   0
>  tests/qapi-schema/doc-missing-colon.err            |   2 +-
>  ...c-missing-colon.json => doc-missing-colon.qapi} |   0
>  tests/qapi-schema/doc-missing-expr.err             |   2 +-
>  ...doc-missing-expr.json => doc-missing-expr.qapi} |   0
>  tests/qapi-schema/doc-missing-space.err            |   2 +-
>  ...c-missing-space.json => doc-missing-space.qapi} |   0
>  tests/qapi-schema/doc-missing.err                  |   2 +-
>  .../{doc-missing.json => doc-missing.qapi}         |   0
>  tests/qapi-schema/doc-no-symbol.err                |   2 +-
>  .../{doc-no-symbol.json => doc-no-symbol.qapi}     |   0
>  tests/qapi-schema/double-data.err                  |   2 +-
>  .../{double-data.json => double-data.qapi}         |   0
>  tests/qapi-schema/double-type.err                  |   2 +-
>  .../{double-type.json => double-type.qapi}         |   0
>  tests/qapi-schema/duplicate-key.err                |   2 +-
>  .../{duplicate-key.json => duplicate-key.qapi}     |   0
>  tests/qapi-schema/{empty.json => empty.qapi}       |   0
>  tests/qapi-schema/enum-bad-name.err                |   2 +-
>  .../{enum-bad-name.json => enum-bad-name.qapi}     |   0
>  tests/qapi-schema/enum-bad-prefix.err              |   2 +-
>  .../{enum-bad-prefix.json => enum-bad-prefix.qapi} |   0
>  tests/qapi-schema/enum-clash-member.err            |   2 +-
>  ...um-clash-member.json => enum-clash-member.qapi} |   0
>  tests/qapi-schema/enum-dict-member.err             |   2 +-
>  ...enum-dict-member.json => enum-dict-member.qapi} |   0
>  tests/qapi-schema/enum-int-member.err              |   2 +-
>  .../{enum-int-member.json => enum-int-member.qapi} |   0
>  tests/qapi-schema/enum-member-case.err             |   2 +-
>  ...enum-member-case.json => enum-member-case.qapi} |   0
>  tests/qapi-schema/enum-missing-data.err            |   2 +-
>  ...um-missing-data.json => enum-missing-data.qapi} |   0
>  tests/qapi-schema/enum-wrong-data.err              |   2 +-
>  .../{enum-wrong-data.json => enum-wrong-data.qapi} |   0
>  tests/qapi-schema/escape-outside-string.err        |   2 +-
>  ...side-string.json => escape-outside-string.qapi} |   0
>  tests/qapi-schema/escape-too-big.err               |   2 +-
>  .../{escape-too-big.json => escape-too-big.qapi}   |   0
>  tests/qapi-schema/escape-too-short.err             |   2 +-
>  ...escape-too-short.json => escape-too-short.qapi} |   0
>  tests/qapi-schema/event-boxed-empty.err            |   2 +-
>  ...ent-boxed-empty.json => event-boxed-empty.qapi} |   0
>  tests/qapi-schema/event-case.out                   |   2 +-
>  .../{event-case.json => event-case.qapi}           |   0
>  tests/qapi-schema/event-nest-struct.err            |   2 +-
>  ...ent-nest-struct.json => event-nest-struct.qapi} |   0
>  tests/qapi-schema/flat-union-array-branch.err      |   2 +-
>  ...ay-branch.json => flat-union-array-branch.qapi} |   0
>  tests/qapi-schema/flat-union-bad-base.err          |   2 +-
>  ...nion-bad-base.json => flat-union-bad-base.qapi} |   0
>  tests/qapi-schema/flat-union-bad-discriminator.err |   2 +-
>  ...ator.json => flat-union-bad-discriminator.qapi} |   0
>  tests/qapi-schema/flat-union-base-any.err          |   2 +-
>  ...nion-base-any.json => flat-union-base-any.qapi} |   0
>  tests/qapi-schema/flat-union-base-union.err        |   2 +-
>  ...-base-union.json => flat-union-base-union.qapi} |   0
>  tests/qapi-schema/flat-union-clash-member.err      |   2 +-
>  ...sh-member.json => flat-union-clash-member.qapi} |   0
>  tests/qapi-schema/flat-union-empty.err             |   2 +-
>  ...flat-union-empty.json => flat-union-empty.qapi} |   0
>  tests/qapi-schema/flat-union-incomplete-branch.err |   2 +-
>  ...anch.json => flat-union-incomplete-branch.qapi} |   0
>  tests/qapi-schema/flat-union-inline.err            |   2 +-
>  ...at-union-inline.json => flat-union-inline.qapi} |   0
>  tests/qapi-schema/flat-union-int-branch.err        |   2 +-
>  ...-int-branch.json => flat-union-int-branch.qapi} |   0
>  .../qapi-schema/flat-union-invalid-branch-key.err  |   2 +-
>  ...key.json => flat-union-invalid-branch-key.qapi} |   0
>  .../flat-union-invalid-discriminator.err           |   2 +-
>  ....json => flat-union-invalid-discriminator.qapi} |   0
>  tests/qapi-schema/flat-union-no-base.err           |   2 +-
>  ...-union-no-base.json => flat-union-no-base.qapi} |   0
>  .../flat-union-optional-discriminator.err          |   2 +-
>  ...json => flat-union-optional-discriminator.qapi} |   0
>  .../flat-union-string-discriminator.err            |   2 +-
>  ...r.json => flat-union-string-discriminator.qapi} |   0
>  tests/qapi-schema/funny-char.err                   |   2 +-
>  .../{funny-char.json => funny-char.qapi}           |   0
>  tests/qapi-schema/ident-with-escape.out            |   2 +-
>  ...ent-with-escape.json => ident-with-escape.qapi} |   0
>  tests/qapi-schema/include-before-err.err           |   2 +-
>  tests/qapi-schema/include-before-err.json          |   2 -
>  tests/qapi-schema/include-before-err.qapi          |   2 +
>  tests/qapi-schema/include-cycle-b.json             |   1 -
>  tests/qapi-schema/include-cycle-b.qapi             |   1 +
>  tests/qapi-schema/include-cycle-c.json             |   1 -
>  tests/qapi-schema/include-cycle-c.qapi             |   1 +
>  tests/qapi-schema/include-cycle.err                |   6 +-
>  tests/qapi-schema/include-cycle.json               |   1 -
>  tests/qapi-schema/include-cycle.qapi               |   1 +
>  tests/qapi-schema/include-extra-junk.err           |   2 +-
>  tests/qapi-schema/include-extra-junk.json          |   3 -
>  tests/qapi-schema/include-extra-junk.qapi          |   3 +
>  tests/qapi-schema/include-format-err.err           |   2 +-
>  tests/qapi-schema/include-format-err.json          |   2 -
>  tests/qapi-schema/include-format-err.qapi          |   2 +
>  tests/qapi-schema/include-nested-err.err           |   4 +-
>  tests/qapi-schema/include-nested-err.json          |   1 -
>  tests/qapi-schema/include-nested-err.qapi          |   1 +
>  tests/qapi-schema/include-no-file.err              |   2 +-
>  tests/qapi-schema/include-no-file.json             |   1 -
>  tests/qapi-schema/include-no-file.qapi             |   1 +
>  tests/qapi-schema/include-non-file.err             |   2 +-
>  ...include-non-file.json => include-non-file.qapi} |   0
>  ...e-relpath-sub.json => include-relpath-sub.qapi} |   0
>  tests/qapi-schema/include-relpath.json             |   1 -
>  tests/qapi-schema/include-relpath.out              |  10 +-
>  tests/qapi-schema/include-relpath.qapi             |   1 +
>  tests/qapi-schema/include-repetition-sub.json      |   2 -
>  tests/qapi-schema/include-repetition-sub.qapi      |   2 +
>  tests/qapi-schema/include-repetition.json          |   3 -
>  tests/qapi-schema/include-repetition.out           |  20 +-
>  tests/qapi-schema/include-repetition.qapi          |   3 +
>  tests/qapi-schema/include-self-cycle.err           |   2 +-
>  tests/qapi-schema/include-self-cycle.json          |   1 -
>  tests/qapi-schema/include-self-cycle.qapi          |   1 +
>  ...ude-simple-sub.json => include-simple-sub.qapi} |   0
>  tests/qapi-schema/include-simple.json              |   1 -
>  tests/qapi-schema/include-simple.out               |   6 +-
>  tests/qapi-schema/include-simple.qapi              |   1 +
>  tests/qapi-schema/include/relpath.json             |   1 -
>  tests/qapi-schema/include/relpath.qapi             |   1 +
>  tests/qapi-schema/indented-expr.out                |   2 +-
>  .../{indented-expr.json => indented-expr.qapi}     |   0
>  tests/qapi-schema/leading-comma-list.err           |   2 +-
>  ...ing-comma-list.json => leading-comma-list.qapi} |   0
>  tests/qapi-schema/leading-comma-object.err         |   2 +-
>  ...comma-object.json => leading-comma-object.qapi} |   0
>  tests/qapi-schema/missing-colon.err                |   2 +-
>  .../{missing-colon.json => missing-colon.qapi}     |   0
>  tests/qapi-schema/missing-comma-list.err           |   2 +-
>  ...ing-comma-list.json => missing-comma-list.qapi} |   0
>  tests/qapi-schema/missing-comma-object.err         |   2 +-
>  ...comma-object.json => missing-comma-object.qapi} |   0
>  tests/qapi-schema/missing-type.err                 |   2 +-
>  .../{missing-type.json => missing-type.qapi}       |   0
>  tests/qapi-schema/nested-struct-data.err           |   2 +-
>  ...ed-struct-data.json => nested-struct-data.qapi} |   0
>  tests/qapi-schema/non-objects.err                  |   2 +-
>  .../{non-objects.json => non-objects.qapi}         |   0
>  tests/qapi-schema/oob-test.err                     |   2 +-
>  tests/qapi-schema/{oob-test.json => oob-test.qapi} |   0
>  tests/qapi-schema/pragma-doc-required-crap.err     |   2 +-
>  ...red-crap.json => pragma-doc-required-crap.qapi} |   0
>  tests/qapi-schema/pragma-extra-junk.err            |   2 +-
>  ...agma-extra-junk.json => pragma-extra-junk.qapi} |   0
>  .../pragma-name-case-whitelist-crap.err            |   2 +-
>  ...p.json => pragma-name-case-whitelist-crap.qapi} |   0
>  tests/qapi-schema/pragma-non-dict.err              |   2 +-
>  .../{pragma-non-dict.json => pragma-non-dict.qapi} |   0
>  .../qapi-schema/pragma-returns-whitelist-crap.err  |   2 +-
>  ...rap.json => pragma-returns-whitelist-crap.qapi} |   0
>  tests/qapi-schema/qapi-schema-test.out             |   2 +-
>  ...qapi-schema-test.json => qapi-schema-test.qapi} |   0
>  tests/qapi-schema/quoted-structural-chars.err      |   2 +-
>  ...ral-chars.json => quoted-structural-chars.qapi} |   0
>  tests/qapi-schema/redefined-builtin.err            |   2 +-
>  ...defined-builtin.json => redefined-builtin.qapi} |   0
>  tests/qapi-schema/redefined-command.err            |   2 +-
>  ...defined-command.json => redefined-command.qapi} |   0
>  tests/qapi-schema/redefined-event.err              |   2 +-
>  .../{redefined-event.json => redefined-event.qapi} |   0
>  tests/qapi-schema/redefined-type.err               |   2 +-
>  .../{redefined-type.json => redefined-type.qapi}   |   0
>  tests/qapi-schema/reserved-command-q.err           |   2 +-
>  ...rved-command-q.json => reserved-command-q.qapi} |   0
>  tests/qapi-schema/reserved-enum-q.err              |   2 +-
>  .../{reserved-enum-q.json => reserved-enum-q.qapi} |   0
>  tests/qapi-schema/reserved-member-has.err          |   2 +-
>  ...ed-member-has.json => reserved-member-has.qapi} |   0
>  tests/qapi-schema/reserved-member-q.err            |   2 +-
>  ...served-member-q.json => reserved-member-q.qapi} |   0
>  tests/qapi-schema/reserved-member-u.err            |   2 +-
>  ...served-member-u.json => reserved-member-u.qapi} |   0
>  tests/qapi-schema/reserved-member-underscore.err   |   2 +-
>  ...rscore.json => reserved-member-underscore.qapi} |   0
>  tests/qapi-schema/reserved-type-kind.err           |   2 +-
>  ...rved-type-kind.json => reserved-type-kind.qapi} |   0
>  tests/qapi-schema/reserved-type-list.err           |   2 +-
>  ...rved-type-list.json => reserved-type-list.qapi} |   0
>  tests/qapi-schema/returns-alternate.err            |   2 +-
>  ...turns-alternate.json => returns-alternate.qapi} |   0
>  tests/qapi-schema/returns-array-bad.err            |   2 +-
>  ...turns-array-bad.json => returns-array-bad.qapi} |   0
>  tests/qapi-schema/returns-dict.err                 |   2 +-
>  .../{returns-dict.json => returns-dict.qapi}       |   0
>  tests/qapi-schema/returns-unknown.err              |   2 +-
>  .../{returns-unknown.json => returns-unknown.qapi} |   0
>  tests/qapi-schema/returns-whitelist.err            |   2 +-
>  ...turns-whitelist.json => returns-whitelist.qapi} |   0
>  tests/qapi-schema/struct-base-clash-deep.err       |   2 +-
>  ...clash-deep.json => struct-base-clash-deep.qapi} |   0
>  tests/qapi-schema/struct-base-clash.err            |   2 +-
>  ...ruct-base-clash.json => struct-base-clash.qapi} |   0
>  tests/qapi-schema/struct-data-invalid.err          |   2 +-
>  ...-data-invalid.json => struct-data-invalid.qapi} |   0
>  tests/qapi-schema/struct-member-invalid.err        |   2 +-
>  ...ber-invalid.json => struct-member-invalid.qapi} |   0
>  tests/qapi-schema/trailing-comma-list.err          |   2 +-
>  ...ng-comma-list.json => trailing-comma-list.qapi} |   0
>  tests/qapi-schema/trailing-comma-object.err        |   2 +-
>  ...omma-object.json => trailing-comma-object.qapi} |   0
>  tests/qapi-schema/type-bypass-bad-gen.err          |   2 +-
>  ...ypass-bad-gen.json => type-bypass-bad-gen.qapi} |   0
>  tests/qapi-schema/unclosed-list.err                |   2 +-
>  .../{unclosed-list.json => unclosed-list.qapi}     |   0
>  tests/qapi-schema/unclosed-object.err              |   2 +-
>  .../{unclosed-object.json => unclosed-object.qapi} |   0
>  tests/qapi-schema/unclosed-string.err              |   2 +-
>  .../{unclosed-string.json => unclosed-string.qapi} |   0
>  tests/qapi-schema/unicode-str.err                  |   2 +-
>  .../{unicode-str.json => unicode-str.qapi}         |   0
>  tests/qapi-schema/union-base-empty.err             |   2 +-
>  ...union-base-empty.json => union-base-empty.qapi} |   0
>  tests/qapi-schema/union-base-no-discriminator.err  |   2 +-
>  ...nator.json => union-base-no-discriminator.qapi} |   0
>  tests/qapi-schema/union-branch-case.err            |   2 +-
>  ...ion-branch-case.json => union-branch-case.qapi} |   0
>  tests/qapi-schema/union-clash-branches.err         |   2 +-
>  ...ash-branches.json => union-clash-branches.qapi} |   0
>  tests/qapi-schema/union-empty.err                  |   2 +-
>  .../{union-empty.json => union-empty.qapi}         |   0
>  tests/qapi-schema/union-invalid-base.err           |   2 +-
>  ...n-invalid-base.json => union-invalid-base.qapi} |   0
>  tests/qapi-schema/union-optional-branch.err        |   2 +-
>  ...onal-branch.json => union-optional-branch.qapi} |   0
>  tests/qapi-schema/union-unknown.err                |   2 +-
>  .../{union-unknown.json => union-unknown.qapi}     |   0
>  tests/qapi-schema/unknown-escape.err               |   2 +-
>  .../{unknown-escape.json => unknown-escape.qapi}   |   0
>  tests/qapi-schema/unknown-expr-key.err             |   2 +-
>  ...unknown-expr-key.json => unknown-expr-key.qapi} |   0
>  381 files changed, 442 insertions(+), 442 deletions(-)
>  rename qapi/{block-core.json => block-core.qapi} (99%)
>  rename qapi/{block.json => block.qapi} (99%)
>  rename qapi/{char.json => char.qapi} (99%)
>  rename qapi/{common.json => common.qapi} (100%)
>  rename qapi/{crypto.json => crypto.qapi} (100%)
>  rename qapi/{introspect.json => introspect.qapi} (100%)
>  rename qapi/{migration.json => migration.qapi} (99%)
>  rename qapi/{misc.json => misc.qapi} (100%)
>  rename qapi/{net.json => net.qapi} (99%)
>  rename qapi/{qga-schema.json => qga-schema.qapi} (100%)
>  rename qapi/{qmp-schema.json => qmp-schema.qapi} (88%)
>  rename qapi/{rocker.json => rocker.qapi} (100%)
>  rename qapi/{run-state.json => run-state.qapi} (100%)
>  rename qapi/{sockets.json => sockets.qapi} (99%)
>  rename qapi/{tpm.json => tpm.qapi} (100%)
>  rename qapi/{trace.json => trace.qapi} (100%)
>  rename qapi/{transaction.json => transaction.qapi} (99%)
>  rename qapi/{ui.json => ui.qapi} (99%)
>  rename tests/qapi-schema/{alternate-any.json => alternate-any.qapi} (100%)
>  rename tests/qapi-schema/{alternate-array.json => alternate-array.qapi} (100%)
>  rename tests/qapi-schema/{alternate-base.json => alternate-base.qapi} (100%)
>  rename tests/qapi-schema/{alternate-clash.json => alternate-clash.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-bool-string.json => alternate-conflict-bool-string.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-dict.json => alternate-conflict-dict.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-enum-bool.json => alternate-conflict-enum-bool.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-enum-int.json => alternate-conflict-enum-int.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-num-string.json => alternate-conflict-num-string.qapi} (100%)
>  rename tests/qapi-schema/{alternate-conflict-string.json => alternate-conflict-string.qapi} (100%)
>  rename tests/qapi-schema/{alternate-empty.json => alternate-empty.qapi} (100%)
>  rename tests/qapi-schema/{alternate-nested.json => alternate-nested.qapi} (100%)
>  rename tests/qapi-schema/{alternate-unknown.json => alternate-unknown.qapi} (100%)
>  rename tests/qapi-schema/{args-alternate.json => args-alternate.qapi} (100%)
>  rename tests/qapi-schema/{args-any.json => args-any.qapi} (100%)
>  rename tests/qapi-schema/{args-array-empty.json => args-array-empty.qapi} (100%)
>  rename tests/qapi-schema/{args-array-unknown.json => args-array-unknown.qapi} (100%)
>  rename tests/qapi-schema/{args-bad-boxed.json => args-bad-boxed.qapi} (100%)
>  rename tests/qapi-schema/{args-boxed-anon.json => args-boxed-anon.qapi} (100%)
>  rename tests/qapi-schema/{args-boxed-empty.json => args-boxed-empty.qapi} (100%)
>  rename tests/qapi-schema/{args-boxed-string.json => args-boxed-string.qapi} (100%)
>  rename tests/qapi-schema/{args-int.json => args-int.qapi} (100%)
>  rename tests/qapi-schema/{args-invalid.json => args-invalid.qapi} (100%)
>  rename tests/qapi-schema/{args-member-array-bad.json => args-member-array-bad.qapi} (100%)
>  rename tests/qapi-schema/{args-member-case.json => args-member-case.qapi} (100%)
>  rename tests/qapi-schema/{args-member-unknown.json => args-member-unknown.qapi} (100%)
>  rename tests/qapi-schema/{args-name-clash.json => args-name-clash.qapi} (100%)
>  rename tests/qapi-schema/{args-union.json => args-union.qapi} (100%)
>  rename tests/qapi-schema/{args-unknown.json => args-unknown.qapi} (100%)
>  rename tests/qapi-schema/{bad-base.json => bad-base.qapi} (100%)
>  rename tests/qapi-schema/{bad-data.json => bad-data.qapi} (100%)
>  rename tests/qapi-schema/{bad-ident.json => bad-ident.qapi} (100%)
>  rename tests/qapi-schema/{bad-type-bool.json => bad-type-bool.qapi} (100%)
>  rename tests/qapi-schema/{bad-type-dict.json => bad-type-dict.qapi} (100%)
>  rename tests/qapi-schema/{bad-type-int.json => bad-type-int.qapi} (100%)
>  rename tests/qapi-schema/{base-cycle-direct.json => base-cycle-direct.qapi} (100%)
>  rename tests/qapi-schema/{base-cycle-indirect.json => base-cycle-indirect.qapi} (100%)
>  rename tests/qapi-schema/{command-int.json => command-int.qapi} (100%)
>  rename tests/qapi-schema/{comments.json => comments.qapi} (100%)
>  rename tests/qapi-schema/{doc-bad-alternate-member.json => doc-bad-alternate-member.qapi} (100%)
>  rename tests/qapi-schema/{doc-bad-command-arg.json => doc-bad-command-arg.qapi} (100%)
>  rename tests/qapi-schema/{doc-bad-section.json => doc-bad-section.qapi} (100%)
>  rename tests/qapi-schema/{doc-bad-symbol.json => doc-bad-symbol.qapi} (100%)
>  rename tests/qapi-schema/{doc-bad-union-member.json => doc-bad-union-member.qapi} (100%)
>  rename tests/qapi-schema/{doc-before-include.json => doc-before-include.qapi} (81%)
>  rename tests/qapi-schema/{doc-before-pragma.json => doc-before-pragma.qapi} (100%)
>  rename tests/qapi-schema/{doc-duplicated-arg.json => doc-duplicated-arg.qapi} (100%)
>  rename tests/qapi-schema/{doc-duplicated-return.json => doc-duplicated-return.qapi} (100%)
>  rename tests/qapi-schema/{doc-duplicated-since.json => doc-duplicated-since.qapi} (100%)
>  rename tests/qapi-schema/{doc-empty-arg.json => doc-empty-arg.qapi} (100%)
>  rename tests/qapi-schema/{doc-empty-section.json => doc-empty-section.qapi} (100%)
>  rename tests/qapi-schema/{doc-empty-symbol.json => doc-empty-symbol.qapi} (100%)
>  rename tests/qapi-schema/{doc-good.json => doc-good.qapi} (100%)
>  rename tests/qapi-schema/{doc-interleaved-section.json => doc-interleaved-section.qapi} (100%)
>  rename tests/qapi-schema/{doc-invalid-end.json => doc-invalid-end.qapi} (100%)
>  rename tests/qapi-schema/{doc-invalid-end2.json => doc-invalid-end2.qapi} (100%)
>  rename tests/qapi-schema/{doc-invalid-return.json => doc-invalid-return.qapi} (100%)
>  rename tests/qapi-schema/{doc-invalid-section.json => doc-invalid-section.qapi} (100%)
>  rename tests/qapi-schema/{doc-invalid-start.json => doc-invalid-start.qapi} (100%)
>  rename tests/qapi-schema/{doc-missing-colon.json => doc-missing-colon.qapi} (100%)
>  rename tests/qapi-schema/{doc-missing-expr.json => doc-missing-expr.qapi} (100%)
>  rename tests/qapi-schema/{doc-missing-space.json => doc-missing-space.qapi} (100%)
>  rename tests/qapi-schema/{doc-missing.json => doc-missing.qapi} (100%)
>  rename tests/qapi-schema/{doc-no-symbol.json => doc-no-symbol.qapi} (100%)
>  rename tests/qapi-schema/{double-data.json => double-data.qapi} (100%)
>  rename tests/qapi-schema/{double-type.json => double-type.qapi} (100%)
>  rename tests/qapi-schema/{duplicate-key.json => duplicate-key.qapi} (100%)
>  rename tests/qapi-schema/{empty.json => empty.qapi} (100%)
>  rename tests/qapi-schema/{enum-bad-name.json => enum-bad-name.qapi} (100%)
>  rename tests/qapi-schema/{enum-bad-prefix.json => enum-bad-prefix.qapi} (100%)
>  rename tests/qapi-schema/{enum-clash-member.json => enum-clash-member.qapi} (100%)
>  rename tests/qapi-schema/{enum-dict-member.json => enum-dict-member.qapi} (100%)
>  rename tests/qapi-schema/{enum-int-member.json => enum-int-member.qapi} (100%)
>  rename tests/qapi-schema/{enum-member-case.json => enum-member-case.qapi} (100%)
>  rename tests/qapi-schema/{enum-missing-data.json => enum-missing-data.qapi} (100%)
>  rename tests/qapi-schema/{enum-wrong-data.json => enum-wrong-data.qapi} (100%)
>  rename tests/qapi-schema/{escape-outside-string.json => escape-outside-string.qapi} (100%)
>  rename tests/qapi-schema/{escape-too-big.json => escape-too-big.qapi} (100%)
>  rename tests/qapi-schema/{escape-too-short.json => escape-too-short.qapi} (100%)
>  rename tests/qapi-schema/{event-boxed-empty.json => event-boxed-empty.qapi} (100%)
>  rename tests/qapi-schema/{event-case.json => event-case.qapi} (100%)
>  rename tests/qapi-schema/{event-nest-struct.json => event-nest-struct.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-array-branch.json => flat-union-array-branch.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-bad-base.json => flat-union-bad-base.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-bad-discriminator.json => flat-union-bad-discriminator.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-base-any.json => flat-union-base-any.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-base-union.json => flat-union-base-union.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-clash-member.json => flat-union-clash-member.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-empty.json => flat-union-empty.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-incomplete-branch.json => flat-union-incomplete-branch.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-inline.json => flat-union-inline.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-int-branch.json => flat-union-int-branch.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-invalid-branch-key.json => flat-union-invalid-branch-key.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-invalid-discriminator.json => flat-union-invalid-discriminator.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-no-base.json => flat-union-no-base.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-optional-discriminator.json => flat-union-optional-discriminator.qapi} (100%)
>  rename tests/qapi-schema/{flat-union-string-discriminator.json => flat-union-string-discriminator.qapi} (100%)
>  rename tests/qapi-schema/{funny-char.json => funny-char.qapi} (100%)
>  rename tests/qapi-schema/{ident-with-escape.json => ident-with-escape.qapi} (100%)
>  delete mode 100644 tests/qapi-schema/include-before-err.json
>  create mode 100644 tests/qapi-schema/include-before-err.qapi
>  delete mode 100644 tests/qapi-schema/include-cycle-b.json
>  create mode 100644 tests/qapi-schema/include-cycle-b.qapi
>  delete mode 100644 tests/qapi-schema/include-cycle-c.json
>  create mode 100644 tests/qapi-schema/include-cycle-c.qapi
>  delete mode 100644 tests/qapi-schema/include-cycle.json
>  create mode 100644 tests/qapi-schema/include-cycle.qapi
>  delete mode 100644 tests/qapi-schema/include-extra-junk.json
>  create mode 100644 tests/qapi-schema/include-extra-junk.qapi
>  delete mode 100644 tests/qapi-schema/include-format-err.json
>  create mode 100644 tests/qapi-schema/include-format-err.qapi
>  delete mode 100644 tests/qapi-schema/include-nested-err.json
>  create mode 100644 tests/qapi-schema/include-nested-err.qapi
>  delete mode 100644 tests/qapi-schema/include-no-file.json
>  create mode 100644 tests/qapi-schema/include-no-file.qapi
>  rename tests/qapi-schema/{include-non-file.json => include-non-file.qapi} (100%)
>  rename tests/qapi-schema/{include-relpath-sub.json => include-relpath-sub.qapi} (100%)
>  delete mode 100644 tests/qapi-schema/include-relpath.json
>  create mode 100644 tests/qapi-schema/include-relpath.qapi
>  delete mode 100644 tests/qapi-schema/include-repetition-sub.json
>  create mode 100644 tests/qapi-schema/include-repetition-sub.qapi
>  delete mode 100644 tests/qapi-schema/include-repetition.json
>  create mode 100644 tests/qapi-schema/include-repetition.qapi
>  delete mode 100644 tests/qapi-schema/include-self-cycle.json
>  create mode 100644 tests/qapi-schema/include-self-cycle.qapi
>  rename tests/qapi-schema/{include-simple-sub.json => include-simple-sub.qapi} (100%)
>  delete mode 100644 tests/qapi-schema/include-simple.json
>  create mode 100644 tests/qapi-schema/include-simple.qapi
>  delete mode 100644 tests/qapi-schema/include/relpath.json
>  create mode 100644 tests/qapi-schema/include/relpath.qapi
>  rename tests/qapi-schema/{indented-expr.json => indented-expr.qapi} (100%)
>  rename tests/qapi-schema/{leading-comma-list.json => leading-comma-list.qapi} (100%)
>  rename tests/qapi-schema/{leading-comma-object.json => leading-comma-object.qapi} (100%)
>  rename tests/qapi-schema/{missing-colon.json => missing-colon.qapi} (100%)
>  rename tests/qapi-schema/{missing-comma-list.json => missing-comma-list.qapi} (100%)
>  rename tests/qapi-schema/{missing-comma-object.json => missing-comma-object.qapi} (100%)
>  rename tests/qapi-schema/{missing-type.json => missing-type.qapi} (100%)
>  rename tests/qapi-schema/{nested-struct-data.json => nested-struct-data.qapi} (100%)
>  rename tests/qapi-schema/{non-objects.json => non-objects.qapi} (100%)
>  rename tests/qapi-schema/{oob-test.json => oob-test.qapi} (100%)
>  rename tests/qapi-schema/{pragma-doc-required-crap.json => pragma-doc-required-crap.qapi} (100%)
>  rename tests/qapi-schema/{pragma-extra-junk.json => pragma-extra-junk.qapi} (100%)
>  rename tests/qapi-schema/{pragma-name-case-whitelist-crap.json => pragma-name-case-whitelist-crap.qapi} (100%)
>  rename tests/qapi-schema/{pragma-non-dict.json => pragma-non-dict.qapi} (100%)
>  rename tests/qapi-schema/{pragma-returns-whitelist-crap.json => pragma-returns-whitelist-crap.qapi} (100%)
>  rename tests/qapi-schema/{qapi-schema-test.json => qapi-schema-test.qapi} (100%)
>  rename tests/qapi-schema/{quoted-structural-chars.json => quoted-structural-chars.qapi} (100%)
>  rename tests/qapi-schema/{redefined-builtin.json => redefined-builtin.qapi} (100%)
>  rename tests/qapi-schema/{redefined-command.json => redefined-command.qapi} (100%)
>  rename tests/qapi-schema/{redefined-event.json => redefined-event.qapi} (100%)
>  rename tests/qapi-schema/{redefined-type.json => redefined-type.qapi} (100%)
>  rename tests/qapi-schema/{reserved-command-q.json => reserved-command-q.qapi} (100%)
>  rename tests/qapi-schema/{reserved-enum-q.json => reserved-enum-q.qapi} (100%)
>  rename tests/qapi-schema/{reserved-member-has.json => reserved-member-has.qapi} (100%)
>  rename tests/qapi-schema/{reserved-member-q.json => reserved-member-q.qapi} (100%)
>  rename tests/qapi-schema/{reserved-member-u.json => reserved-member-u.qapi} (100%)
>  rename tests/qapi-schema/{reserved-member-underscore.json => reserved-member-underscore.qapi} (100%)
>  rename tests/qapi-schema/{reserved-type-kind.json => reserved-type-kind.qapi} (100%)
>  rename tests/qapi-schema/{reserved-type-list.json => reserved-type-list.qapi} (100%)
>  rename tests/qapi-schema/{returns-alternate.json => returns-alternate.qapi} (100%)
>  rename tests/qapi-schema/{returns-array-bad.json => returns-array-bad.qapi} (100%)
>  rename tests/qapi-schema/{returns-dict.json => returns-dict.qapi} (100%)
>  rename tests/qapi-schema/{returns-unknown.json => returns-unknown.qapi} (100%)
>  rename tests/qapi-schema/{returns-whitelist.json => returns-whitelist.qapi} (100%)
>  rename tests/qapi-schema/{struct-base-clash-deep.json => struct-base-clash-deep.qapi} (100%)
>  rename tests/qapi-schema/{struct-base-clash.json => struct-base-clash.qapi} (100%)
>  rename tests/qapi-schema/{struct-data-invalid.json => struct-data-invalid.qapi} (100%)
>  rename tests/qapi-schema/{struct-member-invalid.json => struct-member-invalid.qapi} (100%)
>  rename tests/qapi-schema/{trailing-comma-list.json => trailing-comma-list.qapi} (100%)
>  rename tests/qapi-schema/{trailing-comma-object.json => trailing-comma-object.qapi} (100%)
>  rename tests/qapi-schema/{type-bypass-bad-gen.json => type-bypass-bad-gen.qapi} (100%)
>  rename tests/qapi-schema/{unclosed-list.json => unclosed-list.qapi} (100%)
>  rename tests/qapi-schema/{unclosed-object.json => unclosed-object.qapi} (100%)
>  rename tests/qapi-schema/{unclosed-string.json => unclosed-string.qapi} (100%)
>  rename tests/qapi-schema/{unicode-str.json => unicode-str.qapi} (100%)
>  rename tests/qapi-schema/{union-base-empty.json => union-base-empty.qapi} (100%)
>  rename tests/qapi-schema/{union-base-no-discriminator.json => union-base-no-discriminator.qapi} (100%)
>  rename tests/qapi-schema/{union-branch-case.json => union-branch-case.qapi} (100%)
>  rename tests/qapi-schema/{union-clash-branches.json => union-clash-branches.qapi} (100%)
>  rename tests/qapi-schema/{union-empty.json => union-empty.qapi} (100%)
>  rename tests/qapi-schema/{union-invalid-base.json => union-invalid-base.qapi} (100%)
>  rename tests/qapi-schema/{union-optional-branch.json => union-optional-branch.qapi} (100%)
>  rename tests/qapi-schema/{union-unknown.json => union-unknown.qapi} (100%)
>  rename tests/qapi-schema/{unknown-escape.json => unknown-escape.qapi} (100%)
>  rename tests/qapi-schema/{unknown-expr-key.json => unknown-expr-key.qapi} (100%)
> 
> diff --git a/docs/devel/blkdebug.txt b/docs/devel/blkdebug.txt
> index 43d8e8f9c63..33b56daad1b 100644
> --- a/docs/devel/blkdebug.txt
> +++ b/docs/devel/blkdebug.txt
> @@ -92,7 +92,7 @@ The core events are:
> 
>    flush_to_disk - flush the host block device's disk cache
> 
> -See qapi/block-core.json:BlkdebugEvent for the full list of events.
> +See qapi/block-core.qapi:BlkdebugEvent for the full list of events.
>  You may need to grep block driver source code to understand the
>  meaning of specific events.
> 
> diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
> index a569d247455..4a5af251269 100644
> --- a/docs/devel/qapi-code-gen.txt
> +++ b/docs/devel/qapi-code-gen.txt
> @@ -293,7 +293,7 @@ Usage: { 'include': STRING }
> 
>  The QAPI schema definitions can be modularized using the 'include' directive:
> 
> - { 'include': 'path/to/file.json' }
> + { 'include': 'path/to/file.qapi' }
> 
>  The directive is evaluated recursively, and include paths are relative to the
>  file using the directive. Multiple includes of the same file are
> @@ -961,7 +961,7 @@ list of that type as a parameter, and returns a single element of that
>  type.  The user is responsible for writing the implementation of
>  qmp_my_command(); everything else is produced by the generator.
> 
> -    $ cat example-schema.json
> +    $ cat example-schema.qapi
>      { 'struct': 'UserDefOne',
>        'data': { 'integer': 'int', '*string': 'str' } }
> 
> @@ -977,7 +977,7 @@ We run qapi-gen.py like this:
>      --prefix="example-" example-schema.json
> 
>  For a more thorough look at generated code, the testsuite includes
> -tests/qapi-schema/qapi-schema-tests.json that covers more examples of
> +tests/qapi-schema/qapi-schema-tests.qapi that covers more examples of
>  what the generator will accept, and compiles the resulting C code as
>  part of 'make check-unit'.
> 
> diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst
> index 0ca1a2d4b58..b7a1211591c 100644
> --- a/docs/devel/testing.rst
> +++ b/docs/devel/testing.rst
> @@ -132,7 +132,7 @@ output.
>  The input/output data is managed under the ``tests/qapi-schema`` directory.
>  Each test case includes four files that have a common base name:
> 
> -  * ``${casename}.json`` - the file contains the JSON input for feeding the
> +  * ``${casename}.qapi`` - the file contains the JSON input for feeding the
>      parser
>    * ``${casename}.out`` - the file contains the expected stdout from the parser
>    * ``${casename}.err`` - the file contains the expected stderr from the parser
> @@ -147,7 +147,7 @@ parser (either fixing a bug or extending/modifying the syntax). To do this:
> 
>  2. Add the new test in ``tests/Makefile.include``. For example:
> 
> -  ``qapi-schema += foo.json``
> +  ``qapi-schema += foo.qapi``
> 
>  check-block
>  -----------
> diff --git a/docs/devel/writing-qmp-commands.txt b/docs/devel/writing-qmp-commands.txt
> index 1cd3dbf48ac..056b9fa081f 100644
> --- a/docs/devel/writing-qmp-commands.txt
> +++ b/docs/devel/writing-qmp-commands.txt
> @@ -89,7 +89,7 @@ Our command will be called "hello-world". It takes no arguments, nor does it
>  return any data.
> 
>  The first step is defining the command in the appropriate QAPI schema
> -module.  We pick module qapi/misc.json, and add the following line at
> +module.  We pick module qapi/misc.qapi, and add the following line at
>  the bottom:
> 
>  { 'command': 'hello-world' }
> @@ -239,7 +239,7 @@ There's only one step missing to make "hello-world"'s implementation complete,
>  and that's its documentation in the schema file.
> 
>  There are many examples of such documentation in the schema file already, but
> -here goes "hello-world"'s new entry for qapi/misc.json:
> +here goes "hello-world"'s new entry for qapi/misc.qapi:
> 
>  ##
>  # @hello-world
> diff --git a/docs/interop/live-block-operations.rst b/docs/interop/live-block-operations.rst
> index 734252bc804..f2967ad9514 100644
> --- a/docs/interop/live-block-operations.rst
> +++ b/docs/interop/live-block-operations.rst
> @@ -20,7 +20,7 @@ primitives, and some (non-exhaustive list of) examples to illustrate
>  their use.
> 
>  .. note::
> -    The file ``qapi/block-core.json`` in the QEMU source tree has the
> +    The file ``qapi/block-core.qapi`` in the QEMU source tree has the
>      canonical QEMU API (QAPI) schema documentation for the QMP
>      primitives discussed here.
> 
> @@ -54,7 +54,7 @@ files in a disk image backing chain:
>  (1) Directional: 'base' and 'top'.  Given the simple disk image chain
>      above, image [A] can be referred to as 'base', and image [B] as
>      'top'.  (This terminology can be seen in in QAPI schema file,
> -    block-core.json.)
> +    block-core.qapi.)
> 
>  (2) Relational: 'backing file' and 'overlay'.  Again, taking the same
>      simple disk image chain from the above, disk image [A] is referred
> diff --git a/docs/interop/qmp-intro.txt b/docs/interop/qmp-intro.txt
> index 19ac6c573b6..705ee520073 100644
> --- a/docs/interop/qmp-intro.txt
> +++ b/docs/interop/qmp-intro.txt
> @@ -79,7 +79,7 @@ Escape character is '^]'.
>  }
> 
>  Please refer to docs/interop/qemu-qmp-ref.* for a complete command
> -reference, generated from qapi/qmp-schema.json.
> +reference, generated from qapi/qmp-schema.qapi.
> 
>  QMP wiki page
>  -------------
> diff --git a/Makefile b/Makefile
> index f5c2ace8b30..428ac423fba 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -571,27 +571,27 @@ qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h \
>  qga/qapi-generated/qga-qapi-commands.h qga/qapi-generated/qga-qapi-commands.c \
>  qga/qapi-generated/qga-qapi-doc.texi: \
>  qga/qapi-generated/qga-gen-timestamp ;
> -qga/qapi-generated/qga-gen-timestamp: $(SRC_PATH)/qapi/qga-schema.json $(qapi-py)
> +qga/qapi-generated/qga-gen-timestamp: $(SRC_PATH)/qapi/qga-schema.qapi $(qapi-py)
>  	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
>  		-o qga/qapi-generated -p "qga-" $<, \
>  		"GEN","$(@:%-timestamp=%)")
>  	@>$@
> 
> -qmp-modules = $(SRC_PATH)/qapi/qmp-schema.json $(SRC_PATH)/qapi/common.json \
> -               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
> -               $(SRC_PATH)/qapi/char.json \
> -               $(SRC_PATH)/qapi/crypto.json \
> -               $(SRC_PATH)/qapi/introspect.json \
> -               $(SRC_PATH)/qapi/migration.json \
> -               $(SRC_PATH)/qapi/misc.json \
> -               $(SRC_PATH)/qapi/net.json \
> -               $(SRC_PATH)/qapi/rocker.json \
> -               $(SRC_PATH)/qapi/run-state.json \
> -               $(SRC_PATH)/qapi/sockets.json \
> -               $(SRC_PATH)/qapi/tpm.json \
> -               $(SRC_PATH)/qapi/trace.json \
> -               $(SRC_PATH)/qapi/transaction.json \
> -               $(SRC_PATH)/qapi/ui.json
> +qmp-modules = $(SRC_PATH)/qapi/qmp-schema.qapi $(SRC_PATH)/qapi/common.qapi \
> +               $(SRC_PATH)/qapi/block.qapi $(SRC_PATH)/qapi/block-core.qapi \
> +               $(SRC_PATH)/qapi/char.qapi \
> +               $(SRC_PATH)/qapi/crypto.qapi \
> +               $(SRC_PATH)/qapi/introspect.qapi \
> +               $(SRC_PATH)/qapi/migration.qapi \
> +               $(SRC_PATH)/qapi/misc.qapi \
> +               $(SRC_PATH)/qapi/net.qapi \
> +               $(SRC_PATH)/qapi/rocker.qapi \
> +               $(SRC_PATH)/qapi/run-state.qapi \
> +               $(SRC_PATH)/qapi/sockets.qapi \
> +               $(SRC_PATH)/qapi/tpm.qapi \
> +               $(SRC_PATH)/qapi/trace.qapi \
> +               $(SRC_PATH)/qapi/transaction.qapi \
> +               $(SRC_PATH)/qapi/ui.qapi
> 
>  qapi/qapi-builtin-types.c qapi/qapi-builtin-types.h \
>  qapi/qapi-types.c qapi/qapi-types.h \
> diff --git a/qapi/block-core.json b/qapi/block-core.qapi
> similarity index 99%
> rename from qapi/block-core.json
> rename to qapi/block-core.qapi
> index c50517bff31..228060a137c 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.qapi
> @@ -4,9 +4,9 @@
>  # == Block core (VM unrelated)
>  ##
> 
> -{ 'include': 'common.json' }
> -{ 'include': 'crypto.json' }
> -{ 'include': 'sockets.json' }
> +{ 'include': 'common.qapi' }
> +{ 'include': 'crypto.qapi' }
> +{ 'include': 'sockets.qapi' }
> 
>  ##
>  # @SnapshotInfo:
> diff --git a/qapi/block.json b/qapi/block.qapi
> similarity index 99%
> rename from qapi/block.json
> rename to qapi/block.qapi
> index c6945240029..da85ef68886 100644
> --- a/qapi/block.json
> +++ b/qapi/block.qapi
> @@ -4,7 +4,7 @@
>  # = Block devices
>  ##
> 
> -{ 'include': 'block-core.json' }
> +{ 'include': 'block-core.qapi' }
> 
>  ##
>  # == Additional block stuff (VM related)
> diff --git a/qapi/char.json b/qapi/char.qapi
> similarity index 99%
> rename from qapi/char.json
> rename to qapi/char.qapi
> index ae19dcd1ed1..45901fb4502 100644
> --- a/qapi/char.json
> +++ b/qapi/char.qapi
> @@ -5,7 +5,7 @@
>  # = Character devices
>  ##
> 
> -{ 'include': 'sockets.json' }
> +{ 'include': 'sockets.qapi' }
> 
>  ##
>  # @ChardevInfo:
> diff --git a/qapi/common.json b/qapi/common.qapi
> similarity index 100%
> rename from qapi/common.json
> rename to qapi/common.qapi
> diff --git a/qapi/crypto.json b/qapi/crypto.qapi
> similarity index 100%
> rename from qapi/crypto.json
> rename to qapi/crypto.qapi
> diff --git a/qapi/introspect.json b/qapi/introspect.qapi
> similarity index 100%
> rename from qapi/introspect.json
> rename to qapi/introspect.qapi
> diff --git a/qapi/migration.json b/qapi/migration.qapi
> similarity index 99%
> rename from qapi/migration.json
> rename to qapi/migration.qapi
> index 9d0bf82cf46..dc64952ec4f 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.qapi
> @@ -5,7 +5,7 @@
>  # = Migration
>  ##
> 
> -{ 'include': 'common.json' }
> +{ 'include': 'common.qapi' }
> 
>  ##
>  # @MigrationStats:
> diff --git a/qapi/misc.json b/qapi/misc.qapi
> similarity index 100%
> rename from qapi/misc.json
> rename to qapi/misc.qapi
> diff --git a/qapi/net.json b/qapi/net.qapi
> similarity index 99%
> rename from qapi/net.json
> rename to qapi/net.qapi
> index 9117c569723..b28451758a8 100644
> --- a/qapi/net.json
> +++ b/qapi/net.qapi
> @@ -5,7 +5,7 @@
>  # = Net devices
>  ##
> 
> -{ 'include': 'common.json' }
> +{ 'include': 'common.qapi' }
> 
>  ##
>  # @set_link:
> diff --git a/qapi/qga-schema.json b/qapi/qga-schema.qapi
> similarity index 100%
> rename from qapi/qga-schema.json
> rename to qapi/qga-schema.qapi
> diff --git a/qapi/qmp-schema.json b/qapi/qmp-schema.qapi
> similarity index 88%
> rename from qapi/qmp-schema.json
> rename to qapi/qmp-schema.qapi
> index 25bce78352b..067a61fa6f3 100644
> --- a/qapi/qmp-schema.json
> +++ b/qapi/qmp-schema.qapi
> @@ -78,18 +78,18 @@
>  # stable order, it's best to include each sub-schema just once, or
>  # include it first right here.
> 
> -{ 'include': 'common.json' }
> -{ 'include': 'sockets.json' }
> -{ 'include': 'run-state.json' }
> -{ 'include': 'crypto.json' }
> -{ 'include': 'block.json' }
> -{ 'include': 'char.json' }
> -{ 'include': 'net.json' }
> -{ 'include': 'rocker.json' }
> -{ 'include': 'tpm.json' }
> -{ 'include': 'ui.json' }
> -{ 'include': 'migration.json' }
> -{ 'include': 'transaction.json' }
> -{ 'include': 'trace.json' }
> -{ 'include': 'introspect.json' }
> -{ 'include': 'misc.json' }
> +{ 'include': 'common.qapi' }
> +{ 'include': 'sockets.qapi' }
> +{ 'include': 'run-state.qapi' }
> +{ 'include': 'crypto.qapi' }
> +{ 'include': 'block.qapi' }
> +{ 'include': 'char.qapi' }
> +{ 'include': 'net.qapi' }
> +{ 'include': 'rocker.qapi' }
> +{ 'include': 'tpm.qapi' }
> +{ 'include': 'ui.qapi' }
> +{ 'include': 'migration.qapi' }
> +{ 'include': 'transaction.qapi' }
> +{ 'include': 'trace.qapi' }
> +{ 'include': 'introspect.qapi' }
> +{ 'include': 'misc.qapi' }
> diff --git a/qapi/rocker.json b/qapi/rocker.qapi
> similarity index 100%
> rename from qapi/rocker.json
> rename to qapi/rocker.qapi
> diff --git a/qapi/run-state.json b/qapi/run-state.qapi
> similarity index 100%
> rename from qapi/run-state.json
> rename to qapi/run-state.qapi
> diff --git a/qapi/sockets.json b/qapi/sockets.qapi
> similarity index 99%
> rename from qapi/sockets.json
> rename to qapi/sockets.qapi
> index fc81d8d5e8b..e58db0b8b03 100644
> --- a/qapi/sockets.json
> +++ b/qapi/sockets.qapi
> @@ -4,7 +4,7 @@
>  # = Socket data types
>  ##
> 
> -{ 'include': 'common.json' }
> +{ 'include': 'common.qapi' }
> 
>  ##
>  # @NetworkAddressFamily:
> diff --git a/qapi/tpm.json b/qapi/tpm.qapi
> similarity index 100%
> rename from qapi/tpm.json
> rename to qapi/tpm.qapi
> diff --git a/qapi/trace.json b/qapi/trace.qapi
> similarity index 100%
> rename from qapi/trace.json
> rename to qapi/trace.qapi
> diff --git a/qapi/transaction.json b/qapi/transaction.qapi
> similarity index 99%
> rename from qapi/transaction.json
> rename to qapi/transaction.qapi
> index bd312792dae..49118f49f1d 100644
> --- a/qapi/transaction.json
> +++ b/qapi/transaction.qapi
> @@ -5,7 +5,7 @@
>  # = Transactions
>  ##
> 
> -{ 'include': 'block.json' }
> +{ 'include': 'block.qapi' }
> 
>  ##
>  # @Abort:
> diff --git a/qapi/ui.json b/qapi/ui.qapi
> similarity index 99%
> rename from qapi/ui.json
> rename to qapi/ui.qapi
> index 5d01ad43045..cb8b7a86d1c 100644
> --- a/qapi/ui.json
> +++ b/qapi/ui.qapi
> @@ -5,7 +5,7 @@
>  # = Remote desktop
>  ##
> 
> -{ 'include': 'sockets.json' }
> +{ 'include': 'sockets.qapi' }
> 
>  ##
>  # @set_password:
> diff --git a/include/crypto/block.h b/include/crypto/block.h
> index cd18f46d56d..ccab4d2df8b 100644
> --- a/include/crypto/block.h
> +++ b/include/crypto/block.h
> @@ -27,7 +27,7 @@
>  typedef struct QCryptoBlock QCryptoBlock;
> 
>  /* See also QCryptoBlockFormat, QCryptoBlockCreateOptions
> - * and QCryptoBlockOpenOptions in qapi/crypto.json */
> + * and QCryptoBlockOpenOptions in qapi/crypto.qapi */
> 
>  typedef ssize_t (*QCryptoBlockReadFunc)(QCryptoBlock *block,
>                                          size_t offset,
> diff --git a/include/crypto/cipher.h b/include/crypto/cipher.h
> index bce2d4c8e46..287c921874d 100644
> --- a/include/crypto/cipher.h
> +++ b/include/crypto/cipher.h
> @@ -26,7 +26,7 @@
>  typedef struct QCryptoCipher QCryptoCipher;
> 
>  /* See also "QCryptoCipherAlgorithm" and "QCryptoCipherMode"
> - * enums defined in qapi/crypto.json */
> + * enums defined in qapi/crypto.qapi */
> 
>  /**
>   * QCryptoCipher:
> diff --git a/include/crypto/hash.h b/include/crypto/hash.h
> index 077ac7bea0e..d9ee11f5224 100644
> --- a/include/crypto/hash.h
> +++ b/include/crypto/hash.h
> @@ -23,7 +23,7 @@
> 
>  #include "qapi/qapi-types-crypto.h"
> 
> -/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.json */
> +/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.qapi */
> 
>  /**
>   * qcrypto_hash_supports:
> diff --git a/include/crypto/ivgen.h b/include/crypto/ivgen.h
> index 0350cd2a930..0609f4f1f94 100644
> --- a/include/crypto/ivgen.h
> +++ b/include/crypto/ivgen.h
> @@ -97,7 +97,7 @@
> 
>  typedef struct QCryptoIVGen QCryptoIVGen;
> 
> -/* See also QCryptoIVGenAlgorithm enum in qapi/crypto.json */
> +/* See also QCryptoIVGenAlgorithm enum in qapi/crypto.qapi */
> 
> 
>  /**
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 4a4b7aa2a64..cf2c0de6cd2 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1380,8 +1380,8 @@ M: Markus Armbruster <armbru@redhat.com>
>  S: Supported
>  F: blockdev.c
>  F: block/qapi.c
> -F: qapi/block*.json
> -F: qapi/transaction.json
> +F: qapi/block*.qapi
> +F: qapi/transaction.qapi
>  T: git git://repo.or.cz/qemu/armbru.git block-next
> 
>  Dirty Bitmaps
> @@ -1404,7 +1404,7 @@ M: Marc-André Lureau <marcandre.lureau@redhat.com>
>  S: Maintained
>  F: chardev/
>  F: include/chardev/
> -F: qapi/char.json
> +F: qapi/char.qapi
> 
>  Character Devices (Braille)
>  M: Samuel Thibault <samuel.thibault@ens-lyon.org>
> @@ -1482,14 +1482,14 @@ F: include/ui/spice-display.h
>  F: ui/spice-*.c
>  F: audio/spiceaudio.c
>  F: hw/display/qxl*
> -F: qapi/ui.json
> +F: qapi/ui.qapi
> 
>  Graphics
>  M: Gerd Hoffmann <kraxel@redhat.com>
>  S: Odd Fixes
>  F: ui/
>  F: include/ui/
> -F: qapi/ui.json
> +F: qapi/ui.qapi
> 
>  Cocoa graphics
>  M: Peter Maydell <peter.maydell@linaro.org>
> @@ -1503,7 +1503,7 @@ F: cpus.c
>  F: util/main-loop.c
>  F: util/qemu-timer.c
>  F: vl.c
> -F: qapi/run-state.json
> +F: qapi/run-state.qapi
> 
>  Human Monitor (HMP)
>  M: Dr. David Alan Gilbert <dgilbert@redhat.com>
> @@ -1520,7 +1520,7 @@ S: Maintained
>  F: net/
>  F: include/net/
>  T: git git://github.com/jasowang/qemu.git net
> -F: qapi/net.json
> +F: qapi/net.qapi
> 
>  Netmap network backend
>  M: Luigi Rizzo <rizzo@iet.unipi.it>
> @@ -1564,7 +1564,7 @@ M: Markus Armbruster <armbru@redhat.com>
>  M: Michael Roth <mdroth@linux.vnet.ibm.com>
>  S: Supported
>  F: qapi/
> -X: qapi/*.json
> +X: qapi/*.qapi
>  F: include/qapi/
>  X: include/qapi/qmp/
>  F: include/qapi/qmp/dispatch.h
> @@ -1581,7 +1581,7 @@ QAPI Schema
>  M: Eric Blake <eblake@redhat.com>
>  M: Markus Armbruster <armbru@redhat.com>
>  S: Supported
> -F: qapi/*.json
> +F: qapi/*.qapi
>  T: git git://repo.or.cz/qemu/armbru.git qapi-next
> 
>  QObject
> @@ -1602,7 +1602,7 @@ QEMU Guest Agent
>  M: Michael Roth <mdroth@linux.vnet.ibm.com>
>  S: Maintained
>  F: qga/
> -F: qapi/qga-schema.json
> +F: qapi/qga-schema.qapi
>  F: qemu-ga.texi
>  F: scripts/qemu-guest-agent/
>  F: tests/test-qga.c
> @@ -1669,7 +1669,7 @@ F: stubs/tpm.c
>  F: hw/tpm/*
>  F: include/hw/acpi/tpm.h
>  F: include/sysemu/tpm*
> -F: qapi/tpm.json
> +F: qapi/tpm.qapi
>  F: backends/tpm.c
>  F: tests/*tpm*
>  T: git git://github.com/stefanberger/qemu-tpm.git tpm-next
> @@ -1688,7 +1688,7 @@ F: scripts/vmstate-static-checker.py
>  F: tests/vmstate-static-checker-data/
>  F: tests/migration-test.c
>  F: docs/devel/migration.txt
> -F: qapi/migration.json
> +F: qapi/migration.qapi
> 
>  Seccomp
>  M: Eduardo Otubo <otubo@redhat.com>
> @@ -1732,7 +1732,7 @@ M: Paolo Bonzini <pbonzini@redhat.com>
>  S: Maintained
>  F: include/qemu/sockets.h
>  F: util/qemu-sockets.c
> -F: qapi/sockets.json
> +F: qapi/sockets.qapi
> 
>  Throttling infrastructure
>  M: Alberto Garcia <berto@igalia.com>
> diff --git a/scripts/git.orderfile b/scripts/git.orderfile
> index ac699700b18..1549511d877 100644
> --- a/scripts/git.orderfile
> +++ b/scripts/git.orderfile
> @@ -19,7 +19,7 @@ Makefile*
>  *.mak
> 
>  # qapi schema
> -*.json
> +*.qapi
> 
>  # headers
>  *.h
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 3b9a5e31a2c..21abab15acd 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -404,171 +404,171 @@ check-qtest-generic-y += tests/machine-none-test$(EXESUF)
>  check-qtest-generic-y += tests/qom-test$(EXESUF)
>  check-qtest-generic-y += tests/test-hmp$(EXESUF)
> 
> -qapi-schema += alternate-any.json
> -qapi-schema += alternate-array.json
> -qapi-schema += alternate-base.json
> -qapi-schema += alternate-clash.json
> -qapi-schema += alternate-conflict-dict.json
> -qapi-schema += alternate-conflict-enum-bool.json
> -qapi-schema += alternate-conflict-enum-int.json
> -qapi-schema += alternate-conflict-string.json
> -qapi-schema += alternate-conflict-bool-string.json
> -qapi-schema += alternate-conflict-num-string.json
> -qapi-schema += alternate-empty.json
> -qapi-schema += alternate-nested.json
> -qapi-schema += alternate-unknown.json
> -qapi-schema += args-alternate.json
> -qapi-schema += args-any.json
> -qapi-schema += args-array-empty.json
> -qapi-schema += args-array-unknown.json
> -qapi-schema += args-bad-boxed.json
> -qapi-schema += args-boxed-anon.json
> -qapi-schema += args-boxed-empty.json
> -qapi-schema += args-boxed-string.json
> -qapi-schema += args-int.json
> -qapi-schema += args-invalid.json
> -qapi-schema += args-member-array-bad.json
> -qapi-schema += args-member-case.json
> -qapi-schema += args-member-unknown.json
> -qapi-schema += args-name-clash.json
> -qapi-schema += args-union.json
> -qapi-schema += args-unknown.json
> -qapi-schema += bad-base.json
> -qapi-schema += bad-data.json
> -qapi-schema += bad-ident.json
> -qapi-schema += bad-type-bool.json
> -qapi-schema += bad-type-dict.json
> -qapi-schema += bad-type-int.json
> -qapi-schema += base-cycle-direct.json
> -qapi-schema += base-cycle-indirect.json
> -qapi-schema += command-int.json
> -qapi-schema += comments.json
> -qapi-schema += doc-bad-alternate-member.json
> -qapi-schema += doc-bad-command-arg.json
> -qapi-schema += doc-bad-section.json
> -qapi-schema += doc-bad-symbol.json
> -qapi-schema += doc-bad-union-member.json
> -qapi-schema += doc-before-include.json
> -qapi-schema += doc-before-pragma.json
> -qapi-schema += doc-duplicated-arg.json
> -qapi-schema += doc-duplicated-return.json
> -qapi-schema += doc-duplicated-since.json
> -qapi-schema += doc-empty-arg.json
> -qapi-schema += doc-empty-section.json
> -qapi-schema += doc-empty-symbol.json
> -qapi-schema += doc-good.json
> -qapi-schema += doc-interleaved-section.json
> -qapi-schema += doc-invalid-end.json
> -qapi-schema += doc-invalid-end2.json
> -qapi-schema += doc-invalid-return.json
> -qapi-schema += doc-invalid-section.json
> -qapi-schema += doc-invalid-start.json
> -qapi-schema += doc-missing-colon.json
> -qapi-schema += doc-missing-expr.json
> -qapi-schema += doc-missing-space.json
> -qapi-schema += doc-missing.json
> -qapi-schema += doc-no-symbol.json
> -qapi-schema += double-data.json
> -qapi-schema += double-type.json
> -qapi-schema += duplicate-key.json
> -qapi-schema += empty.json
> -qapi-schema += enum-bad-name.json
> -qapi-schema += enum-bad-prefix.json
> -qapi-schema += enum-clash-member.json
> -qapi-schema += enum-dict-member.json
> -qapi-schema += enum-int-member.json
> -qapi-schema += enum-member-case.json
> -qapi-schema += enum-missing-data.json
> -qapi-schema += enum-wrong-data.json
> -qapi-schema += escape-outside-string.json
> -qapi-schema += escape-too-big.json
> -qapi-schema += escape-too-short.json
> -qapi-schema += event-boxed-empty.json
> -qapi-schema += event-case.json
> -qapi-schema += event-nest-struct.json
> -qapi-schema += flat-union-array-branch.json
> -qapi-schema += flat-union-bad-base.json
> -qapi-schema += flat-union-bad-discriminator.json
> -qapi-schema += flat-union-base-any.json
> -qapi-schema += flat-union-base-union.json
> -qapi-schema += flat-union-clash-member.json
> -qapi-schema += flat-union-empty.json
> -qapi-schema += flat-union-incomplete-branch.json
> -qapi-schema += flat-union-inline.json
> -qapi-schema += flat-union-int-branch.json
> -qapi-schema += flat-union-invalid-branch-key.json
> -qapi-schema += flat-union-invalid-discriminator.json
> -qapi-schema += flat-union-no-base.json
> -qapi-schema += flat-union-optional-discriminator.json
> -qapi-schema += flat-union-string-discriminator.json
> -qapi-schema += funny-char.json
> -qapi-schema += ident-with-escape.json
> -qapi-schema += include-before-err.json
> -qapi-schema += include-cycle.json
> -qapi-schema += include-extra-junk.json
> -qapi-schema += include-format-err.json
> -qapi-schema += include-nested-err.json
> -qapi-schema += include-no-file.json
> -qapi-schema += include-non-file.json
> -qapi-schema += include-relpath.json
> -qapi-schema += include-repetition.json
> -qapi-schema += include-self-cycle.json
> -qapi-schema += include-simple.json
> -qapi-schema += indented-expr.json
> -qapi-schema += leading-comma-list.json
> -qapi-schema += leading-comma-object.json
> -qapi-schema += missing-colon.json
> -qapi-schema += missing-comma-list.json
> -qapi-schema += missing-comma-object.json
> -qapi-schema += missing-type.json
> -qapi-schema += nested-struct-data.json
> -qapi-schema += non-objects.json
> -qapi-schema += oob-test.json
> -qapi-schema += pragma-doc-required-crap.json
> -qapi-schema += pragma-extra-junk.json
> -qapi-schema += pragma-name-case-whitelist-crap.json
> -qapi-schema += pragma-non-dict.json
> -qapi-schema += pragma-returns-whitelist-crap.json
> -qapi-schema += qapi-schema-test.json
> -qapi-schema += quoted-structural-chars.json
> -qapi-schema += redefined-builtin.json
> -qapi-schema += redefined-command.json
> -qapi-schema += redefined-event.json
> -qapi-schema += redefined-type.json
> -qapi-schema += reserved-command-q.json
> -qapi-schema += reserved-enum-q.json
> -qapi-schema += reserved-member-has.json
> -qapi-schema += reserved-member-q.json
> -qapi-schema += reserved-member-u.json
> -qapi-schema += reserved-member-underscore.json
> -qapi-schema += reserved-type-kind.json
> -qapi-schema += reserved-type-list.json
> -qapi-schema += returns-alternate.json
> -qapi-schema += returns-array-bad.json
> -qapi-schema += returns-dict.json
> -qapi-schema += returns-unknown.json
> -qapi-schema += returns-whitelist.json
> -qapi-schema += struct-base-clash-deep.json
> -qapi-schema += struct-base-clash.json
> -qapi-schema += struct-data-invalid.json
> -qapi-schema += struct-member-invalid.json
> -qapi-schema += trailing-comma-list.json
> -qapi-schema += trailing-comma-object.json
> -qapi-schema += type-bypass-bad-gen.json
> -qapi-schema += unclosed-list.json
> -qapi-schema += unclosed-object.json
> -qapi-schema += unclosed-string.json
> -qapi-schema += unicode-str.json
> -qapi-schema += union-base-empty.json
> -qapi-schema += union-base-no-discriminator.json
> -qapi-schema += union-branch-case.json
> -qapi-schema += union-clash-branches.json
> -qapi-schema += union-empty.json
> -qapi-schema += union-invalid-base.json
> -qapi-schema += union-optional-branch.json
> -qapi-schema += union-unknown.json
> -qapi-schema += unknown-escape.json
> -qapi-schema += unknown-expr-key.json
> +qapi-schema += alternate-any.qapi
> +qapi-schema += alternate-array.qapi
> +qapi-schema += alternate-base.qapi
> +qapi-schema += alternate-clash.qapi
> +qapi-schema += alternate-conflict-dict.qapi
> +qapi-schema += alternate-conflict-enum-bool.qapi
> +qapi-schema += alternate-conflict-enum-int.qapi
> +qapi-schema += alternate-conflict-string.qapi
> +qapi-schema += alternate-conflict-bool-string.qapi
> +qapi-schema += alternate-conflict-num-string.qapi
> +qapi-schema += alternate-empty.qapi
> +qapi-schema += alternate-nested.qapi
> +qapi-schema += alternate-unknown.qapi
> +qapi-schema += args-alternate.qapi
> +qapi-schema += args-any.qapi
> +qapi-schema += args-array-empty.qapi
> +qapi-schema += args-array-unknown.qapi
> +qapi-schema += args-bad-boxed.qapi
> +qapi-schema += args-boxed-anon.qapi
> +qapi-schema += args-boxed-empty.qapi
> +qapi-schema += args-boxed-string.qapi
> +qapi-schema += args-int.qapi
> +qapi-schema += args-invalid.qapi
> +qapi-schema += args-member-array-bad.qapi
> +qapi-schema += args-member-case.qapi
> +qapi-schema += args-member-unknown.qapi
> +qapi-schema += args-name-clash.qapi
> +qapi-schema += args-union.qapi
> +qapi-schema += args-unknown.qapi
> +qapi-schema += bad-base.qapi
> +qapi-schema += bad-data.qapi
> +qapi-schema += bad-ident.qapi
> +qapi-schema += bad-type-bool.qapi
> +qapi-schema += bad-type-dict.qapi
> +qapi-schema += bad-type-int.qapi
> +qapi-schema += base-cycle-direct.qapi
> +qapi-schema += base-cycle-indirect.qapi
> +qapi-schema += command-int.qapi
> +qapi-schema += comments.qapi
> +qapi-schema += doc-bad-alternate-member.qapi
> +qapi-schema += doc-bad-command-arg.qapi
> +qapi-schema += doc-bad-section.qapi
> +qapi-schema += doc-bad-symbol.qapi
> +qapi-schema += doc-bad-union-member.qapi
> +qapi-schema += doc-before-include.qapi
> +qapi-schema += doc-before-pragma.qapi
> +qapi-schema += doc-duplicated-arg.qapi
> +qapi-schema += doc-duplicated-return.qapi
> +qapi-schema += doc-duplicated-since.qapi
> +qapi-schema += doc-empty-arg.qapi
> +qapi-schema += doc-empty-section.qapi
> +qapi-schema += doc-empty-symbol.qapi
> +qapi-schema += doc-good.qapi
> +qapi-schema += doc-interleaved-section.qapi
> +qapi-schema += doc-invalid-end.qapi
> +qapi-schema += doc-invalid-end2.qapi
> +qapi-schema += doc-invalid-return.qapi
> +qapi-schema += doc-invalid-section.qapi
> +qapi-schema += doc-invalid-start.qapi
> +qapi-schema += doc-missing-colon.qapi
> +qapi-schema += doc-missing-expr.qapi
> +qapi-schema += doc-missing-space.qapi
> +qapi-schema += doc-missing.qapi
> +qapi-schema += doc-no-symbol.qapi
> +qapi-schema += double-data.qapi
> +qapi-schema += double-type.qapi
> +qapi-schema += duplicate-key.qapi
> +qapi-schema += empty.qapi
> +qapi-schema += enum-bad-name.qapi
> +qapi-schema += enum-bad-prefix.qapi
> +qapi-schema += enum-clash-member.qapi
> +qapi-schema += enum-dict-member.qapi
> +qapi-schema += enum-int-member.qapi
> +qapi-schema += enum-member-case.qapi
> +qapi-schema += enum-missing-data.qapi
> +qapi-schema += enum-wrong-data.qapi
> +qapi-schema += escape-outside-string.qapi
> +qapi-schema += escape-too-big.qapi
> +qapi-schema += escape-too-short.qapi
> +qapi-schema += event-boxed-empty.qapi
> +qapi-schema += event-case.qapi
> +qapi-schema += event-nest-struct.qapi
> +qapi-schema += flat-union-array-branch.qapi
> +qapi-schema += flat-union-bad-base.qapi
> +qapi-schema += flat-union-bad-discriminator.qapi
> +qapi-schema += flat-union-base-any.qapi
> +qapi-schema += flat-union-base-union.qapi
> +qapi-schema += flat-union-clash-member.qapi
> +qapi-schema += flat-union-empty.qapi
> +qapi-schema += flat-union-incomplete-branch.qapi
> +qapi-schema += flat-union-inline.qapi
> +qapi-schema += flat-union-int-branch.qapi
> +qapi-schema += flat-union-invalid-branch-key.qapi
> +qapi-schema += flat-union-invalid-discriminator.qapi
> +qapi-schema += flat-union-no-base.qapi
> +qapi-schema += flat-union-optional-discriminator.qapi
> +qapi-schema += flat-union-string-discriminator.qapi
> +qapi-schema += funny-char.qapi
> +qapi-schema += ident-with-escape.qapi
> +qapi-schema += include-before-err.qapi
> +qapi-schema += include-cycle.qapi
> +qapi-schema += include-extra-junk.qapi
> +qapi-schema += include-format-err.qapi
> +qapi-schema += include-nested-err.qapi
> +qapi-schema += include-no-file.qapi
> +qapi-schema += include-non-file.qapi
> +qapi-schema += include-relpath.qapi
> +qapi-schema += include-repetition.qapi
> +qapi-schema += include-self-cycle.qapi
> +qapi-schema += include-simple.qapi
> +qapi-schema += indented-expr.qapi
> +qapi-schema += leading-comma-list.qapi
> +qapi-schema += leading-comma-object.qapi
> +qapi-schema += missing-colon.qapi
> +qapi-schema += missing-comma-list.qapi
> +qapi-schema += missing-comma-object.qapi
> +qapi-schema += missing-type.qapi
> +qapi-schema += nested-struct-data.qapi
> +qapi-schema += non-objects.qapi
> +qapi-schema += oob-test.qapi
> +qapi-schema += pragma-doc-required-crap.qapi
> +qapi-schema += pragma-extra-junk.qapi
> +qapi-schema += pragma-name-case-whitelist-crap.qapi
> +qapi-schema += pragma-non-dict.qapi
> +qapi-schema += pragma-returns-whitelist-crap.qapi
> +qapi-schema += qapi-schema-test.qapi
> +qapi-schema += quoted-structural-chars.qapi
> +qapi-schema += redefined-builtin.qapi
> +qapi-schema += redefined-command.qapi
> +qapi-schema += redefined-event.qapi
> +qapi-schema += redefined-type.qapi
> +qapi-schema += reserved-command-q.qapi
> +qapi-schema += reserved-enum-q.qapi
> +qapi-schema += reserved-member-has.qapi
> +qapi-schema += reserved-member-q.qapi
> +qapi-schema += reserved-member-u.qapi
> +qapi-schema += reserved-member-underscore.qapi
> +qapi-schema += reserved-type-kind.qapi
> +qapi-schema += reserved-type-list.qapi
> +qapi-schema += returns-alternate.qapi
> +qapi-schema += returns-array-bad.qapi
> +qapi-schema += returns-dict.qapi
> +qapi-schema += returns-unknown.qapi
> +qapi-schema += returns-whitelist.qapi
> +qapi-schema += struct-base-clash-deep.qapi
> +qapi-schema += struct-base-clash.qapi
> +qapi-schema += struct-data-invalid.qapi
> +qapi-schema += struct-member-invalid.qapi
> +qapi-schema += trailing-comma-list.qapi
> +qapi-schema += trailing-comma-object.qapi
> +qapi-schema += type-bypass-bad-gen.qapi
> +qapi-schema += unclosed-list.qapi
> +qapi-schema += unclosed-object.qapi
> +qapi-schema += unclosed-string.qapi
> +qapi-schema += unicode-str.qapi
> +qapi-schema += union-base-empty.qapi
> +qapi-schema += union-base-no-discriminator.qapi
> +qapi-schema += union-branch-case.qapi
> +qapi-schema += union-clash-branches.qapi
> +qapi-schema += union-empty.qapi
> +qapi-schema += union-invalid-base.qapi
> +qapi-schema += union-optional-branch.qapi
> +qapi-schema += union-unknown.qapi
> +qapi-schema += unknown-escape.qapi
> +qapi-schema += unknown-expr-key.qapi
> 
> 
>  check-qapi-schema-y := $(addprefix tests/qapi-schema/, $(qapi-schema))
> @@ -669,13 +669,13 @@ tests/test-qapi-commands.h tests/test-qapi-commands.c \
>  tests/test-qapi-events.c tests/test-qapi-events.h \
>  tests/test-qapi-introspect.c tests/test-qapi-introspect.h: \
>  tests/test-qapi-gen-timestamp ;
> -tests/test-qapi-gen-timestamp: $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(qapi-py)
> +tests/test-qapi-gen-timestamp: $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.qapi $(qapi-py)
>  	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
>  		-o tests -p "test-" $<, \
>  		"GEN","$(@:%-timestamp=%)")
>  	@>$@
> 
> -tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.json $(qapi-py)
> +tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.qapi $(qapi-py)
>  	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
>  		-o tests/qapi-schema -p "doc-good-" $<, \
>  		"GEN","$@")
> @@ -926,7 +926,7 @@ check-tests/qemu-iotests-quick.sh: tests/qemu-iotests-quick.sh qemu-img$(EXESUF)
>  	$<
> 
>  .PHONY: $(patsubst %, check-%, $(check-qapi-schema-y))
> -$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.json: $(SRC_PATH)/%.json
> +$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.qapi: $(SRC_PATH)/%.qapi
>  	$(call quiet-command, PYTHONPATH=$(SRC_PATH)/scripts \
>  		$(PYTHON_UTF8) $(SRC_PATH)/tests/qapi-schema/test-qapi.py \
>  		$^ >$*.test.out 2>$*.test.err; \
> diff --git a/tests/qapi-schema/alternate-any.err b/tests/qapi-schema/alternate-any.err
> index aaa01547310..bf762f9afe8 100644
> --- a/tests/qapi-schema/alternate-any.err
> +++ b/tests/qapi-schema/alternate-any.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-any.json:2: Alternate 'Alt' member 'one' cannot use type 'any'
> +tests/qapi-schema/alternate-any.qapi:2: Alternate 'Alt' member 'one' cannot use type 'any'
> diff --git a/tests/qapi-schema/alternate-any.json b/tests/qapi-schema/alternate-any.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-any.json
> rename to tests/qapi-schema/alternate-any.qapi
> diff --git a/tests/qapi-schema/alternate-array.err b/tests/qapi-schema/alternate-array.err
> index 7b930c64abf..0e4a14e59d0 100644
> --- a/tests/qapi-schema/alternate-array.err
> +++ b/tests/qapi-schema/alternate-array.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-array.json:5: Member 'two' of alternate 'Alt' cannot be an array
> +tests/qapi-schema/alternate-array.qapi:5: Member 'two' of alternate 'Alt' cannot be an array
> diff --git a/tests/qapi-schema/alternate-array.json b/tests/qapi-schema/alternate-array.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-array.json
> rename to tests/qapi-schema/alternate-array.qapi
> diff --git a/tests/qapi-schema/alternate-base.err b/tests/qapi-schema/alternate-base.err
> index 30d8a343734..9560f452eb3 100644
> --- a/tests/qapi-schema/alternate-base.err
> +++ b/tests/qapi-schema/alternate-base.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-base.json:4: Unknown key 'base' in alternate 'Alt'
> +tests/qapi-schema/alternate-base.qapi:4: Unknown key 'base' in alternate 'Alt'
> diff --git a/tests/qapi-schema/alternate-base.json b/tests/qapi-schema/alternate-base.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-base.json
> rename to tests/qapi-schema/alternate-base.qapi
> diff --git a/tests/qapi-schema/alternate-clash.err b/tests/qapi-schema/alternate-clash.err
> index 604d8495eb0..d5eb85a256c 100644
> --- a/tests/qapi-schema/alternate-clash.err
> +++ b/tests/qapi-schema/alternate-clash.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-clash.json:7: 'a_b' (branch of Alt1) collides with 'a-b' (branch of Alt1)
> +tests/qapi-schema/alternate-clash.qapi:7: 'a_b' (branch of Alt1) collides with 'a-b' (branch of Alt1)
> diff --git a/tests/qapi-schema/alternate-clash.json b/tests/qapi-schema/alternate-clash.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-clash.json
> rename to tests/qapi-schema/alternate-clash.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-bool-string.err b/tests/qapi-schema/alternate-conflict-bool-string.err
> index e52fee76201..800267a2124 100644
> --- a/tests/qapi-schema/alternate-conflict-bool-string.err
> +++ b/tests/qapi-schema/alternate-conflict-bool-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-bool-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-bool-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-bool-string.json b/tests/qapi-schema/alternate-conflict-bool-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-bool-string.json
> rename to tests/qapi-schema/alternate-conflict-bool-string.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-dict.err b/tests/qapi-schema/alternate-conflict-dict.err
> index 0f411f4faf5..2aeff136883 100644
> --- a/tests/qapi-schema/alternate-conflict-dict.err
> +++ b/tests/qapi-schema/alternate-conflict-dict.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-dict.json:6: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-dict.qapi:6: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-dict.json b/tests/qapi-schema/alternate-conflict-dict.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-dict.json
> rename to tests/qapi-schema/alternate-conflict-dict.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-enum-bool.err b/tests/qapi-schema/alternate-conflict-enum-bool.err
> index 0dfc00242d8..cf166d6a3d4 100644
> --- a/tests/qapi-schema/alternate-conflict-enum-bool.err
> +++ b/tests/qapi-schema/alternate-conflict-enum-bool.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-enum-bool.json:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-enum-bool.qapi:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-enum-bool.json b/tests/qapi-schema/alternate-conflict-enum-bool.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-enum-bool.json
> rename to tests/qapi-schema/alternate-conflict-enum-bool.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-enum-int.err b/tests/qapi-schema/alternate-conflict-enum-int.err
> index 2cc8e7b9aa4..04298eae905 100644
> --- a/tests/qapi-schema/alternate-conflict-enum-int.err
> +++ b/tests/qapi-schema/alternate-conflict-enum-int.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-enum-int.json:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-enum-int.qapi:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-enum-int.json b/tests/qapi-schema/alternate-conflict-enum-int.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-enum-int.json
> rename to tests/qapi-schema/alternate-conflict-enum-int.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-num-string.err b/tests/qapi-schema/alternate-conflict-num-string.err
> index 5ba3827dd12..42a6dbc449f 100644
> --- a/tests/qapi-schema/alternate-conflict-num-string.err
> +++ b/tests/qapi-schema/alternate-conflict-num-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-num-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-num-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-num-string.json b/tests/qapi-schema/alternate-conflict-num-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-num-string.json
> rename to tests/qapi-schema/alternate-conflict-num-string.qapi
> diff --git a/tests/qapi-schema/alternate-conflict-string.err b/tests/qapi-schema/alternate-conflict-string.err
> index fe2f188295b..ee70cad527b 100644
> --- a/tests/qapi-schema/alternate-conflict-string.err
> +++ b/tests/qapi-schema/alternate-conflict-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-conflict-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> +tests/qapi-schema/alternate-conflict-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
> diff --git a/tests/qapi-schema/alternate-conflict-string.json b/tests/qapi-schema/alternate-conflict-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-conflict-string.json
> rename to tests/qapi-schema/alternate-conflict-string.qapi
> diff --git a/tests/qapi-schema/alternate-empty.err b/tests/qapi-schema/alternate-empty.err
> index bb06c5bfec0..4253cac8af5 100644
> --- a/tests/qapi-schema/alternate-empty.err
> +++ b/tests/qapi-schema/alternate-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-empty.json:2: Alternate 'Alt' should have at least two branches in 'data'
> +tests/qapi-schema/alternate-empty.qapi:2: Alternate 'Alt' should have at least two branches in 'data'
> diff --git a/tests/qapi-schema/alternate-empty.json b/tests/qapi-schema/alternate-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-empty.json
> rename to tests/qapi-schema/alternate-empty.qapi
> diff --git a/tests/qapi-schema/alternate-nested.err b/tests/qapi-schema/alternate-nested.err
> index 4d1187e60ec..ae3aa1a73f0 100644
> --- a/tests/qapi-schema/alternate-nested.err
> +++ b/tests/qapi-schema/alternate-nested.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-nested.json:4: Member 'nested' of alternate 'Alt2' cannot use alternate type 'Alt1'
> +tests/qapi-schema/alternate-nested.qapi:4: Member 'nested' of alternate 'Alt2' cannot use alternate type 'Alt1'
> diff --git a/tests/qapi-schema/alternate-nested.json b/tests/qapi-schema/alternate-nested.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-nested.json
> rename to tests/qapi-schema/alternate-nested.qapi
> diff --git a/tests/qapi-schema/alternate-unknown.err b/tests/qapi-schema/alternate-unknown.err
> index dea45dc7302..706658d4959 100644
> --- a/tests/qapi-schema/alternate-unknown.err
> +++ b/tests/qapi-schema/alternate-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/alternate-unknown.json:2: Member 'unknown' of alternate 'Alt' uses unknown type 'MissingType'
> +tests/qapi-schema/alternate-unknown.qapi:2: Member 'unknown' of alternate 'Alt' uses unknown type 'MissingType'
> diff --git a/tests/qapi-schema/alternate-unknown.json b/tests/qapi-schema/alternate-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/alternate-unknown.json
> rename to tests/qapi-schema/alternate-unknown.qapi
> diff --git a/tests/qapi-schema/args-alternate.err b/tests/qapi-schema/args-alternate.err
> index 3086eae56b0..637d9884867 100644
> --- a/tests/qapi-schema/args-alternate.err
> +++ b/tests/qapi-schema/args-alternate.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-alternate.json:3: 'data' for command 'oops' cannot use alternate type 'Alt'
> +tests/qapi-schema/args-alternate.qapi:3: 'data' for command 'oops' cannot use alternate type 'Alt'
> diff --git a/tests/qapi-schema/args-alternate.json b/tests/qapi-schema/args-alternate.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-alternate.json
> rename to tests/qapi-schema/args-alternate.qapi
> diff --git a/tests/qapi-schema/args-any.err b/tests/qapi-schema/args-any.err
> index bf9b5e0730b..2853bdb41ea 100644
> --- a/tests/qapi-schema/args-any.err
> +++ b/tests/qapi-schema/args-any.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-any.json:2: 'data' for command 'oops' cannot use built-in type 'any'
> +tests/qapi-schema/args-any.qapi:2: 'data' for command 'oops' cannot use built-in type 'any'
> diff --git a/tests/qapi-schema/args-any.json b/tests/qapi-schema/args-any.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-any.json
> rename to tests/qapi-schema/args-any.qapi
> diff --git a/tests/qapi-schema/args-array-empty.err b/tests/qapi-schema/args-array-empty.err
> index cb7ed33b3fb..530d661b649 100644
> --- a/tests/qapi-schema/args-array-empty.err
> +++ b/tests/qapi-schema/args-array-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-array-empty.json:2: Member 'empty' of 'data' for command 'oops': array type must contain single type name
> +tests/qapi-schema/args-array-empty.qapi:2: Member 'empty' of 'data' for command 'oops': array type must contain single type name
> diff --git a/tests/qapi-schema/args-array-empty.json b/tests/qapi-schema/args-array-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-array-empty.json
> rename to tests/qapi-schema/args-array-empty.qapi
> diff --git a/tests/qapi-schema/args-array-unknown.err b/tests/qapi-schema/args-array-unknown.err
> index cd7a0f98d79..6273c088bb3 100644
> --- a/tests/qapi-schema/args-array-unknown.err
> +++ b/tests/qapi-schema/args-array-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-array-unknown.json:2: Member 'array' of 'data' for command 'oops' uses unknown type 'NoSuchType'
> +tests/qapi-schema/args-array-unknown.qapi:2: Member 'array' of 'data' for command 'oops' uses unknown type 'NoSuchType'
> diff --git a/tests/qapi-schema/args-array-unknown.json b/tests/qapi-schema/args-array-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-array-unknown.json
> rename to tests/qapi-schema/args-array-unknown.qapi
> diff --git a/tests/qapi-schema/args-bad-boxed.err b/tests/qapi-schema/args-bad-boxed.err
> index ad0d417321c..b059bcc3076 100644
> --- a/tests/qapi-schema/args-bad-boxed.err
> +++ b/tests/qapi-schema/args-bad-boxed.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-bad-boxed.json:2: 'boxed' of command 'foo' should only use true value
> +tests/qapi-schema/args-bad-boxed.qapi:2: 'boxed' of command 'foo' should only use true value
> diff --git a/tests/qapi-schema/args-bad-boxed.json b/tests/qapi-schema/args-bad-boxed.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-bad-boxed.json
> rename to tests/qapi-schema/args-bad-boxed.qapi
> diff --git a/tests/qapi-schema/args-boxed-anon.err b/tests/qapi-schema/args-boxed-anon.err
> index f24f3452185..fc5f2828c44 100644
> --- a/tests/qapi-schema/args-boxed-anon.err
> +++ b/tests/qapi-schema/args-boxed-anon.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-boxed-anon.json:2: 'data' for command 'foo' should be a type name
> +tests/qapi-schema/args-boxed-anon.qapi:2: 'data' for command 'foo' should be a type name
> diff --git a/tests/qapi-schema/args-boxed-anon.json b/tests/qapi-schema/args-boxed-anon.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-boxed-anon.json
> rename to tests/qapi-schema/args-boxed-anon.qapi
> diff --git a/tests/qapi-schema/args-boxed-empty.err b/tests/qapi-schema/args-boxed-empty.err
> index 039603e85ca..c144d317b7f 100644
> --- a/tests/qapi-schema/args-boxed-empty.err
> +++ b/tests/qapi-schema/args-boxed-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-boxed-empty.json:3: Cannot use 'boxed' with empty type
> +tests/qapi-schema/args-boxed-empty.qapi:3: Cannot use 'boxed' with empty type
> diff --git a/tests/qapi-schema/args-boxed-empty.json b/tests/qapi-schema/args-boxed-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-boxed-empty.json
> rename to tests/qapi-schema/args-boxed-empty.qapi
> diff --git a/tests/qapi-schema/args-boxed-string.err b/tests/qapi-schema/args-boxed-string.err
> index d326b48aefd..48d612261c1 100644
> --- a/tests/qapi-schema/args-boxed-string.err
> +++ b/tests/qapi-schema/args-boxed-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-boxed-string.json:2: 'data' for command 'foo' cannot use built-in type 'str'
> +tests/qapi-schema/args-boxed-string.qapi:2: 'data' for command 'foo' cannot use built-in type 'str'
> diff --git a/tests/qapi-schema/args-boxed-string.json b/tests/qapi-schema/args-boxed-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-boxed-string.json
> rename to tests/qapi-schema/args-boxed-string.qapi
> diff --git a/tests/qapi-schema/args-int.err b/tests/qapi-schema/args-int.err
> index dc1d2504ff8..35b50e18825 100644
> --- a/tests/qapi-schema/args-int.err
> +++ b/tests/qapi-schema/args-int.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-int.json:2: 'data' for command 'oops' cannot use built-in type 'int'
> +tests/qapi-schema/args-int.qapi:2: 'data' for command 'oops' cannot use built-in type 'int'
> diff --git a/tests/qapi-schema/args-int.json b/tests/qapi-schema/args-int.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-int.json
> rename to tests/qapi-schema/args-int.qapi
> diff --git a/tests/qapi-schema/args-invalid.err b/tests/qapi-schema/args-invalid.err
> index fe1e94975b9..5884976eeed 100644
> --- a/tests/qapi-schema/args-invalid.err
> +++ b/tests/qapi-schema/args-invalid.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-invalid.json:1: 'data' for command 'foo' should be a dictionary or type name
> +tests/qapi-schema/args-invalid.qapi:1: 'data' for command 'foo' should be a dictionary or type name
> diff --git a/tests/qapi-schema/args-invalid.json b/tests/qapi-schema/args-invalid.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-invalid.json
> rename to tests/qapi-schema/args-invalid.qapi
> diff --git a/tests/qapi-schema/args-member-array-bad.err b/tests/qapi-schema/args-member-array-bad.err
> index 881b4d954f2..19fb4f4bfb3 100644
> --- a/tests/qapi-schema/args-member-array-bad.err
> +++ b/tests/qapi-schema/args-member-array-bad.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-member-array-bad.json:2: Member 'member' of 'data' for command 'oops': array type must contain single type name
> +tests/qapi-schema/args-member-array-bad.qapi:2: Member 'member' of 'data' for command 'oops': array type must contain single type name
> diff --git a/tests/qapi-schema/args-member-array-bad.json b/tests/qapi-schema/args-member-array-bad.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-member-array-bad.json
> rename to tests/qapi-schema/args-member-array-bad.qapi
> diff --git a/tests/qapi-schema/args-member-case.err b/tests/qapi-schema/args-member-case.err
> index 19c44266015..62294827266 100644
> --- a/tests/qapi-schema/args-member-case.err
> +++ b/tests/qapi-schema/args-member-case.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-member-case.json:2: 'Arg' (parameter of no-way-this-will-get-whitelisted) should not use uppercase
> +tests/qapi-schema/args-member-case.qapi:2: 'Arg' (parameter of no-way-this-will-get-whitelisted) should not use uppercase
> diff --git a/tests/qapi-schema/args-member-case.json b/tests/qapi-schema/args-member-case.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-member-case.json
> rename to tests/qapi-schema/args-member-case.qapi
> diff --git a/tests/qapi-schema/args-member-unknown.err b/tests/qapi-schema/args-member-unknown.err
> index f6f82828ce5..c9e58b2d074 100644
> --- a/tests/qapi-schema/args-member-unknown.err
> +++ b/tests/qapi-schema/args-member-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-member-unknown.json:2: Member 'member' of 'data' for command 'oops' uses unknown type 'NoSuchType'
> +tests/qapi-schema/args-member-unknown.qapi:2: Member 'member' of 'data' for command 'oops' uses unknown type 'NoSuchType'
> diff --git a/tests/qapi-schema/args-member-unknown.json b/tests/qapi-schema/args-member-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-member-unknown.json
> rename to tests/qapi-schema/args-member-unknown.qapi
> diff --git a/tests/qapi-schema/args-name-clash.err b/tests/qapi-schema/args-name-clash.err
> index d953e8d2416..5e9dc79a3dd 100644
> --- a/tests/qapi-schema/args-name-clash.err
> +++ b/tests/qapi-schema/args-name-clash.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-name-clash.json:4: 'a_b' (parameter of oops) collides with 'a-b' (parameter of oops)
> +tests/qapi-schema/args-name-clash.qapi:4: 'a_b' (parameter of oops) collides with 'a-b' (parameter of oops)
> diff --git a/tests/qapi-schema/args-name-clash.json b/tests/qapi-schema/args-name-clash.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-name-clash.json
> rename to tests/qapi-schema/args-name-clash.qapi
> diff --git a/tests/qapi-schema/args-union.err b/tests/qapi-schema/args-union.err
> index f8ad223ddee..8b84f4034e8 100644
> --- a/tests/qapi-schema/args-union.err
> +++ b/tests/qapi-schema/args-union.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-union.json:3: 'data' for command 'oops' cannot use union type 'Uni'
> +tests/qapi-schema/args-union.qapi:3: 'data' for command 'oops' cannot use union type 'Uni'
> diff --git a/tests/qapi-schema/args-union.json b/tests/qapi-schema/args-union.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-union.json
> rename to tests/qapi-schema/args-union.qapi
> diff --git a/tests/qapi-schema/args-unknown.err b/tests/qapi-schema/args-unknown.err
> index 4d91ec869f9..86b4d123566 100644
> --- a/tests/qapi-schema/args-unknown.err
> +++ b/tests/qapi-schema/args-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/args-unknown.json:2: 'data' for command 'oops' uses unknown type 'NoSuchType'
> +tests/qapi-schema/args-unknown.qapi:2: 'data' for command 'oops' uses unknown type 'NoSuchType'
> diff --git a/tests/qapi-schema/args-unknown.json b/tests/qapi-schema/args-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/args-unknown.json
> rename to tests/qapi-schema/args-unknown.qapi
> diff --git a/tests/qapi-schema/bad-base.err b/tests/qapi-schema/bad-base.err
> index 154274bdd3f..2329ecc605e 100644
> --- a/tests/qapi-schema/bad-base.err
> +++ b/tests/qapi-schema/bad-base.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-base.json:3: 'base' for struct 'MyType' cannot use union type 'Union'
> +tests/qapi-schema/bad-base.qapi:3: 'base' for struct 'MyType' cannot use union type 'Union'
> diff --git a/tests/qapi-schema/bad-base.json b/tests/qapi-schema/bad-base.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-base.json
> rename to tests/qapi-schema/bad-base.qapi
> diff --git a/tests/qapi-schema/bad-data.err b/tests/qapi-schema/bad-data.err
> index 8523ac4f46d..7f6c19eaf0d 100644
> --- a/tests/qapi-schema/bad-data.err
> +++ b/tests/qapi-schema/bad-data.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-data.json:2: 'data' for command 'oops' cannot be an array
> +tests/qapi-schema/bad-data.qapi:2: 'data' for command 'oops' cannot be an array
> diff --git a/tests/qapi-schema/bad-data.json b/tests/qapi-schema/bad-data.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-data.json
> rename to tests/qapi-schema/bad-data.qapi
> diff --git a/tests/qapi-schema/bad-ident.err b/tests/qapi-schema/bad-ident.err
> index c4190602b5c..0733e38d4cd 100644
> --- a/tests/qapi-schema/bad-ident.err
> +++ b/tests/qapi-schema/bad-ident.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-ident.json:2: 'struct' does not allow optional name '*oops'
> +tests/qapi-schema/bad-ident.qapi:2: 'struct' does not allow optional name '*oops'
> diff --git a/tests/qapi-schema/bad-ident.json b/tests/qapi-schema/bad-ident.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-ident.json
> rename to tests/qapi-schema/bad-ident.qapi
> diff --git a/tests/qapi-schema/bad-type-bool.err b/tests/qapi-schema/bad-type-bool.err
> index 62fd70baafd..824d0b737e7 100644
> --- a/tests/qapi-schema/bad-type-bool.err
> +++ b/tests/qapi-schema/bad-type-bool.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-type-bool.json:2: 'struct' key must have a string value
> +tests/qapi-schema/bad-type-bool.qapi:2: 'struct' key must have a string value
> diff --git a/tests/qapi-schema/bad-type-bool.json b/tests/qapi-schema/bad-type-bool.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-type-bool.json
> rename to tests/qapi-schema/bad-type-bool.qapi
> diff --git a/tests/qapi-schema/bad-type-dict.err b/tests/qapi-schema/bad-type-dict.err
> index 0b2a2aeac42..fc5302bd9af 100644
> --- a/tests/qapi-schema/bad-type-dict.err
> +++ b/tests/qapi-schema/bad-type-dict.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-type-dict.json:2: 'command' key must have a string value
> +tests/qapi-schema/bad-type-dict.qapi:2: 'command' key must have a string value
> diff --git a/tests/qapi-schema/bad-type-dict.json b/tests/qapi-schema/bad-type-dict.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-type-dict.json
> rename to tests/qapi-schema/bad-type-dict.qapi
> diff --git a/tests/qapi-schema/bad-type-int.err b/tests/qapi-schema/bad-type-int.err
> index da898954046..a6c074644bb 100644
> --- a/tests/qapi-schema/bad-type-int.err
> +++ b/tests/qapi-schema/bad-type-int.err
> @@ -1 +1 @@
> -tests/qapi-schema/bad-type-int.json:3:13: Stray "1"
> +tests/qapi-schema/bad-type-int.qapi:3:13: Stray "1"
> diff --git a/tests/qapi-schema/bad-type-int.json b/tests/qapi-schema/bad-type-int.qapi
> similarity index 100%
> rename from tests/qapi-schema/bad-type-int.json
> rename to tests/qapi-schema/bad-type-int.qapi
> diff --git a/tests/qapi-schema/base-cycle-direct.err b/tests/qapi-schema/base-cycle-direct.err
> index 9c68f6543d3..7b83d041ea4 100644
> --- a/tests/qapi-schema/base-cycle-direct.err
> +++ b/tests/qapi-schema/base-cycle-direct.err
> @@ -1 +1 @@
> -tests/qapi-schema/base-cycle-direct.json:2: Object Loopy contains itself
> +tests/qapi-schema/base-cycle-direct.qapi:2: Object Loopy contains itself
> diff --git a/tests/qapi-schema/base-cycle-direct.json b/tests/qapi-schema/base-cycle-direct.qapi
> similarity index 100%
> rename from tests/qapi-schema/base-cycle-direct.json
> rename to tests/qapi-schema/base-cycle-direct.qapi
> diff --git a/tests/qapi-schema/base-cycle-indirect.err b/tests/qapi-schema/base-cycle-indirect.err
> index fc92fe47f82..585c95aea24 100644
> --- a/tests/qapi-schema/base-cycle-indirect.err
> +++ b/tests/qapi-schema/base-cycle-indirect.err
> @@ -1 +1 @@
> -tests/qapi-schema/base-cycle-indirect.json:2: Object Base1 contains itself
> +tests/qapi-schema/base-cycle-indirect.qapi:2: Object Base1 contains itself
> diff --git a/tests/qapi-schema/base-cycle-indirect.json b/tests/qapi-schema/base-cycle-indirect.qapi
> similarity index 100%
> rename from tests/qapi-schema/base-cycle-indirect.json
> rename to tests/qapi-schema/base-cycle-indirect.qapi
> diff --git a/tests/qapi-schema/command-int.err b/tests/qapi-schema/command-int.err
> index 0f9300679b3..10c53335fa9 100644
> --- a/tests/qapi-schema/command-int.err
> +++ b/tests/qapi-schema/command-int.err
> @@ -1 +1 @@
> -tests/qapi-schema/command-int.json:2: built-in 'int' is already defined
> +tests/qapi-schema/command-int.qapi:2: built-in 'int' is already defined
> diff --git a/tests/qapi-schema/command-int.json b/tests/qapi-schema/command-int.qapi
> similarity index 100%
> rename from tests/qapi-schema/command-int.json
> rename to tests/qapi-schema/command-int.qapi
> diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out
> index 8d2f1ce8a2e..6c0d162bc0a 100644
> --- a/tests/qapi-schema/comments.out
> +++ b/tests/qapi-schema/comments.out
> @@ -1,5 +1,5 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module comments.json
> +module comments.qapi
>  enum Status ['good', 'bad', 'ugly']
> diff --git a/tests/qapi-schema/comments.json b/tests/qapi-schema/comments.qapi
> similarity index 100%
> rename from tests/qapi-schema/comments.json
> rename to tests/qapi-schema/comments.qapi
> diff --git a/tests/qapi-schema/doc-bad-alternate-member.err b/tests/qapi-schema/doc-bad-alternate-member.err
> index 387f7824daa..318d1df8748 100644
> --- a/tests/qapi-schema/doc-bad-alternate-member.err
> +++ b/tests/qapi-schema/doc-bad-alternate-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-bad-alternate-member.json:3: The following documented members are not in the declaration: aa, bb
> +tests/qapi-schema/doc-bad-alternate-member.qapi:3: The following documented members are not in the declaration: aa, bb
> diff --git a/tests/qapi-schema/doc-bad-alternate-member.json b/tests/qapi-schema/doc-bad-alternate-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-bad-alternate-member.json
> rename to tests/qapi-schema/doc-bad-alternate-member.qapi
> diff --git a/tests/qapi-schema/doc-bad-command-arg.err b/tests/qapi-schema/doc-bad-command-arg.err
> index 8075b146ae3..bd236a1f819 100644
> --- a/tests/qapi-schema/doc-bad-command-arg.err
> +++ b/tests/qapi-schema/doc-bad-command-arg.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-bad-command-arg.json:3: The following documented members are not in the declaration: b
> +tests/qapi-schema/doc-bad-command-arg.qapi:3: The following documented members are not in the declaration: b
> diff --git a/tests/qapi-schema/doc-bad-command-arg.json b/tests/qapi-schema/doc-bad-command-arg.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-bad-command-arg.json
> rename to tests/qapi-schema/doc-bad-command-arg.qapi
> diff --git a/tests/qapi-schema/doc-bad-section.out b/tests/qapi-schema/doc-bad-section.out
> index cd287215689..3a8b8d3fe0b 100644
> --- a/tests/qapi-schema/doc-bad-section.out
> +++ b/tests/qapi-schema/doc-bad-section.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module doc-bad-section.json
> +module doc-bad-section.qapi
>  enum Enum ['one', 'two']
>  doc symbol=Enum
>      body=
> diff --git a/tests/qapi-schema/doc-bad-section.json b/tests/qapi-schema/doc-bad-section.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-bad-section.json
> rename to tests/qapi-schema/doc-bad-section.qapi
> diff --git a/tests/qapi-schema/doc-bad-symbol.err b/tests/qapi-schema/doc-bad-symbol.err
> index 8472030c791..5fe61db4e79 100644
> --- a/tests/qapi-schema/doc-bad-symbol.err
> +++ b/tests/qapi-schema/doc-bad-symbol.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-bad-symbol.json:6: Definition of 'foo' follows documentation for 'food'
> +tests/qapi-schema/doc-bad-symbol.qapi:6: Definition of 'foo' follows documentation for 'food'
> diff --git a/tests/qapi-schema/doc-bad-symbol.json b/tests/qapi-schema/doc-bad-symbol.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-bad-symbol.json
> rename to tests/qapi-schema/doc-bad-symbol.qapi
> diff --git a/tests/qapi-schema/doc-bad-union-member.err b/tests/qapi-schema/doc-bad-union-member.err
> index 4b016df7ff7..0bb90004cc9 100644
> --- a/tests/qapi-schema/doc-bad-union-member.err
> +++ b/tests/qapi-schema/doc-bad-union-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-bad-union-member.json:3: The following documented members are not in the declaration: a, b
> +tests/qapi-schema/doc-bad-union-member.qapi:3: The following documented members are not in the declaration: a, b
> diff --git a/tests/qapi-schema/doc-bad-union-member.json b/tests/qapi-schema/doc-bad-union-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-bad-union-member.json
> rename to tests/qapi-schema/doc-bad-union-member.qapi
> diff --git a/tests/qapi-schema/doc-before-include.err b/tests/qapi-schema/doc-before-include.err
> index a649d38a630..a7b903fc1e9 100644
> --- a/tests/qapi-schema/doc-before-include.err
> +++ b/tests/qapi-schema/doc-before-include.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-before-include.json:3: Documentation for 'foo' is not followed by the definition
> +tests/qapi-schema/doc-before-include.qapi:3: Documentation for 'foo' is not followed by the definition
> diff --git a/tests/qapi-schema/doc-before-include.json b/tests/qapi-schema/doc-before-include.qapi
> similarity index 81%
> rename from tests/qapi-schema/doc-before-include.json
> rename to tests/qapi-schema/doc-before-include.qapi
> index 0caa0ae0791..7fae0a67550 100644
> --- a/tests/qapi-schema/doc-before-include.json
> +++ b/tests/qapi-schema/doc-before-include.qapi
> @@ -3,5 +3,5 @@
>  ##
>  # @foo:
>  ##
> -{ 'include': 'empty.json' }
> +{ 'include': 'empty.qapi' }
>  { 'struct': 'foo', 'data': {} }
> diff --git a/tests/qapi-schema/doc-before-pragma.err b/tests/qapi-schema/doc-before-pragma.err
> index c0fb0660d14..2dbc7e00de8 100644
> --- a/tests/qapi-schema/doc-before-pragma.err
> +++ b/tests/qapi-schema/doc-before-pragma.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-before-pragma.json:3: Documentation for 'foo' is not followed by the definition
> +tests/qapi-schema/doc-before-pragma.qapi:3: Documentation for 'foo' is not followed by the definition
> diff --git a/tests/qapi-schema/doc-before-pragma.json b/tests/qapi-schema/doc-before-pragma.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-before-pragma.json
> rename to tests/qapi-schema/doc-before-pragma.qapi
> diff --git a/tests/qapi-schema/doc-duplicated-arg.err b/tests/qapi-schema/doc-duplicated-arg.err
> index 1c3f8e0a542..4929ac53cf3 100644
> --- a/tests/qapi-schema/doc-duplicated-arg.err
> +++ b/tests/qapi-schema/doc-duplicated-arg.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-duplicated-arg.json:6:1: 'a' parameter name duplicated
> +tests/qapi-schema/doc-duplicated-arg.qapi:6:1: 'a' parameter name duplicated
> diff --git a/tests/qapi-schema/doc-duplicated-arg.json b/tests/qapi-schema/doc-duplicated-arg.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-duplicated-arg.json
> rename to tests/qapi-schema/doc-duplicated-arg.qapi
> diff --git a/tests/qapi-schema/doc-duplicated-return.err b/tests/qapi-schema/doc-duplicated-return.err
> index e48039f8e53..92f7b655d4c 100644
> --- a/tests/qapi-schema/doc-duplicated-return.err
> +++ b/tests/qapi-schema/doc-duplicated-return.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-duplicated-return.json:7:1: Duplicated 'Returns' section
> +tests/qapi-schema/doc-duplicated-return.qapi:7:1: Duplicated 'Returns' section
> diff --git a/tests/qapi-schema/doc-duplicated-return.json b/tests/qapi-schema/doc-duplicated-return.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-duplicated-return.json
> rename to tests/qapi-schema/doc-duplicated-return.qapi
> diff --git a/tests/qapi-schema/doc-duplicated-since.err b/tests/qapi-schema/doc-duplicated-since.err
> index 3fb890744a4..2bb0097fb09 100644
> --- a/tests/qapi-schema/doc-duplicated-since.err
> +++ b/tests/qapi-schema/doc-duplicated-since.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-duplicated-since.json:7:1: Duplicated 'Since' section
> +tests/qapi-schema/doc-duplicated-since.qapi:7:1: Duplicated 'Since' section
> diff --git a/tests/qapi-schema/doc-duplicated-since.json b/tests/qapi-schema/doc-duplicated-since.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-duplicated-since.json
> rename to tests/qapi-schema/doc-duplicated-since.qapi
> diff --git a/tests/qapi-schema/doc-empty-arg.err b/tests/qapi-schema/doc-empty-arg.err
> index 2895518fa7f..873eddca052 100644
> --- a/tests/qapi-schema/doc-empty-arg.err
> +++ b/tests/qapi-schema/doc-empty-arg.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-empty-arg.json:5:1: Invalid parameter name
> +tests/qapi-schema/doc-empty-arg.qapi:5:1: Invalid parameter name
> diff --git a/tests/qapi-schema/doc-empty-arg.json b/tests/qapi-schema/doc-empty-arg.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-empty-arg.json
> rename to tests/qapi-schema/doc-empty-arg.qapi
> diff --git a/tests/qapi-schema/doc-empty-section.err b/tests/qapi-schema/doc-empty-section.err
> index b61e4a78860..ed54e31ba5e 100644
> --- a/tests/qapi-schema/doc-empty-section.err
> +++ b/tests/qapi-schema/doc-empty-section.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-empty-section.json:7:1: Empty doc section 'Note'
> +tests/qapi-schema/doc-empty-section.qapi:7:1: Empty doc section 'Note'
> diff --git a/tests/qapi-schema/doc-empty-section.json b/tests/qapi-schema/doc-empty-section.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-empty-section.json
> rename to tests/qapi-schema/doc-empty-section.qapi
> diff --git a/tests/qapi-schema/doc-empty-symbol.err b/tests/qapi-schema/doc-empty-symbol.err
> index 1936ad094f8..ca349b1ec47 100644
> --- a/tests/qapi-schema/doc-empty-symbol.err
> +++ b/tests/qapi-schema/doc-empty-symbol.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-empty-symbol.json:4:1: Invalid name
> +tests/qapi-schema/doc-empty-symbol.qapi:4:1: Invalid name
> diff --git a/tests/qapi-schema/doc-empty-symbol.json b/tests/qapi-schema/doc-empty-symbol.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-empty-symbol.json
> rename to tests/qapi-schema/doc-empty-symbol.qapi
> diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out
> index 63058b1590a..e5aede089b1 100644
> --- a/tests/qapi-schema/doc-good.out
> +++ b/tests/qapi-schema/doc-good.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module doc-good.json
> +module doc-good.qapi
>  enum Enum ['one', 'two']
>  object Base
>      member base1: Enum optional=False
> diff --git a/tests/qapi-schema/doc-good.json b/tests/qapi-schema/doc-good.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-good.json
> rename to tests/qapi-schema/doc-good.qapi
> diff --git a/tests/qapi-schema/doc-interleaved-section.err b/tests/qapi-schema/doc-interleaved-section.err
> index d373eabc556..f5e347f391b 100644
> --- a/tests/qapi-schema/doc-interleaved-section.err
> +++ b/tests/qapi-schema/doc-interleaved-section.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-interleaved-section.json:15:1: '@foobar:' can't follow 'Note' section
> +tests/qapi-schema/doc-interleaved-section.qapi:15:1: '@foobar:' can't follow 'Note' section
> diff --git a/tests/qapi-schema/doc-interleaved-section.json b/tests/qapi-schema/doc-interleaved-section.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-interleaved-section.json
> rename to tests/qapi-schema/doc-interleaved-section.qapi
> diff --git a/tests/qapi-schema/doc-invalid-end.err b/tests/qapi-schema/doc-invalid-end.err
> index 2bda28cb548..2152663541e 100644
> --- a/tests/qapi-schema/doc-invalid-end.err
> +++ b/tests/qapi-schema/doc-invalid-end.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-invalid-end.json:5:2: Documentation comment must end with '##'
> +tests/qapi-schema/doc-invalid-end.qapi:5:2: Documentation comment must end with '##'
> diff --git a/tests/qapi-schema/doc-invalid-end.json b/tests/qapi-schema/doc-invalid-end.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-invalid-end.json
> rename to tests/qapi-schema/doc-invalid-end.qapi
> diff --git a/tests/qapi-schema/doc-invalid-end2.err b/tests/qapi-schema/doc-invalid-end2.err
> index 6fad9c789e7..077931d8500 100644
> --- a/tests/qapi-schema/doc-invalid-end2.err
> +++ b/tests/qapi-schema/doc-invalid-end2.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-invalid-end2.json:5:1: Junk after '##' at end of documentation comment
> +tests/qapi-schema/doc-invalid-end2.qapi:5:1: Junk after '##' at end of documentation comment
> diff --git a/tests/qapi-schema/doc-invalid-end2.json b/tests/qapi-schema/doc-invalid-end2.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-invalid-end2.json
> rename to tests/qapi-schema/doc-invalid-end2.qapi
> diff --git a/tests/qapi-schema/doc-invalid-return.err b/tests/qapi-schema/doc-invalid-return.err
> index 5aaba33bb42..32eb8db5e53 100644
> --- a/tests/qapi-schema/doc-invalid-return.err
> +++ b/tests/qapi-schema/doc-invalid-return.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-invalid-return.json:3: 'Returns:' is only valid for commands
> +tests/qapi-schema/doc-invalid-return.qapi:3: 'Returns:' is only valid for commands
> diff --git a/tests/qapi-schema/doc-invalid-return.json b/tests/qapi-schema/doc-invalid-return.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-invalid-return.json
> rename to tests/qapi-schema/doc-invalid-return.qapi
> diff --git a/tests/qapi-schema/doc-invalid-section.err b/tests/qapi-schema/doc-invalid-section.err
> index bda93b44fde..810957cfc16 100644
> --- a/tests/qapi-schema/doc-invalid-section.err
> +++ b/tests/qapi-schema/doc-invalid-section.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-invalid-section.json:5:1: '@note:' not allowed in free-form documentation
> +tests/qapi-schema/doc-invalid-section.qapi:5:1: '@note:' not allowed in free-form documentation
> diff --git a/tests/qapi-schema/doc-invalid-section.json b/tests/qapi-schema/doc-invalid-section.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-invalid-section.json
> rename to tests/qapi-schema/doc-invalid-section.qapi
> diff --git a/tests/qapi-schema/doc-invalid-start.err b/tests/qapi-schema/doc-invalid-start.err
> index 149af2bfacd..08dce5feafe 100644
> --- a/tests/qapi-schema/doc-invalid-start.err
> +++ b/tests/qapi-schema/doc-invalid-start.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-invalid-start.json:3:1: Junk after '##' at start of documentation comment
> +tests/qapi-schema/doc-invalid-start.qapi:3:1: Junk after '##' at start of documentation comment
> diff --git a/tests/qapi-schema/doc-invalid-start.json b/tests/qapi-schema/doc-invalid-start.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-invalid-start.json
> rename to tests/qapi-schema/doc-invalid-start.qapi
> diff --git a/tests/qapi-schema/doc-missing-colon.err b/tests/qapi-schema/doc-missing-colon.err
> index 817398b8e42..0052605c972 100644
> --- a/tests/qapi-schema/doc-missing-colon.err
> +++ b/tests/qapi-schema/doc-missing-colon.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-missing-colon.json:4:1: Line should end with :
> +tests/qapi-schema/doc-missing-colon.qapi:4:1: Line should end with :
> diff --git a/tests/qapi-schema/doc-missing-colon.json b/tests/qapi-schema/doc-missing-colon.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-missing-colon.json
> rename to tests/qapi-schema/doc-missing-colon.qapi
> diff --git a/tests/qapi-schema/doc-missing-expr.err b/tests/qapi-schema/doc-missing-expr.err
> index c909e26eca5..d2af40b1c68 100644
> --- a/tests/qapi-schema/doc-missing-expr.err
> +++ b/tests/qapi-schema/doc-missing-expr.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-missing-expr.json:3: Documentation for 'bar' is not followed by the definition
> +tests/qapi-schema/doc-missing-expr.qapi:3: Documentation for 'bar' is not followed by the definition
> diff --git a/tests/qapi-schema/doc-missing-expr.json b/tests/qapi-schema/doc-missing-expr.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-missing-expr.json
> rename to tests/qapi-schema/doc-missing-expr.qapi
> diff --git a/tests/qapi-schema/doc-missing-space.err b/tests/qapi-schema/doc-missing-space.err
> index d6b46ffd778..756122f26b1 100644
> --- a/tests/qapi-schema/doc-missing-space.err
> +++ b/tests/qapi-schema/doc-missing-space.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-missing-space.json:5:1: Missing space after #
> +tests/qapi-schema/doc-missing-space.qapi:5:1: Missing space after #
> diff --git a/tests/qapi-schema/doc-missing-space.json b/tests/qapi-schema/doc-missing-space.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-missing-space.json
> rename to tests/qapi-schema/doc-missing-space.qapi
> diff --git a/tests/qapi-schema/doc-missing.err b/tests/qapi-schema/doc-missing.err
> index 7f2f326b30a..2b44937a201 100644
> --- a/tests/qapi-schema/doc-missing.err
> +++ b/tests/qapi-schema/doc-missing.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-missing.json:5: Expression missing documentation comment
> +tests/qapi-schema/doc-missing.qapi:5: Expression missing documentation comment
> diff --git a/tests/qapi-schema/doc-missing.json b/tests/qapi-schema/doc-missing.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-missing.json
> rename to tests/qapi-schema/doc-missing.qapi
> diff --git a/tests/qapi-schema/doc-no-symbol.err b/tests/qapi-schema/doc-no-symbol.err
> index 75f032a9421..212c1241d7d 100644
> --- a/tests/qapi-schema/doc-no-symbol.err
> +++ b/tests/qapi-schema/doc-no-symbol.err
> @@ -1 +1 @@
> -tests/qapi-schema/doc-no-symbol.json:3: Expression documentation required
> +tests/qapi-schema/doc-no-symbol.qapi:3: Expression documentation required
> diff --git a/tests/qapi-schema/doc-no-symbol.json b/tests/qapi-schema/doc-no-symbol.qapi
> similarity index 100%
> rename from tests/qapi-schema/doc-no-symbol.json
> rename to tests/qapi-schema/doc-no-symbol.qapi
> diff --git a/tests/qapi-schema/double-data.err b/tests/qapi-schema/double-data.err
> index cc765c4ff23..afa6b9ec681 100644
> --- a/tests/qapi-schema/double-data.err
> +++ b/tests/qapi-schema/double-data.err
> @@ -1 +1 @@
> -tests/qapi-schema/double-data.json:2:41: Duplicate key "data"
> +tests/qapi-schema/double-data.qapi:2:41: Duplicate key "data"
> diff --git a/tests/qapi-schema/double-data.json b/tests/qapi-schema/double-data.qapi
> similarity index 100%
> rename from tests/qapi-schema/double-data.json
> rename to tests/qapi-schema/double-data.qapi
> diff --git a/tests/qapi-schema/double-type.err b/tests/qapi-schema/double-type.err
> index f9613c6d6b5..95df26ced22 100644
> --- a/tests/qapi-schema/double-type.err
> +++ b/tests/qapi-schema/double-type.err
> @@ -1 +1 @@
> -tests/qapi-schema/double-type.json:2: Unknown key 'command' in struct 'bar'
> +tests/qapi-schema/double-type.qapi:2: Unknown key 'command' in struct 'bar'
> diff --git a/tests/qapi-schema/double-type.json b/tests/qapi-schema/double-type.qapi
> similarity index 100%
> rename from tests/qapi-schema/double-type.json
> rename to tests/qapi-schema/double-type.qapi
> diff --git a/tests/qapi-schema/duplicate-key.err b/tests/qapi-schema/duplicate-key.err
> index 6d02f835388..2bf72416f56 100644
> --- a/tests/qapi-schema/duplicate-key.err
> +++ b/tests/qapi-schema/duplicate-key.err
> @@ -1 +1 @@
> -tests/qapi-schema/duplicate-key.json:3:10: Duplicate key "key"
> +tests/qapi-schema/duplicate-key.qapi:3:10: Duplicate key "key"
> diff --git a/tests/qapi-schema/duplicate-key.json b/tests/qapi-schema/duplicate-key.qapi
> similarity index 100%
> rename from tests/qapi-schema/duplicate-key.json
> rename to tests/qapi-schema/duplicate-key.qapi
> diff --git a/tests/qapi-schema/empty.json b/tests/qapi-schema/empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/empty.json
> rename to tests/qapi-schema/empty.qapi
> diff --git a/tests/qapi-schema/enum-bad-name.err b/tests/qapi-schema/enum-bad-name.err
> index 9c3c1002b78..485965dfb99 100644
> --- a/tests/qapi-schema/enum-bad-name.err
> +++ b/tests/qapi-schema/enum-bad-name.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-bad-name.json:2: Member of enum 'MyEnum' uses invalid name 'not^possible'
> +tests/qapi-schema/enum-bad-name.qapi:2: Member of enum 'MyEnum' uses invalid name 'not^possible'
> diff --git a/tests/qapi-schema/enum-bad-name.json b/tests/qapi-schema/enum-bad-name.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-bad-name.json
> rename to tests/qapi-schema/enum-bad-name.qapi
> diff --git a/tests/qapi-schema/enum-bad-prefix.err b/tests/qapi-schema/enum-bad-prefix.err
> index 399f5f7af5c..10ef1ca6192 100644
> --- a/tests/qapi-schema/enum-bad-prefix.err
> +++ b/tests/qapi-schema/enum-bad-prefix.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-bad-prefix.json:2: Enum 'MyEnum' requires a string for 'prefix'
> +tests/qapi-schema/enum-bad-prefix.qapi:2: Enum 'MyEnum' requires a string for 'prefix'
> diff --git a/tests/qapi-schema/enum-bad-prefix.json b/tests/qapi-schema/enum-bad-prefix.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-bad-prefix.json
> rename to tests/qapi-schema/enum-bad-prefix.qapi
> diff --git a/tests/qapi-schema/enum-clash-member.err b/tests/qapi-schema/enum-clash-member.err
> index 5403c785079..3a1b6d95e23 100644
> --- a/tests/qapi-schema/enum-clash-member.err
> +++ b/tests/qapi-schema/enum-clash-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-clash-member.json:2: 'one_two' (member of MyEnum) collides with 'one-two' (member of MyEnum)
> +tests/qapi-schema/enum-clash-member.qapi:2: 'one_two' (member of MyEnum) collides with 'one-two' (member of MyEnum)
> diff --git a/tests/qapi-schema/enum-clash-member.json b/tests/qapi-schema/enum-clash-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-clash-member.json
> rename to tests/qapi-schema/enum-clash-member.qapi
> diff --git a/tests/qapi-schema/enum-dict-member.err b/tests/qapi-schema/enum-dict-member.err
> index 8ca146ea592..e758d0f4de1 100644
> --- a/tests/qapi-schema/enum-dict-member.err
> +++ b/tests/qapi-schema/enum-dict-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-dict-member.json:2: Member of enum 'MyEnum' requires a string name
> +tests/qapi-schema/enum-dict-member.qapi:2: Member of enum 'MyEnum' requires a string name
> diff --git a/tests/qapi-schema/enum-dict-member.json b/tests/qapi-schema/enum-dict-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-dict-member.json
> rename to tests/qapi-schema/enum-dict-member.qapi
> diff --git a/tests/qapi-schema/enum-int-member.err b/tests/qapi-schema/enum-int-member.err
> index 071c5213d8e..25d0034786f 100644
> --- a/tests/qapi-schema/enum-int-member.err
> +++ b/tests/qapi-schema/enum-int-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-int-member.json:3:31: Stray "1"
> +tests/qapi-schema/enum-int-member.qapi:3:31: Stray "1"
> diff --git a/tests/qapi-schema/enum-int-member.json b/tests/qapi-schema/enum-int-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-int-member.json
> rename to tests/qapi-schema/enum-int-member.qapi
> diff --git a/tests/qapi-schema/enum-member-case.err b/tests/qapi-schema/enum-member-case.err
> index 3c67a3a067e..73bb81caf72 100644
> --- a/tests/qapi-schema/enum-member-case.err
> +++ b/tests/qapi-schema/enum-member-case.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-member-case.json:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
> +tests/qapi-schema/enum-member-case.qapi:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
> diff --git a/tests/qapi-schema/enum-member-case.json b/tests/qapi-schema/enum-member-case.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-member-case.json
> rename to tests/qapi-schema/enum-member-case.qapi
> diff --git a/tests/qapi-schema/enum-missing-data.err b/tests/qapi-schema/enum-missing-data.err
> index ba4873ae69a..ed90e42f0c8 100644
> --- a/tests/qapi-schema/enum-missing-data.err
> +++ b/tests/qapi-schema/enum-missing-data.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-missing-data.json:2: Key 'data' is missing from enum 'MyEnum'
> +tests/qapi-schema/enum-missing-data.qapi:2: Key 'data' is missing from enum 'MyEnum'
> diff --git a/tests/qapi-schema/enum-missing-data.json b/tests/qapi-schema/enum-missing-data.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-missing-data.json
> rename to tests/qapi-schema/enum-missing-data.qapi
> diff --git a/tests/qapi-schema/enum-wrong-data.err b/tests/qapi-schema/enum-wrong-data.err
> index 11b43471cf3..8cb349fc51a 100644
> --- a/tests/qapi-schema/enum-wrong-data.err
> +++ b/tests/qapi-schema/enum-wrong-data.err
> @@ -1 +1 @@
> -tests/qapi-schema/enum-wrong-data.json:2: Enum 'MyEnum' requires an array for 'data'
> +tests/qapi-schema/enum-wrong-data.qapi:2: Enum 'MyEnum' requires an array for 'data'
> diff --git a/tests/qapi-schema/enum-wrong-data.json b/tests/qapi-schema/enum-wrong-data.qapi
> similarity index 100%
> rename from tests/qapi-schema/enum-wrong-data.json
> rename to tests/qapi-schema/enum-wrong-data.qapi
> diff --git a/tests/qapi-schema/escape-outside-string.err b/tests/qapi-schema/escape-outside-string.err
> index b9b8837fd2e..3e3bcd76f6e 100644
> --- a/tests/qapi-schema/escape-outside-string.err
> +++ b/tests/qapi-schema/escape-outside-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/escape-outside-string.json:3:27: Stray "\"
> +tests/qapi-schema/escape-outside-string.qapi:3:27: Stray "\"
> diff --git a/tests/qapi-schema/escape-outside-string.json b/tests/qapi-schema/escape-outside-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/escape-outside-string.json
> rename to tests/qapi-schema/escape-outside-string.qapi
> diff --git a/tests/qapi-schema/escape-too-big.err b/tests/qapi-schema/escape-too-big.err
> index d9aeb5dc38a..9ade8c10de1 100644
> --- a/tests/qapi-schema/escape-too-big.err
> +++ b/tests/qapi-schema/escape-too-big.err
> @@ -1 +1 @@
> -tests/qapi-schema/escape-too-big.json:3:14: For now, \u escape only supports non-zero values up to \u007f
> +tests/qapi-schema/escape-too-big.qapi:3:14: For now, \u escape only supports non-zero values up to \u007f
> diff --git a/tests/qapi-schema/escape-too-big.json b/tests/qapi-schema/escape-too-big.qapi
> similarity index 100%
> rename from tests/qapi-schema/escape-too-big.json
> rename to tests/qapi-schema/escape-too-big.qapi
> diff --git a/tests/qapi-schema/escape-too-short.err b/tests/qapi-schema/escape-too-short.err
> index 934de598ee2..7c36fe81a54 100644
> --- a/tests/qapi-schema/escape-too-short.err
> +++ b/tests/qapi-schema/escape-too-short.err
> @@ -1 +1 @@
> -tests/qapi-schema/escape-too-short.json:3:14: \u escape needs 4 hex digits
> +tests/qapi-schema/escape-too-short.qapi:3:14: \u escape needs 4 hex digits
> diff --git a/tests/qapi-schema/escape-too-short.json b/tests/qapi-schema/escape-too-short.qapi
> similarity index 100%
> rename from tests/qapi-schema/escape-too-short.json
> rename to tests/qapi-schema/escape-too-short.qapi
> diff --git a/tests/qapi-schema/event-boxed-empty.err b/tests/qapi-schema/event-boxed-empty.err
> index 68ec6f2d2bd..5ae28cd9319 100644
> --- a/tests/qapi-schema/event-boxed-empty.err
> +++ b/tests/qapi-schema/event-boxed-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/event-boxed-empty.json:2: Use of 'boxed' requires 'data'
> +tests/qapi-schema/event-boxed-empty.qapi:2: Use of 'boxed' requires 'data'
> diff --git a/tests/qapi-schema/event-boxed-empty.json b/tests/qapi-schema/event-boxed-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/event-boxed-empty.json
> rename to tests/qapi-schema/event-boxed-empty.qapi
> diff --git a/tests/qapi-schema/event-case.out b/tests/qapi-schema/event-case.out
> index 88c0964917a..6fbaefb98c3 100644
> --- a/tests/qapi-schema/event-case.out
> +++ b/tests/qapi-schema/event-case.out
> @@ -1,6 +1,6 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module event-case.json
> +module event-case.qapi
>  event oops None
>     boxed=False
> diff --git a/tests/qapi-schema/event-case.json b/tests/qapi-schema/event-case.qapi
> similarity index 100%
> rename from tests/qapi-schema/event-case.json
> rename to tests/qapi-schema/event-case.qapi
> diff --git a/tests/qapi-schema/event-nest-struct.err b/tests/qapi-schema/event-nest-struct.err
> index 5a42701b8f2..7d94765c06f 100644
> --- a/tests/qapi-schema/event-nest-struct.err
> +++ b/tests/qapi-schema/event-nest-struct.err
> @@ -1 +1 @@
> -tests/qapi-schema/event-nest-struct.json:1: Member 'a' of 'data' for event 'EVENT_A' should be a type name
> +tests/qapi-schema/event-nest-struct.qapi:1: Member 'a' of 'data' for event 'EVENT_A' should be a type name
> diff --git a/tests/qapi-schema/event-nest-struct.json b/tests/qapi-schema/event-nest-struct.qapi
> similarity index 100%
> rename from tests/qapi-schema/event-nest-struct.json
> rename to tests/qapi-schema/event-nest-struct.qapi
> diff --git a/tests/qapi-schema/flat-union-array-branch.err b/tests/qapi-schema/flat-union-array-branch.err
> index 8ea91eadb2d..cd767b524c3 100644
> --- a/tests/qapi-schema/flat-union-array-branch.err
> +++ b/tests/qapi-schema/flat-union-array-branch.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-array-branch.json:8: Member 'value1' of union 'TestUnion' cannot be an array
> +tests/qapi-schema/flat-union-array-branch.qapi:8: Member 'value1' of union 'TestUnion' cannot be an array
> diff --git a/tests/qapi-schema/flat-union-array-branch.json b/tests/qapi-schema/flat-union-array-branch.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-array-branch.json
> rename to tests/qapi-schema/flat-union-array-branch.qapi
> diff --git a/tests/qapi-schema/flat-union-bad-base.err b/tests/qapi-schema/flat-union-bad-base.err
> index bee24a217ae..e09b8b3cdf0 100644
> --- a/tests/qapi-schema/flat-union-bad-base.err
> +++ b/tests/qapi-schema/flat-union-bad-base.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-bad-base.json:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
> +tests/qapi-schema/flat-union-bad-base.qapi:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
> diff --git a/tests/qapi-schema/flat-union-bad-base.json b/tests/qapi-schema/flat-union-bad-base.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-bad-base.json
> rename to tests/qapi-schema/flat-union-bad-base.qapi
> diff --git a/tests/qapi-schema/flat-union-bad-discriminator.err b/tests/qapi-schema/flat-union-bad-discriminator.err
> index c38cc8e4dfd..c2817008c5f 100644
> --- a/tests/qapi-schema/flat-union-bad-discriminator.err
> +++ b/tests/qapi-schema/flat-union-bad-discriminator.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-bad-discriminator.json:11: Discriminator of flat union 'TestUnion' requires a string name
> +tests/qapi-schema/flat-union-bad-discriminator.qapi:11: Discriminator of flat union 'TestUnion' requires a string name
> diff --git a/tests/qapi-schema/flat-union-bad-discriminator.json b/tests/qapi-schema/flat-union-bad-discriminator.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-bad-discriminator.json
> rename to tests/qapi-schema/flat-union-bad-discriminator.qapi
> diff --git a/tests/qapi-schema/flat-union-base-any.err b/tests/qapi-schema/flat-union-base-any.err
> index 646f1c9cd11..feed578a29b 100644
> --- a/tests/qapi-schema/flat-union-base-any.err
> +++ b/tests/qapi-schema/flat-union-base-any.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-base-any.json:8: 'base' for union 'TestUnion' cannot use built-in type 'any'
> +tests/qapi-schema/flat-union-base-any.qapi:8: 'base' for union 'TestUnion' cannot use built-in type 'any'
> diff --git a/tests/qapi-schema/flat-union-base-any.json b/tests/qapi-schema/flat-union-base-any.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-base-any.json
> rename to tests/qapi-schema/flat-union-base-any.qapi
> diff --git a/tests/qapi-schema/flat-union-base-union.err b/tests/qapi-schema/flat-union-base-union.err
> index f138395e456..9fca152d2c8 100644
> --- a/tests/qapi-schema/flat-union-base-union.err
> +++ b/tests/qapi-schema/flat-union-base-union.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-base-union.json:14: 'base' for union 'TestUnion' cannot use union type 'UnionBase'
> +tests/qapi-schema/flat-union-base-union.qapi:14: 'base' for union 'TestUnion' cannot use union type 'UnionBase'
> diff --git a/tests/qapi-schema/flat-union-base-union.json b/tests/qapi-schema/flat-union-base-union.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-base-union.json
> rename to tests/qapi-schema/flat-union-base-union.qapi
> diff --git a/tests/qapi-schema/flat-union-clash-member.err b/tests/qapi-schema/flat-union-clash-member.err
> index 2adf69755ab..bd8dc62222e 100644
> --- a/tests/qapi-schema/flat-union-clash-member.err
> +++ b/tests/qapi-schema/flat-union-clash-member.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-clash-member.json:11: 'name' (member of Branch1) collides with 'name' (member of Base)
> +tests/qapi-schema/flat-union-clash-member.qapi:11: 'name' (member of Branch1) collides with 'name' (member of Base)
> diff --git a/tests/qapi-schema/flat-union-clash-member.json b/tests/qapi-schema/flat-union-clash-member.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-clash-member.json
> rename to tests/qapi-schema/flat-union-clash-member.qapi
> diff --git a/tests/qapi-schema/flat-union-empty.err b/tests/qapi-schema/flat-union-empty.err
> index 15754f54eb9..b39f0761e94 100644
> --- a/tests/qapi-schema/flat-union-empty.err
> +++ b/tests/qapi-schema/flat-union-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-empty.json:4: Union 'Union' cannot have empty 'data'
> +tests/qapi-schema/flat-union-empty.qapi:4: Union 'Union' cannot have empty 'data'
> diff --git a/tests/qapi-schema/flat-union-empty.json b/tests/qapi-schema/flat-union-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-empty.json
> rename to tests/qapi-schema/flat-union-empty.qapi
> diff --git a/tests/qapi-schema/flat-union-incomplete-branch.err b/tests/qapi-schema/flat-union-incomplete-branch.err
> index e826bf07893..9fe7d2f43cd 100644
> --- a/tests/qapi-schema/flat-union-incomplete-branch.err
> +++ b/tests/qapi-schema/flat-union-incomplete-branch.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-incomplete-branch.json:6: Union 'TestUnion' data missing 'value2' branch
> +tests/qapi-schema/flat-union-incomplete-branch.qapi:6: Union 'TestUnion' data missing 'value2' branch
> diff --git a/tests/qapi-schema/flat-union-incomplete-branch.json b/tests/qapi-schema/flat-union-incomplete-branch.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-incomplete-branch.json
> rename to tests/qapi-schema/flat-union-incomplete-branch.qapi
> diff --git a/tests/qapi-schema/flat-union-inline.err b/tests/qapi-schema/flat-union-inline.err
> index 2333358d28b..d16e6cd87c5 100644
> --- a/tests/qapi-schema/flat-union-inline.err
> +++ b/tests/qapi-schema/flat-union-inline.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-inline.json:7: Member 'value1' of union 'TestUnion' should be a type name
> +tests/qapi-schema/flat-union-inline.qapi:7: Member 'value1' of union 'TestUnion' should be a type name
> diff --git a/tests/qapi-schema/flat-union-inline.json b/tests/qapi-schema/flat-union-inline.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-inline.json
> rename to tests/qapi-schema/flat-union-inline.qapi
> diff --git a/tests/qapi-schema/flat-union-int-branch.err b/tests/qapi-schema/flat-union-int-branch.err
> index faf01573b79..8baf223a691 100644
> --- a/tests/qapi-schema/flat-union-int-branch.err
> +++ b/tests/qapi-schema/flat-union-int-branch.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-int-branch.json:8: Member 'value1' of union 'TestUnion' cannot use built-in type 'int'
> +tests/qapi-schema/flat-union-int-branch.qapi:8: Member 'value1' of union 'TestUnion' cannot use built-in type 'int'
> diff --git a/tests/qapi-schema/flat-union-int-branch.json b/tests/qapi-schema/flat-union-int-branch.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-int-branch.json
> rename to tests/qapi-schema/flat-union-int-branch.qapi
> diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.err b/tests/qapi-schema/flat-union-invalid-branch-key.err
> index ccf72d2dfe2..3dfc7521810 100644
> --- a/tests/qapi-schema/flat-union-invalid-branch-key.err
> +++ b/tests/qapi-schema/flat-union-invalid-branch-key.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-invalid-branch-key.json:13: Discriminator value 'value_wrong' is not found in enum 'TestEnum'
> +tests/qapi-schema/flat-union-invalid-branch-key.qapi:13: Discriminator value 'value_wrong' is not found in enum 'TestEnum'
> diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.json b/tests/qapi-schema/flat-union-invalid-branch-key.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-invalid-branch-key.json
> rename to tests/qapi-schema/flat-union-invalid-branch-key.qapi
> diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.err b/tests/qapi-schema/flat-union-invalid-discriminator.err
> index 5f4055614ea..5490a3fa942 100644
> --- a/tests/qapi-schema/flat-union-invalid-discriminator.err
> +++ b/tests/qapi-schema/flat-union-invalid-discriminator.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-invalid-discriminator.json:13: Discriminator 'enum_wrong' is not a member of base struct 'TestBase'
> +tests/qapi-schema/flat-union-invalid-discriminator.qapi:13: Discriminator 'enum_wrong' is not a member of base struct 'TestBase'
> diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.json b/tests/qapi-schema/flat-union-invalid-discriminator.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-invalid-discriminator.json
> rename to tests/qapi-schema/flat-union-invalid-discriminator.qapi
> diff --git a/tests/qapi-schema/flat-union-no-base.err b/tests/qapi-schema/flat-union-no-base.err
> index 841c93b5544..b0de89317d8 100644
> --- a/tests/qapi-schema/flat-union-no-base.err
> +++ b/tests/qapi-schema/flat-union-no-base.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-no-base.json:9: Flat union 'TestUnion' must have a base
> +tests/qapi-schema/flat-union-no-base.qapi:9: Flat union 'TestUnion' must have a base
> diff --git a/tests/qapi-schema/flat-union-no-base.json b/tests/qapi-schema/flat-union-no-base.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-no-base.json
> rename to tests/qapi-schema/flat-union-no-base.qapi
> diff --git a/tests/qapi-schema/flat-union-optional-discriminator.err b/tests/qapi-schema/flat-union-optional-discriminator.err
> index aaabedb3bd6..d905598456b 100644
> --- a/tests/qapi-schema/flat-union-optional-discriminator.err
> +++ b/tests/qapi-schema/flat-union-optional-discriminator.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-optional-discriminator.json:6: Discriminator of flat union 'MyUnion' does not allow optional name '*switch'
> +tests/qapi-schema/flat-union-optional-discriminator.qapi:6: Discriminator of flat union 'MyUnion' does not allow optional name '*switch'
> diff --git a/tests/qapi-schema/flat-union-optional-discriminator.json b/tests/qapi-schema/flat-union-optional-discriminator.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-optional-discriminator.json
> rename to tests/qapi-schema/flat-union-optional-discriminator.qapi
> diff --git a/tests/qapi-schema/flat-union-string-discriminator.err b/tests/qapi-schema/flat-union-string-discriminator.err
> index 200016bd5c5..d8ce54a09f0 100644
> --- a/tests/qapi-schema/flat-union-string-discriminator.err
> +++ b/tests/qapi-schema/flat-union-string-discriminator.err
> @@ -1 +1 @@
> -tests/qapi-schema/flat-union-string-discriminator.json:13: Discriminator 'kind' must be of enumeration type
> +tests/qapi-schema/flat-union-string-discriminator.qapi:13: Discriminator 'kind' must be of enumeration type
> diff --git a/tests/qapi-schema/flat-union-string-discriminator.json b/tests/qapi-schema/flat-union-string-discriminator.qapi
> similarity index 100%
> rename from tests/qapi-schema/flat-union-string-discriminator.json
> rename to tests/qapi-schema/flat-union-string-discriminator.qapi
> diff --git a/tests/qapi-schema/funny-char.err b/tests/qapi-schema/funny-char.err
> index bfc890cd9f2..990b44e1468 100644
> --- a/tests/qapi-schema/funny-char.err
> +++ b/tests/qapi-schema/funny-char.err
> @@ -1 +1 @@
> -tests/qapi-schema/funny-char.json:2:36: Stray ";"
> +tests/qapi-schema/funny-char.qapi:2:36: Stray ";"
> diff --git a/tests/qapi-schema/funny-char.json b/tests/qapi-schema/funny-char.qapi
> similarity index 100%
> rename from tests/qapi-schema/funny-char.json
> rename to tests/qapi-schema/funny-char.qapi
> diff --git a/tests/qapi-schema/ident-with-escape.out b/tests/qapi-schema/ident-with-escape.out
> index 82213aa51dd..3bb7c434340 100644
> --- a/tests/qapi-schema/ident-with-escape.out
> +++ b/tests/qapi-schema/ident-with-escape.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module ident-with-escape.json
> +module ident-with-escape.qapi
>  object q_obj_fooA-arg
>      member bar1: str optional=False
>  command fooA q_obj_fooA-arg -> None
> diff --git a/tests/qapi-schema/ident-with-escape.json b/tests/qapi-schema/ident-with-escape.qapi
> similarity index 100%
> rename from tests/qapi-schema/ident-with-escape.json
> rename to tests/qapi-schema/ident-with-escape.qapi
> diff --git a/tests/qapi-schema/include-before-err.err b/tests/qapi-schema/include-before-err.err
> index 55652751e10..d9f0cf5db10 100644
> --- a/tests/qapi-schema/include-before-err.err
> +++ b/tests/qapi-schema/include-before-err.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-before-err.json:2:13: Expected ":"
> +tests/qapi-schema/include-before-err.qapi:2:13: Expected ":"
> diff --git a/tests/qapi-schema/include-before-err.json b/tests/qapi-schema/include-before-err.json
> deleted file mode 100644
> index afb6cb63c47..00000000000
> --- a/tests/qapi-schema/include-before-err.json
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -{ 'include': 'include-simple-sub.json' }
> -{ 'command' 'missing-colon' }
> diff --git a/tests/qapi-schema/include-before-err.qapi b/tests/qapi-schema/include-before-err.qapi
> new file mode 100644
> index 00000000000..f1e5fa6d417
> --- /dev/null
> +++ b/tests/qapi-schema/include-before-err.qapi
> @@ -0,0 +1,2 @@
> +{ 'include': 'include-simple-sub.qapi' }
> +{ 'command' 'missing-colon' }
> diff --git a/tests/qapi-schema/include-cycle-b.json b/tests/qapi-schema/include-cycle-b.json
> deleted file mode 100644
> index 4fa985dcd59..00000000000
> --- a/tests/qapi-schema/include-cycle-b.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-cycle-c.json' }
> diff --git a/tests/qapi-schema/include-cycle-b.qapi b/tests/qapi-schema/include-cycle-b.qapi
> new file mode 100644
> index 00000000000..ef8aa0d8bdb
> --- /dev/null
> +++ b/tests/qapi-schema/include-cycle-b.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-cycle-c.qapi' }
> diff --git a/tests/qapi-schema/include-cycle-c.json b/tests/qapi-schema/include-cycle-c.json
> deleted file mode 100644
> index d12b5924a36..00000000000
> --- a/tests/qapi-schema/include-cycle-c.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-cycle.json' }
> diff --git a/tests/qapi-schema/include-cycle-c.qapi b/tests/qapi-schema/include-cycle-c.qapi
> new file mode 100644
> index 00000000000..dfa26a712ab
> --- /dev/null
> +++ b/tests/qapi-schema/include-cycle-c.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-cycle.qapi' }
> diff --git a/tests/qapi-schema/include-cycle.err b/tests/qapi-schema/include-cycle.err
> index bdcd07dce25..99a1ea20fc8 100644
> --- a/tests/qapi-schema/include-cycle.err
> +++ b/tests/qapi-schema/include-cycle.err
> @@ -1,3 +1,3 @@
> -In file included from tests/qapi-schema/include-cycle.json:1:
> -In file included from tests/qapi-schema/include-cycle-b.json:1:
> -tests/qapi-schema/include-cycle-c.json:1: Inclusion loop for include-cycle.json
> +In file included from tests/qapi-schema/include-cycle.qapi:1:
> +In file included from tests/qapi-schema/include-cycle-b.qapi:1:
> +tests/qapi-schema/include-cycle-c.qapi:1: Inclusion loop for include-cycle.qapi
> diff --git a/tests/qapi-schema/include-cycle.json b/tests/qapi-schema/include-cycle.json
> deleted file mode 100644
> index 6fcf1ebaac8..00000000000
> --- a/tests/qapi-schema/include-cycle.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-cycle-b.json' }
> diff --git a/tests/qapi-schema/include-cycle.qapi b/tests/qapi-schema/include-cycle.qapi
> new file mode 100644
> index 00000000000..9feca30e6de
> --- /dev/null
> +++ b/tests/qapi-schema/include-cycle.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-cycle-b.qapi' }
> diff --git a/tests/qapi-schema/include-extra-junk.err b/tests/qapi-schema/include-extra-junk.err
> index e6ef2a3720d..4a98d794483 100644
> --- a/tests/qapi-schema/include-extra-junk.err
> +++ b/tests/qapi-schema/include-extra-junk.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-extra-junk.json:3: Invalid 'include' directive
> +tests/qapi-schema/include-extra-junk.qapi:3: Invalid 'include' directive
> diff --git a/tests/qapi-schema/include-extra-junk.json b/tests/qapi-schema/include-extra-junk.json
> deleted file mode 100644
> index 25fe85078de..00000000000
> --- a/tests/qapi-schema/include-extra-junk.json
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -# 'include' must be the sole member
> -
> -{ 'include': 'comments.json', 'junk': true }
> diff --git a/tests/qapi-schema/include-extra-junk.qapi b/tests/qapi-schema/include-extra-junk.qapi
> new file mode 100644
> index 00000000000..609f9d5449f
> --- /dev/null
> +++ b/tests/qapi-schema/include-extra-junk.qapi
> @@ -0,0 +1,3 @@
> +# 'include' must be the sole member
> +
> +{ 'include': 'comments.qapi', 'junk': true }
> diff --git a/tests/qapi-schema/include-format-err.err b/tests/qapi-schema/include-format-err.err
> index 721ff4eccc0..1143089323b 100644
> --- a/tests/qapi-schema/include-format-err.err
> +++ b/tests/qapi-schema/include-format-err.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-format-err.json:1: Invalid 'include' directive
> +tests/qapi-schema/include-format-err.qapi:1: Invalid 'include' directive
> diff --git a/tests/qapi-schema/include-format-err.json b/tests/qapi-schema/include-format-err.json
> deleted file mode 100644
> index 44980f026f8..00000000000
> --- a/tests/qapi-schema/include-format-err.json
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -{ 'include': 'include-simple-sub.json',
> -  'foo': 'bar' }
> diff --git a/tests/qapi-schema/include-format-err.qapi b/tests/qapi-schema/include-format-err.qapi
> new file mode 100644
> index 00000000000..f17f16e6dc3
> --- /dev/null
> +++ b/tests/qapi-schema/include-format-err.qapi
> @@ -0,0 +1,2 @@
> +{ 'include': 'include-simple-sub.qapi',
> +  'foo': 'bar' }
> diff --git a/tests/qapi-schema/include-nested-err.err b/tests/qapi-schema/include-nested-err.err
> index 1b7b22706be..9a13aa8a802 100644
> --- a/tests/qapi-schema/include-nested-err.err
> +++ b/tests/qapi-schema/include-nested-err.err
> @@ -1,2 +1,2 @@
> -In file included from tests/qapi-schema/include-nested-err.json:1:
> -tests/qapi-schema/missing-colon.json:1:10: Expected ":"
> +In file included from tests/qapi-schema/include-nested-err.qapi:1:
> +tests/qapi-schema/missing-colon.qapi:1:10: Expected ":"
> diff --git a/tests/qapi-schema/include-nested-err.json b/tests/qapi-schema/include-nested-err.json
> deleted file mode 100644
> index 5631e56ea0d..00000000000
> --- a/tests/qapi-schema/include-nested-err.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'missing-colon.json' }
> diff --git a/tests/qapi-schema/include-nested-err.qapi b/tests/qapi-schema/include-nested-err.qapi
> new file mode 100644
> index 00000000000..34b249824fb
> --- /dev/null
> +++ b/tests/qapi-schema/include-nested-err.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'missing-colon.qapi' }
> diff --git a/tests/qapi-schema/include-no-file.err b/tests/qapi-schema/include-no-file.err
> index e42bcf4bc1a..770db16793c 100644
> --- a/tests/qapi-schema/include-no-file.err
> +++ b/tests/qapi-schema/include-no-file.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-no-file.json:1: No such file or directory: tests/qapi-schema/include-no-file-sub.json
> +tests/qapi-schema/include-no-file.qapi:1: No such file or directory: tests/qapi-schema/include-no-file-sub.qapi
> diff --git a/tests/qapi-schema/include-no-file.json b/tests/qapi-schema/include-no-file.json
> deleted file mode 100644
> index 9249ebd50c2..00000000000
> --- a/tests/qapi-schema/include-no-file.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-no-file-sub.json' }
> diff --git a/tests/qapi-schema/include-no-file.qapi b/tests/qapi-schema/include-no-file.qapi
> new file mode 100644
> index 00000000000..2f0d0633eb5
> --- /dev/null
> +++ b/tests/qapi-schema/include-no-file.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-no-file-sub.qapi' }
> diff --git a/tests/qapi-schema/include-non-file.err b/tests/qapi-schema/include-non-file.err
> index faae1eacf1a..5f60d553727 100644
> --- a/tests/qapi-schema/include-non-file.err
> +++ b/tests/qapi-schema/include-non-file.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-non-file.json:1: Value of 'include' must be a string
> +tests/qapi-schema/include-non-file.qapi:1: Value of 'include' must be a string
> diff --git a/tests/qapi-schema/include-non-file.json b/tests/qapi-schema/include-non-file.qapi
> similarity index 100%
> rename from tests/qapi-schema/include-non-file.json
> rename to tests/qapi-schema/include-non-file.qapi
> diff --git a/tests/qapi-schema/include-relpath-sub.json b/tests/qapi-schema/include-relpath-sub.qapi
> similarity index 100%
> rename from tests/qapi-schema/include-relpath-sub.json
> rename to tests/qapi-schema/include-relpath-sub.qapi
> diff --git a/tests/qapi-schema/include-relpath.json b/tests/qapi-schema/include-relpath.json
> deleted file mode 100644
> index 05018f39083..00000000000
> --- a/tests/qapi-schema/include-relpath.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include/relpath.json' }
> diff --git a/tests/qapi-schema/include-relpath.out b/tests/qapi-schema/include-relpath.out
> index ebbabd7a186..67828f2cebd 100644
> --- a/tests/qapi-schema/include-relpath.out
> +++ b/tests/qapi-schema/include-relpath.out
> @@ -1,9 +1,9 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module include-relpath.json
> -include include/relpath.json
> -module include/relpath.json
> -include include-relpath-sub.json
> -module include-relpath-sub.json
> +module include-relpath.qapi
> +include include/relpath.qapi
> +module include/relpath.qapi
> +include include-relpath-sub.qapi
> +module include-relpath-sub.qapi
>  enum Status ['good', 'bad', 'ugly']
> diff --git a/tests/qapi-schema/include-relpath.qapi b/tests/qapi-schema/include-relpath.qapi
> new file mode 100644
> index 00000000000..f4e5205084f
> --- /dev/null
> +++ b/tests/qapi-schema/include-relpath.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include/relpath.qapi' }
> diff --git a/tests/qapi-schema/include-repetition-sub.json b/tests/qapi-schema/include-repetition-sub.json
> deleted file mode 100644
> index 6bfffdfd556..00000000000
> --- a/tests/qapi-schema/include-repetition-sub.json
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -{ 'include': 'comments.json' }
> -{ 'include': 'comments.json' }
> diff --git a/tests/qapi-schema/include-repetition-sub.qapi b/tests/qapi-schema/include-repetition-sub.qapi
> new file mode 100644
> index 00000000000..92bcc7fab47
> --- /dev/null
> +++ b/tests/qapi-schema/include-repetition-sub.qapi
> @@ -0,0 +1,2 @@
> +{ 'include': 'comments.qapi' }
> +{ 'include': 'comments.qapi' }
> diff --git a/tests/qapi-schema/include-repetition.json b/tests/qapi-schema/include-repetition.json
> deleted file mode 100644
> index ec329dde586..00000000000
> --- a/tests/qapi-schema/include-repetition.json
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -{ 'include': 'comments.json' }
> -{ 'include': 'include-repetition-sub.json' }
> -{ 'include': 'comments.json' }
> diff --git a/tests/qapi-schema/include-repetition.out b/tests/qapi-schema/include-repetition.out
> index 7235e055bc1..6c4c8aec5d8 100644
> --- a/tests/qapi-schema/include-repetition.out
> +++ b/tests/qapi-schema/include-repetition.out
> @@ -1,14 +1,14 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module include-repetition.json
> -include comments.json
> -module comments.json
> +module include-repetition.qapi
> +include comments.qapi
> +module comments.qapi
>  enum Status ['good', 'bad', 'ugly']
> -module include-repetition.json
> -include include-repetition-sub.json
> -module include-repetition-sub.json
> -include comments.json
> -include comments.json
> -module include-repetition.json
> -include comments.json
> +module include-repetition.qapi
> +include include-repetition-sub.qapi
> +module include-repetition-sub.qapi
> +include comments.qapi
> +include comments.qapi
> +module include-repetition.qapi
> +include comments.qapi
> diff --git a/tests/qapi-schema/include-repetition.qapi b/tests/qapi-schema/include-repetition.qapi
> new file mode 100644
> index 00000000000..7d0dd95c233
> --- /dev/null
> +++ b/tests/qapi-schema/include-repetition.qapi
> @@ -0,0 +1,3 @@
> +{ 'include': 'comments.qapi' }
> +{ 'include': 'include-repetition-sub.qapi' }
> +{ 'include': 'comments.qapi' }
> diff --git a/tests/qapi-schema/include-self-cycle.err b/tests/qapi-schema/include-self-cycle.err
> index 981742ae5f5..7c0f7711777 100644
> --- a/tests/qapi-schema/include-self-cycle.err
> +++ b/tests/qapi-schema/include-self-cycle.err
> @@ -1 +1 @@
> -tests/qapi-schema/include-self-cycle.json:1: Inclusion loop for include-self-cycle.json
> +tests/qapi-schema/include-self-cycle.qapi:1: Inclusion loop for include-self-cycle.qapi
> diff --git a/tests/qapi-schema/include-self-cycle.json b/tests/qapi-schema/include-self-cycle.json
> deleted file mode 100644
> index 55fb1b596fa..00000000000
> --- a/tests/qapi-schema/include-self-cycle.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-self-cycle.json' }
> diff --git a/tests/qapi-schema/include-self-cycle.qapi b/tests/qapi-schema/include-self-cycle.qapi
> new file mode 100644
> index 00000000000..8517ba9e202
> --- /dev/null
> +++ b/tests/qapi-schema/include-self-cycle.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-self-cycle.qapi' }
> diff --git a/tests/qapi-schema/include-simple-sub.json b/tests/qapi-schema/include-simple-sub.qapi
> similarity index 100%
> rename from tests/qapi-schema/include-simple-sub.json
> rename to tests/qapi-schema/include-simple-sub.qapi
> diff --git a/tests/qapi-schema/include-simple.json b/tests/qapi-schema/include-simple.json
> deleted file mode 100644
> index 1dd391a5925..00000000000
> --- a/tests/qapi-schema/include-simple.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': 'include-simple-sub.json' }
> diff --git a/tests/qapi-schema/include-simple.out b/tests/qapi-schema/include-simple.out
> index 006f723eebc..3ec2d051c33 100644
> --- a/tests/qapi-schema/include-simple.out
> +++ b/tests/qapi-schema/include-simple.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module include-simple.json
> -include include-simple-sub.json
> -module include-simple-sub.json
> +module include-simple.qapi
> +include include-simple-sub.qapi
> +module include-simple-sub.qapi
>  enum Status ['good', 'bad', 'ugly']
> diff --git a/tests/qapi-schema/include-simple.qapi b/tests/qapi-schema/include-simple.qapi
> new file mode 100644
> index 00000000000..312aa7ed7f3
> --- /dev/null
> +++ b/tests/qapi-schema/include-simple.qapi
> @@ -0,0 +1 @@
> +{ 'include': 'include-simple-sub.qapi' }
> diff --git a/tests/qapi-schema/include/relpath.json b/tests/qapi-schema/include/relpath.json
> deleted file mode 100644
> index 45dee247048..00000000000
> --- a/tests/qapi-schema/include/relpath.json
> +++ /dev/null
> @@ -1 +0,0 @@
> -{ 'include': '../include-relpath-sub.json' }
> diff --git a/tests/qapi-schema/include/relpath.qapi b/tests/qapi-schema/include/relpath.qapi
> new file mode 100644
> index 00000000000..081be90ef70
> --- /dev/null
> +++ b/tests/qapi-schema/include/relpath.qapi
> @@ -0,0 +1 @@
> +{ 'include': '../include-relpath-sub.qapi' }
> diff --git a/tests/qapi-schema/indented-expr.out b/tests/qapi-schema/indented-expr.out
> index 862678f8f4c..8c59290610d 100644
> --- a/tests/qapi-schema/indented-expr.out
> +++ b/tests/qapi-schema/indented-expr.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module indented-expr.json
> +module indented-expr.qapi
>  command eins None -> None
>     gen=True success_response=True boxed=False oob=False
>  command zwei None -> None
> diff --git a/tests/qapi-schema/indented-expr.json b/tests/qapi-schema/indented-expr.qapi
> similarity index 100%
> rename from tests/qapi-schema/indented-expr.json
> rename to tests/qapi-schema/indented-expr.qapi
> diff --git a/tests/qapi-schema/leading-comma-list.err b/tests/qapi-schema/leading-comma-list.err
> index f5c870bb9c4..0c8eb27cb5d 100644
> --- a/tests/qapi-schema/leading-comma-list.err
> +++ b/tests/qapi-schema/leading-comma-list.err
> @@ -1 +1 @@
> -tests/qapi-schema/leading-comma-list.json:2:13: Expected "{", "[", "]", string, boolean or "null"
> +tests/qapi-schema/leading-comma-list.qapi:2:13: Expected "{", "[", "]", string, boolean or "null"
> diff --git a/tests/qapi-schema/leading-comma-list.json b/tests/qapi-schema/leading-comma-list.qapi
> similarity index 100%
> rename from tests/qapi-schema/leading-comma-list.json
> rename to tests/qapi-schema/leading-comma-list.qapi
> diff --git a/tests/qapi-schema/leading-comma-object.err b/tests/qapi-schema/leading-comma-object.err
> index f767b95544e..ca86113ddd7 100644
> --- a/tests/qapi-schema/leading-comma-object.err
> +++ b/tests/qapi-schema/leading-comma-object.err
> @@ -1 +1 @@
> -tests/qapi-schema/leading-comma-object.json:1:3: Expected string or "}"
> +tests/qapi-schema/leading-comma-object.qapi:1:3: Expected string or "}"
> diff --git a/tests/qapi-schema/leading-comma-object.json b/tests/qapi-schema/leading-comma-object.qapi
> similarity index 100%
> rename from tests/qapi-schema/leading-comma-object.json
> rename to tests/qapi-schema/leading-comma-object.qapi
> diff --git a/tests/qapi-schema/missing-colon.err b/tests/qapi-schema/missing-colon.err
> index d9d66b377af..0b72b631c4e 100644
> --- a/tests/qapi-schema/missing-colon.err
> +++ b/tests/qapi-schema/missing-colon.err
> @@ -1 +1 @@
> -tests/qapi-schema/missing-colon.json:1:10: Expected ":"
> +tests/qapi-schema/missing-colon.qapi:1:10: Expected ":"
> diff --git a/tests/qapi-schema/missing-colon.json b/tests/qapi-schema/missing-colon.qapi
> similarity index 100%
> rename from tests/qapi-schema/missing-colon.json
> rename to tests/qapi-schema/missing-colon.qapi
> diff --git a/tests/qapi-schema/missing-comma-list.err b/tests/qapi-schema/missing-comma-list.err
> index e73d2770d63..786cd6a95a6 100644
> --- a/tests/qapi-schema/missing-comma-list.err
> +++ b/tests/qapi-schema/missing-comma-list.err
> @@ -1 +1 @@
> -tests/qapi-schema/missing-comma-list.json:2:20: Expected "," or "]"
> +tests/qapi-schema/missing-comma-list.qapi:2:20: Expected "," or "]"
> diff --git a/tests/qapi-schema/missing-comma-list.json b/tests/qapi-schema/missing-comma-list.qapi
> similarity index 100%
> rename from tests/qapi-schema/missing-comma-list.json
> rename to tests/qapi-schema/missing-comma-list.qapi
> diff --git a/tests/qapi-schema/missing-comma-object.err b/tests/qapi-schema/missing-comma-object.err
> index 52b3a8a1ec8..60bf1d014eb 100644
> --- a/tests/qapi-schema/missing-comma-object.err
> +++ b/tests/qapi-schema/missing-comma-object.err
> @@ -1 +1 @@
> -tests/qapi-schema/missing-comma-object.json:2:3: Expected "," or "}"
> +tests/qapi-schema/missing-comma-object.qapi:2:3: Expected "," or "}"
> diff --git a/tests/qapi-schema/missing-comma-object.json b/tests/qapi-schema/missing-comma-object.qapi
> similarity index 100%
> rename from tests/qapi-schema/missing-comma-object.json
> rename to tests/qapi-schema/missing-comma-object.qapi
> diff --git a/tests/qapi-schema/missing-type.err b/tests/qapi-schema/missing-type.err
> index b3e7b14e420..b8cb5d116c4 100644
> --- a/tests/qapi-schema/missing-type.err
> +++ b/tests/qapi-schema/missing-type.err
> @@ -1 +1 @@
> -tests/qapi-schema/missing-type.json:2: Expression is missing metatype
> +tests/qapi-schema/missing-type.qapi:2: Expression is missing metatype
> diff --git a/tests/qapi-schema/missing-type.json b/tests/qapi-schema/missing-type.qapi
> similarity index 100%
> rename from tests/qapi-schema/missing-type.json
> rename to tests/qapi-schema/missing-type.qapi
> diff --git a/tests/qapi-schema/nested-struct-data.err b/tests/qapi-schema/nested-struct-data.err
> index da767bade23..6783e25ecf1 100644
> --- a/tests/qapi-schema/nested-struct-data.err
> +++ b/tests/qapi-schema/nested-struct-data.err
> @@ -1 +1 @@
> -tests/qapi-schema/nested-struct-data.json:2: Member 'a' of 'data' for command 'foo' should be a type name
> +tests/qapi-schema/nested-struct-data.qapi:2: Member 'a' of 'data' for command 'foo' should be a type name
> diff --git a/tests/qapi-schema/nested-struct-data.json b/tests/qapi-schema/nested-struct-data.qapi
> similarity index 100%
> rename from tests/qapi-schema/nested-struct-data.json
> rename to tests/qapi-schema/nested-struct-data.qapi
> diff --git a/tests/qapi-schema/non-objects.err b/tests/qapi-schema/non-objects.err
> index 334f0c91aea..3749ddf5159 100644
> --- a/tests/qapi-schema/non-objects.err
> +++ b/tests/qapi-schema/non-objects.err
> @@ -1 +1 @@
> -tests/qapi-schema/non-objects.json:1:1: Expected "{"
> +tests/qapi-schema/non-objects.qapi:1:1: Expected "{"
> diff --git a/tests/qapi-schema/non-objects.json b/tests/qapi-schema/non-objects.qapi
> similarity index 100%
> rename from tests/qapi-schema/non-objects.json
> rename to tests/qapi-schema/non-objects.qapi
> diff --git a/tests/qapi-schema/oob-test.err b/tests/qapi-schema/oob-test.err
> index 35b60f74800..04ecc0921fb 100644
> --- a/tests/qapi-schema/oob-test.err
> +++ b/tests/qapi-schema/oob-test.err
> @@ -1 +1 @@
> -tests/qapi-schema/oob-test.json:2: 'allow-oob' of command 'oob-command-1' should only use true value
> +tests/qapi-schema/oob-test.qapi:2: 'allow-oob' of command 'oob-command-1' should only use true value
> diff --git a/tests/qapi-schema/oob-test.json b/tests/qapi-schema/oob-test.qapi
> similarity index 100%
> rename from tests/qapi-schema/oob-test.json
> rename to tests/qapi-schema/oob-test.qapi
> diff --git a/tests/qapi-schema/pragma-doc-required-crap.err b/tests/qapi-schema/pragma-doc-required-crap.err
> index 39cd56cd483..08ed951aaf8 100644
> --- a/tests/qapi-schema/pragma-doc-required-crap.err
> +++ b/tests/qapi-schema/pragma-doc-required-crap.err
> @@ -1 +1 @@
> -tests/qapi-schema/pragma-doc-required-crap.json:3: Pragma 'doc-required' must be boolean
> +tests/qapi-schema/pragma-doc-required-crap.qapi:3: Pragma 'doc-required' must be boolean
> diff --git a/tests/qapi-schema/pragma-doc-required-crap.json b/tests/qapi-schema/pragma-doc-required-crap.qapi
> similarity index 100%
> rename from tests/qapi-schema/pragma-doc-required-crap.json
> rename to tests/qapi-schema/pragma-doc-required-crap.qapi
> diff --git a/tests/qapi-schema/pragma-extra-junk.err b/tests/qapi-schema/pragma-extra-junk.err
> index 4481688dbf0..20a8ddc06fa 100644
> --- a/tests/qapi-schema/pragma-extra-junk.err
> +++ b/tests/qapi-schema/pragma-extra-junk.err
> @@ -1 +1 @@
> -tests/qapi-schema/pragma-extra-junk.json:3: Invalid 'pragma' directive
> +tests/qapi-schema/pragma-extra-junk.qapi:3: Invalid 'pragma' directive
> diff --git a/tests/qapi-schema/pragma-extra-junk.json b/tests/qapi-schema/pragma-extra-junk.qapi
> similarity index 100%
> rename from tests/qapi-schema/pragma-extra-junk.json
> rename to tests/qapi-schema/pragma-extra-junk.qapi
> diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.err b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
> index f83b97e075a..6f377553683 100644
> --- a/tests/qapi-schema/pragma-name-case-whitelist-crap.err
> +++ b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
> @@ -1 +1 @@
> -tests/qapi-schema/pragma-name-case-whitelist-crap.json:3: Pragma name-case-whitelist must be a list of strings
> +tests/qapi-schema/pragma-name-case-whitelist-crap.qapi:3: Pragma name-case-whitelist must be a list of strings
> diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.json b/tests/qapi-schema/pragma-name-case-whitelist-crap.qapi
> similarity index 100%
> rename from tests/qapi-schema/pragma-name-case-whitelist-crap.json
> rename to tests/qapi-schema/pragma-name-case-whitelist-crap.qapi
> diff --git a/tests/qapi-schema/pragma-non-dict.err b/tests/qapi-schema/pragma-non-dict.err
> index 75bc335aea4..d8a31c2ecd1 100644
> --- a/tests/qapi-schema/pragma-non-dict.err
> +++ b/tests/qapi-schema/pragma-non-dict.err
> @@ -1 +1 @@
> -tests/qapi-schema/pragma-non-dict.json:3: Value of 'pragma' must be a dictionary
> +tests/qapi-schema/pragma-non-dict.qapi:3: Value of 'pragma' must be a dictionary
> diff --git a/tests/qapi-schema/pragma-non-dict.json b/tests/qapi-schema/pragma-non-dict.qapi
> similarity index 100%
> rename from tests/qapi-schema/pragma-non-dict.json
> rename to tests/qapi-schema/pragma-non-dict.qapi
> diff --git a/tests/qapi-schema/pragma-returns-whitelist-crap.err b/tests/qapi-schema/pragma-returns-whitelist-crap.err
> index 5d770216749..12926a6d949 100644
> --- a/tests/qapi-schema/pragma-returns-whitelist-crap.err
> +++ b/tests/qapi-schema/pragma-returns-whitelist-crap.err
> @@ -1 +1 @@
> -tests/qapi-schema/pragma-returns-whitelist-crap.json:3: Pragma returns-whitelist must be a list of strings
> +tests/qapi-schema/pragma-returns-whitelist-crap.qapi:3: Pragma returns-whitelist must be a list of strings
> diff --git a/tests/qapi-schema/pragma-returns-whitelist-crap.json b/tests/qapi-schema/pragma-returns-whitelist-crap.qapi
> similarity index 100%
> rename from tests/qapi-schema/pragma-returns-whitelist-crap.json
> rename to tests/qapi-schema/pragma-returns-whitelist-crap.qapi
> diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
> index 467577d770b..672bcda08a6 100644
> --- a/tests/qapi-schema/qapi-schema-test.out
> +++ b/tests/qapi-schema/qapi-schema-test.out
> @@ -1,7 +1,7 @@
>  object q_empty
>  enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
>      prefix QTYPE
> -module qapi-schema-test.json
> +module qapi-schema-test.qapi
>  object TestStruct
>      member integer: int optional=False
>      member boolean: bool optional=False
> diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.qapi
> similarity index 100%
> rename from tests/qapi-schema/qapi-schema-test.json
> rename to tests/qapi-schema/qapi-schema-test.qapi
> diff --git a/tests/qapi-schema/quoted-structural-chars.err b/tests/qapi-schema/quoted-structural-chars.err
> index 9b183841ddd..33c160b6eb9 100644
> --- a/tests/qapi-schema/quoted-structural-chars.err
> +++ b/tests/qapi-schema/quoted-structural-chars.err
> @@ -1 +1 @@
> -tests/qapi-schema/quoted-structural-chars.json:1:1: Expected "{"
> +tests/qapi-schema/quoted-structural-chars.qapi:1:1: Expected "{"
> diff --git a/tests/qapi-schema/quoted-structural-chars.json b/tests/qapi-schema/quoted-structural-chars.qapi
> similarity index 100%
> rename from tests/qapi-schema/quoted-structural-chars.json
> rename to tests/qapi-schema/quoted-structural-chars.qapi
> diff --git a/tests/qapi-schema/redefined-builtin.err b/tests/qapi-schema/redefined-builtin.err
> index b2757225c4e..45d5eb0b6bf 100644
> --- a/tests/qapi-schema/redefined-builtin.err
> +++ b/tests/qapi-schema/redefined-builtin.err
> @@ -1 +1 @@
> -tests/qapi-schema/redefined-builtin.json:2: built-in 'size' is already defined
> +tests/qapi-schema/redefined-builtin.qapi:2: built-in 'size' is already defined
> diff --git a/tests/qapi-schema/redefined-builtin.json b/tests/qapi-schema/redefined-builtin.qapi
> similarity index 100%
> rename from tests/qapi-schema/redefined-builtin.json
> rename to tests/qapi-schema/redefined-builtin.qapi
> diff --git a/tests/qapi-schema/redefined-command.err b/tests/qapi-schema/redefined-command.err
> index 82ae256e639..e18fa60ee27 100644
> --- a/tests/qapi-schema/redefined-command.err
> +++ b/tests/qapi-schema/redefined-command.err
> @@ -1 +1 @@
> -tests/qapi-schema/redefined-command.json:3: command 'foo' is already defined
> +tests/qapi-schema/redefined-command.qapi:3: command 'foo' is already defined
> diff --git a/tests/qapi-schema/redefined-command.json b/tests/qapi-schema/redefined-command.qapi
> similarity index 100%
> rename from tests/qapi-schema/redefined-command.json
> rename to tests/qapi-schema/redefined-command.qapi
> diff --git a/tests/qapi-schema/redefined-event.err b/tests/qapi-schema/redefined-event.err
> index 35429cb4818..843cb650d91 100644
> --- a/tests/qapi-schema/redefined-event.err
> +++ b/tests/qapi-schema/redefined-event.err
> @@ -1 +1 @@
> -tests/qapi-schema/redefined-event.json:3: event 'EVENT_A' is already defined
> +tests/qapi-schema/redefined-event.qapi:3: event 'EVENT_A' is already defined
> diff --git a/tests/qapi-schema/redefined-event.json b/tests/qapi-schema/redefined-event.qapi
> similarity index 100%
> rename from tests/qapi-schema/redefined-event.json
> rename to tests/qapi-schema/redefined-event.qapi
> diff --git a/tests/qapi-schema/redefined-type.err b/tests/qapi-schema/redefined-type.err
> index 06ea78c4781..67d273c1221 100644
> --- a/tests/qapi-schema/redefined-type.err
> +++ b/tests/qapi-schema/redefined-type.err
> @@ -1 +1 @@
> -tests/qapi-schema/redefined-type.json:3: struct 'foo' is already defined
> +tests/qapi-schema/redefined-type.qapi:3: struct 'foo' is already defined
> diff --git a/tests/qapi-schema/redefined-type.json b/tests/qapi-schema/redefined-type.qapi
> similarity index 100%
> rename from tests/qapi-schema/redefined-type.json
> rename to tests/qapi-schema/redefined-type.qapi
> diff --git a/tests/qapi-schema/reserved-command-q.err b/tests/qapi-schema/reserved-command-q.err
> index f939e044eba..91dd7ed8f08 100644
> --- a/tests/qapi-schema/reserved-command-q.err
> +++ b/tests/qapi-schema/reserved-command-q.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-command-q.json:5: 'command' uses invalid name 'q-unix'
> +tests/qapi-schema/reserved-command-q.qapi:5: 'command' uses invalid name 'q-unix'
> diff --git a/tests/qapi-schema/reserved-command-q.json b/tests/qapi-schema/reserved-command-q.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-command-q.json
> rename to tests/qapi-schema/reserved-command-q.qapi
> diff --git a/tests/qapi-schema/reserved-enum-q.err b/tests/qapi-schema/reserved-enum-q.err
> index e1c3480ee22..034c9bd6cfe 100644
> --- a/tests/qapi-schema/reserved-enum-q.err
> +++ b/tests/qapi-schema/reserved-enum-q.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-enum-q.json:4: Member of enum 'Foo' uses invalid name 'q-Unix'
> +tests/qapi-schema/reserved-enum-q.qapi:4: Member of enum 'Foo' uses invalid name 'q-Unix'
> diff --git a/tests/qapi-schema/reserved-enum-q.json b/tests/qapi-schema/reserved-enum-q.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-enum-q.json
> rename to tests/qapi-schema/reserved-enum-q.qapi
> diff --git a/tests/qapi-schema/reserved-member-has.err b/tests/qapi-schema/reserved-member-has.err
> index e7557714461..33630aa5689 100644
> --- a/tests/qapi-schema/reserved-member-has.err
> +++ b/tests/qapi-schema/reserved-member-has.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-member-has.json:5: Member of 'data' for command 'oops' uses reserved name 'has-a'
> +tests/qapi-schema/reserved-member-has.qapi:5: Member of 'data' for command 'oops' uses reserved name 'has-a'
> diff --git a/tests/qapi-schema/reserved-member-has.json b/tests/qapi-schema/reserved-member-has.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-member-has.json
> rename to tests/qapi-schema/reserved-member-has.qapi
> diff --git a/tests/qapi-schema/reserved-member-q.err b/tests/qapi-schema/reserved-member-q.err
> index f3d5dd78187..6ccd4f0c70f 100644
> --- a/tests/qapi-schema/reserved-member-q.err
> +++ b/tests/qapi-schema/reserved-member-q.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-member-q.json:4: Member of 'data' for struct 'Foo' uses invalid name 'q-unix'
> +tests/qapi-schema/reserved-member-q.qapi:4: Member of 'data' for struct 'Foo' uses invalid name 'q-unix'
> diff --git a/tests/qapi-schema/reserved-member-q.json b/tests/qapi-schema/reserved-member-q.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-member-q.json
> rename to tests/qapi-schema/reserved-member-q.qapi
> diff --git a/tests/qapi-schema/reserved-member-u.err b/tests/qapi-schema/reserved-member-u.err
> index 87d42296cc1..2587d3a1548 100644
> --- a/tests/qapi-schema/reserved-member-u.err
> +++ b/tests/qapi-schema/reserved-member-u.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-member-u.json:7: Member of 'data' for struct 'Oops' uses reserved name 'u'
> +tests/qapi-schema/reserved-member-u.qapi:7: Member of 'data' for struct 'Oops' uses reserved name 'u'
> diff --git a/tests/qapi-schema/reserved-member-u.json b/tests/qapi-schema/reserved-member-u.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-member-u.json
> rename to tests/qapi-schema/reserved-member-u.qapi
> diff --git a/tests/qapi-schema/reserved-member-underscore.err b/tests/qapi-schema/reserved-member-underscore.err
> index 65ff0da8ce9..6080f0d6baf 100644
> --- a/tests/qapi-schema/reserved-member-underscore.err
> +++ b/tests/qapi-schema/reserved-member-underscore.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-member-underscore.json:4: Member of 'data' for struct 'Oops' uses invalid name '_oops'
> +tests/qapi-schema/reserved-member-underscore.qapi:4: Member of 'data' for struct 'Oops' uses invalid name '_oops'
> diff --git a/tests/qapi-schema/reserved-member-underscore.json b/tests/qapi-schema/reserved-member-underscore.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-member-underscore.json
> rename to tests/qapi-schema/reserved-member-underscore.qapi
> diff --git a/tests/qapi-schema/reserved-type-kind.err b/tests/qapi-schema/reserved-type-kind.err
> index 0a38efaad8d..0d2b05f3100 100644
> --- a/tests/qapi-schema/reserved-type-kind.err
> +++ b/tests/qapi-schema/reserved-type-kind.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-type-kind.json:2: enum 'UnionKind' should not end in 'Kind'
> +tests/qapi-schema/reserved-type-kind.qapi:2: enum 'UnionKind' should not end in 'Kind'
> diff --git a/tests/qapi-schema/reserved-type-kind.json b/tests/qapi-schema/reserved-type-kind.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-type-kind.json
> rename to tests/qapi-schema/reserved-type-kind.qapi
> diff --git a/tests/qapi-schema/reserved-type-list.err b/tests/qapi-schema/reserved-type-list.err
> index 4510fa6d903..0ee5c659be6 100644
> --- a/tests/qapi-schema/reserved-type-list.err
> +++ b/tests/qapi-schema/reserved-type-list.err
> @@ -1 +1 @@
> -tests/qapi-schema/reserved-type-list.json:5: struct 'FooList' should not end in 'List'
> +tests/qapi-schema/reserved-type-list.qapi:5: struct 'FooList' should not end in 'List'
> diff --git a/tests/qapi-schema/reserved-type-list.json b/tests/qapi-schema/reserved-type-list.qapi
> similarity index 100%
> rename from tests/qapi-schema/reserved-type-list.json
> rename to tests/qapi-schema/reserved-type-list.qapi
> diff --git a/tests/qapi-schema/returns-alternate.err b/tests/qapi-schema/returns-alternate.err
> index dfbb419cac2..a79c0805984 100644
> --- a/tests/qapi-schema/returns-alternate.err
> +++ b/tests/qapi-schema/returns-alternate.err
> @@ -1 +1 @@
> -tests/qapi-schema/returns-alternate.json:3: 'returns' for command 'oops' cannot use alternate type 'Alt'
> +tests/qapi-schema/returns-alternate.qapi:3: 'returns' for command 'oops' cannot use alternate type 'Alt'
> diff --git a/tests/qapi-schema/returns-alternate.json b/tests/qapi-schema/returns-alternate.qapi
> similarity index 100%
> rename from tests/qapi-schema/returns-alternate.json
> rename to tests/qapi-schema/returns-alternate.qapi
> diff --git a/tests/qapi-schema/returns-array-bad.err b/tests/qapi-schema/returns-array-bad.err
> index 138095ccde1..54981ce3846 100644
> --- a/tests/qapi-schema/returns-array-bad.err
> +++ b/tests/qapi-schema/returns-array-bad.err
> @@ -1 +1 @@
> -tests/qapi-schema/returns-array-bad.json:2: 'returns' for command 'oops': array type must contain single type name
> +tests/qapi-schema/returns-array-bad.qapi:2: 'returns' for command 'oops': array type must contain single type name
> diff --git a/tests/qapi-schema/returns-array-bad.json b/tests/qapi-schema/returns-array-bad.qapi
> similarity index 100%
> rename from tests/qapi-schema/returns-array-bad.json
> rename to tests/qapi-schema/returns-array-bad.qapi
> diff --git a/tests/qapi-schema/returns-dict.err b/tests/qapi-schema/returns-dict.err
> index eb2d0c46615..b153bdc74c2 100644
> --- a/tests/qapi-schema/returns-dict.err
> +++ b/tests/qapi-schema/returns-dict.err
> @@ -1 +1 @@
> -tests/qapi-schema/returns-dict.json:2: 'returns' for command 'oops' should be a type name
> +tests/qapi-schema/returns-dict.qapi:2: 'returns' for command 'oops' should be a type name
> diff --git a/tests/qapi-schema/returns-dict.json b/tests/qapi-schema/returns-dict.qapi
> similarity index 100%
> rename from tests/qapi-schema/returns-dict.json
> rename to tests/qapi-schema/returns-dict.qapi
> diff --git a/tests/qapi-schema/returns-unknown.err b/tests/qapi-schema/returns-unknown.err
> index 1f43e3ac9f6..26b9af8344c 100644
> --- a/tests/qapi-schema/returns-unknown.err
> +++ b/tests/qapi-schema/returns-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/returns-unknown.json:2: 'returns' for command 'oops' uses unknown type 'NoSuchType'
> +tests/qapi-schema/returns-unknown.qapi:2: 'returns' for command 'oops' uses unknown type 'NoSuchType'
> diff --git a/tests/qapi-schema/returns-unknown.json b/tests/qapi-schema/returns-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/returns-unknown.json
> rename to tests/qapi-schema/returns-unknown.qapi
> diff --git a/tests/qapi-schema/returns-whitelist.err b/tests/qapi-schema/returns-whitelist.err
> index b2ba7a9deba..710fbb2f6f6 100644
> --- a/tests/qapi-schema/returns-whitelist.err
> +++ b/tests/qapi-schema/returns-whitelist.err
> @@ -1 +1 @@
> -tests/qapi-schema/returns-whitelist.json:14: 'returns' for command 'no-way-this-will-get-whitelisted' cannot use built-in type 'int'
> +tests/qapi-schema/returns-whitelist.qapi:14: 'returns' for command 'no-way-this-will-get-whitelisted' cannot use built-in type 'int'
> diff --git a/tests/qapi-schema/returns-whitelist.json b/tests/qapi-schema/returns-whitelist.qapi
> similarity index 100%
> rename from tests/qapi-schema/returns-whitelist.json
> rename to tests/qapi-schema/returns-whitelist.qapi
> diff --git a/tests/qapi-schema/struct-base-clash-deep.err b/tests/qapi-schema/struct-base-clash-deep.err
> index e2d7943f217..c6d7ef0a536 100644
> --- a/tests/qapi-schema/struct-base-clash-deep.err
> +++ b/tests/qapi-schema/struct-base-clash-deep.err
> @@ -1 +1 @@
> -tests/qapi-schema/struct-base-clash-deep.json:10: 'name' (member of Sub) collides with 'name' (member of Base)
> +tests/qapi-schema/struct-base-clash-deep.qapi:10: 'name' (member of Sub) collides with 'name' (member of Base)
> diff --git a/tests/qapi-schema/struct-base-clash-deep.json b/tests/qapi-schema/struct-base-clash-deep.qapi
> similarity index 100%
> rename from tests/qapi-schema/struct-base-clash-deep.json
> rename to tests/qapi-schema/struct-base-clash-deep.qapi
> diff --git a/tests/qapi-schema/struct-base-clash.err b/tests/qapi-schema/struct-base-clash.err
> index c52f33d27bf..de89c0e0b93 100644
> --- a/tests/qapi-schema/struct-base-clash.err
> +++ b/tests/qapi-schema/struct-base-clash.err
> @@ -1 +1 @@
> -tests/qapi-schema/struct-base-clash.json:5: 'name' (member of Sub) collides with 'name' (member of Base)
> +tests/qapi-schema/struct-base-clash.qapi:5: 'name' (member of Sub) collides with 'name' (member of Base)
> diff --git a/tests/qapi-schema/struct-base-clash.json b/tests/qapi-schema/struct-base-clash.qapi
> similarity index 100%
> rename from tests/qapi-schema/struct-base-clash.json
> rename to tests/qapi-schema/struct-base-clash.qapi
> diff --git a/tests/qapi-schema/struct-data-invalid.err b/tests/qapi-schema/struct-data-invalid.err
> index 6644f4c2ad2..84fc1404fa7 100644
> --- a/tests/qapi-schema/struct-data-invalid.err
> +++ b/tests/qapi-schema/struct-data-invalid.err
> @@ -1 +1 @@
> -tests/qapi-schema/struct-data-invalid.json:1: 'data' for struct 'foo' should be a dictionary or type name
> +tests/qapi-schema/struct-data-invalid.qapi:1: 'data' for struct 'foo' should be a dictionary or type name
> diff --git a/tests/qapi-schema/struct-data-invalid.json b/tests/qapi-schema/struct-data-invalid.qapi
> similarity index 100%
> rename from tests/qapi-schema/struct-data-invalid.json
> rename to tests/qapi-schema/struct-data-invalid.qapi
> diff --git a/tests/qapi-schema/struct-member-invalid.err b/tests/qapi-schema/struct-member-invalid.err
> index 69a326d450e..c94c8c6d712 100644
> --- a/tests/qapi-schema/struct-member-invalid.err
> +++ b/tests/qapi-schema/struct-member-invalid.err
> @@ -1 +1 @@
> -tests/qapi-schema/struct-member-invalid.json:1: Member 'a' of 'data' for struct 'foo' should be a type name
> +tests/qapi-schema/struct-member-invalid.qapi:1: Member 'a' of 'data' for struct 'foo' should be a type name
> diff --git a/tests/qapi-schema/struct-member-invalid.json b/tests/qapi-schema/struct-member-invalid.qapi
> similarity index 100%
> rename from tests/qapi-schema/struct-member-invalid.json
> rename to tests/qapi-schema/struct-member-invalid.qapi
> diff --git a/tests/qapi-schema/trailing-comma-list.err b/tests/qapi-schema/trailing-comma-list.err
> index 212e14ae28e..c786b67d2ff 100644
> --- a/tests/qapi-schema/trailing-comma-list.err
> +++ b/tests/qapi-schema/trailing-comma-list.err
> @@ -1 +1 @@
> -tests/qapi-schema/trailing-comma-list.json:2:36: Expected "{", "[", string, boolean or "null"
> +tests/qapi-schema/trailing-comma-list.qapi:2:36: Expected "{", "[", string, boolean or "null"
> diff --git a/tests/qapi-schema/trailing-comma-list.json b/tests/qapi-schema/trailing-comma-list.qapi
> similarity index 100%
> rename from tests/qapi-schema/trailing-comma-list.json
> rename to tests/qapi-schema/trailing-comma-list.qapi
> diff --git a/tests/qapi-schema/trailing-comma-object.err b/tests/qapi-schema/trailing-comma-object.err
> index 30bce5e1945..aff13d63986 100644
> --- a/tests/qapi-schema/trailing-comma-object.err
> +++ b/tests/qapi-schema/trailing-comma-object.err
> @@ -1 +1 @@
> -tests/qapi-schema/trailing-comma-object.json:2:38: Expected string
> +tests/qapi-schema/trailing-comma-object.qapi:2:38: Expected string
> diff --git a/tests/qapi-schema/trailing-comma-object.json b/tests/qapi-schema/trailing-comma-object.qapi
> similarity index 100%
> rename from tests/qapi-schema/trailing-comma-object.json
> rename to tests/qapi-schema/trailing-comma-object.qapi
> diff --git a/tests/qapi-schema/type-bypass-bad-gen.err b/tests/qapi-schema/type-bypass-bad-gen.err
> index a83c3c655de..e617f425b94 100644
> --- a/tests/qapi-schema/type-bypass-bad-gen.err
> +++ b/tests/qapi-schema/type-bypass-bad-gen.err
> @@ -1 +1 @@
> -tests/qapi-schema/type-bypass-bad-gen.json:2: 'gen' of command 'foo' should only use false value
> +tests/qapi-schema/type-bypass-bad-gen.qapi:2: 'gen' of command 'foo' should only use false value
> diff --git a/tests/qapi-schema/type-bypass-bad-gen.json b/tests/qapi-schema/type-bypass-bad-gen.qapi
> similarity index 100%
> rename from tests/qapi-schema/type-bypass-bad-gen.json
> rename to tests/qapi-schema/type-bypass-bad-gen.qapi
> diff --git a/tests/qapi-schema/unclosed-list.err b/tests/qapi-schema/unclosed-list.err
> index fb41a86abd0..3e9bd74f833 100644
> --- a/tests/qapi-schema/unclosed-list.err
> +++ b/tests/qapi-schema/unclosed-list.err
> @@ -1 +1 @@
> -tests/qapi-schema/unclosed-list.json:1:20: Expected "," or "]"
> +tests/qapi-schema/unclosed-list.qapi:1:20: Expected "," or "]"
> diff --git a/tests/qapi-schema/unclosed-list.json b/tests/qapi-schema/unclosed-list.qapi
> similarity index 100%
> rename from tests/qapi-schema/unclosed-list.json
> rename to tests/qapi-schema/unclosed-list.qapi
> diff --git a/tests/qapi-schema/unclosed-object.err b/tests/qapi-schema/unclosed-object.err
> index db3deedd63d..42b5ba1abb6 100644
> --- a/tests/qapi-schema/unclosed-object.err
> +++ b/tests/qapi-schema/unclosed-object.err
> @@ -1 +1 @@
> -tests/qapi-schema/unclosed-object.json:1:21: Expected "," or "}"
> +tests/qapi-schema/unclosed-object.qapi:1:21: Expected "," or "}"
> diff --git a/tests/qapi-schema/unclosed-object.json b/tests/qapi-schema/unclosed-object.qapi
> similarity index 100%
> rename from tests/qapi-schema/unclosed-object.json
> rename to tests/qapi-schema/unclosed-object.qapi
> diff --git a/tests/qapi-schema/unclosed-string.err b/tests/qapi-schema/unclosed-string.err
> index 12b187074e7..fbe5385d6e2 100644
> --- a/tests/qapi-schema/unclosed-string.err
> +++ b/tests/qapi-schema/unclosed-string.err
> @@ -1 +1 @@
> -tests/qapi-schema/unclosed-string.json:1:11: Missing terminating "'"
> +tests/qapi-schema/unclosed-string.qapi:1:11: Missing terminating "'"
> diff --git a/tests/qapi-schema/unclosed-string.json b/tests/qapi-schema/unclosed-string.qapi
> similarity index 100%
> rename from tests/qapi-schema/unclosed-string.json
> rename to tests/qapi-schema/unclosed-string.qapi
> diff --git a/tests/qapi-schema/unicode-str.err b/tests/qapi-schema/unicode-str.err
> index f621cd6448b..9301f12bd0d 100644
> --- a/tests/qapi-schema/unicode-str.err
> +++ b/tests/qapi-schema/unicode-str.err
> @@ -1 +1 @@
> -tests/qapi-schema/unicode-str.json:2: 'command' uses invalid name 'é'
> +tests/qapi-schema/unicode-str.qapi:2: 'command' uses invalid name 'é'
> diff --git a/tests/qapi-schema/unicode-str.json b/tests/qapi-schema/unicode-str.qapi
> similarity index 100%
> rename from tests/qapi-schema/unicode-str.json
> rename to tests/qapi-schema/unicode-str.qapi
> diff --git a/tests/qapi-schema/union-base-empty.err b/tests/qapi-schema/union-base-empty.err
> index 7695806d81a..47dd3d6ac3b 100644
> --- a/tests/qapi-schema/union-base-empty.err
> +++ b/tests/qapi-schema/union-base-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-base-empty.json:5: Discriminator 'type' is not a member of base struct 'Empty'
> +tests/qapi-schema/union-base-empty.qapi:5: Discriminator 'type' is not a member of base struct 'Empty'
> diff --git a/tests/qapi-schema/union-base-empty.json b/tests/qapi-schema/union-base-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-base-empty.json
> rename to tests/qapi-schema/union-base-empty.qapi
> diff --git a/tests/qapi-schema/union-base-no-discriminator.err b/tests/qapi-schema/union-base-no-discriminator.err
> index 8b7a24260ff..e632a4d2649 100644
> --- a/tests/qapi-schema/union-base-no-discriminator.err
> +++ b/tests/qapi-schema/union-base-no-discriminator.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-base-no-discriminator.json:11: Simple union 'TestUnion' must not have a base
> +tests/qapi-schema/union-base-no-discriminator.qapi:11: Simple union 'TestUnion' must not have a base
> diff --git a/tests/qapi-schema/union-base-no-discriminator.json b/tests/qapi-schema/union-base-no-discriminator.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-base-no-discriminator.json
> rename to tests/qapi-schema/union-base-no-discriminator.qapi
> diff --git a/tests/qapi-schema/union-branch-case.err b/tests/qapi-schema/union-branch-case.err
> index 11521901d88..8383a3394fa 100644
> --- a/tests/qapi-schema/union-branch-case.err
> +++ b/tests/qapi-schema/union-branch-case.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-branch-case.json:2: 'Branch' (branch of NoWayThisWillGetWhitelisted) should not use uppercase
> +tests/qapi-schema/union-branch-case.qapi:2: 'Branch' (branch of NoWayThisWillGetWhitelisted) should not use uppercase
> diff --git a/tests/qapi-schema/union-branch-case.json b/tests/qapi-schema/union-branch-case.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-branch-case.json
> rename to tests/qapi-schema/union-branch-case.qapi
> diff --git a/tests/qapi-schema/union-clash-branches.err b/tests/qapi-schema/union-clash-branches.err
> index e5b21135bb8..ee74c202af5 100644
> --- a/tests/qapi-schema/union-clash-branches.err
> +++ b/tests/qapi-schema/union-clash-branches.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-clash-branches.json:4: 'a_b' (branch of TestUnion) collides with 'a-b' (branch of TestUnion)
> +tests/qapi-schema/union-clash-branches.qapi:4: 'a_b' (branch of TestUnion) collides with 'a-b' (branch of TestUnion)
> diff --git a/tests/qapi-schema/union-clash-branches.json b/tests/qapi-schema/union-clash-branches.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-clash-branches.json
> rename to tests/qapi-schema/union-clash-branches.qapi
> diff --git a/tests/qapi-schema/union-empty.err b/tests/qapi-schema/union-empty.err
> index 12c20221bdf..da45ccaf497 100644
> --- a/tests/qapi-schema/union-empty.err
> +++ b/tests/qapi-schema/union-empty.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-empty.json:2: Union 'Union' cannot have empty 'data'
> +tests/qapi-schema/union-empty.qapi:2: Union 'Union' cannot have empty 'data'
> diff --git a/tests/qapi-schema/union-empty.json b/tests/qapi-schema/union-empty.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-empty.json
> rename to tests/qapi-schema/union-empty.qapi
> diff --git a/tests/qapi-schema/union-invalid-base.err b/tests/qapi-schema/union-invalid-base.err
> index 03d7b97a93b..7176a08136e 100644
> --- a/tests/qapi-schema/union-invalid-base.err
> +++ b/tests/qapi-schema/union-invalid-base.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-invalid-base.json:8: 'base' for union 'TestUnion' cannot use built-in type 'int'
> +tests/qapi-schema/union-invalid-base.qapi:8: 'base' for union 'TestUnion' cannot use built-in type 'int'
> diff --git a/tests/qapi-schema/union-invalid-base.json b/tests/qapi-schema/union-invalid-base.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-invalid-base.json
> rename to tests/qapi-schema/union-invalid-base.qapi
> diff --git a/tests/qapi-schema/union-optional-branch.err b/tests/qapi-schema/union-optional-branch.err
> index 3ada1334dc6..1dcb5835cc2 100644
> --- a/tests/qapi-schema/union-optional-branch.err
> +++ b/tests/qapi-schema/union-optional-branch.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-optional-branch.json:2: Member of union 'Union' does not allow optional name '*a'
> +tests/qapi-schema/union-optional-branch.qapi:2: Member of union 'Union' does not allow optional name '*a'
> diff --git a/tests/qapi-schema/union-optional-branch.json b/tests/qapi-schema/union-optional-branch.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-optional-branch.json
> rename to tests/qapi-schema/union-optional-branch.qapi
> diff --git a/tests/qapi-schema/union-unknown.err b/tests/qapi-schema/union-unknown.err
> index 54fe456f9cd..dab37db8b8f 100644
> --- a/tests/qapi-schema/union-unknown.err
> +++ b/tests/qapi-schema/union-unknown.err
> @@ -1 +1 @@
> -tests/qapi-schema/union-unknown.json:2: Member 'unknown' of union 'Union' uses unknown type 'MissingType'
> +tests/qapi-schema/union-unknown.qapi:2: Member 'unknown' of union 'Union' uses unknown type 'MissingType'
> diff --git a/tests/qapi-schema/union-unknown.json b/tests/qapi-schema/union-unknown.qapi
> similarity index 100%
> rename from tests/qapi-schema/union-unknown.json
> rename to tests/qapi-schema/union-unknown.qapi
> diff --git a/tests/qapi-schema/unknown-escape.err b/tests/qapi-schema/unknown-escape.err
> index 000e30ddf33..ad58d0eae97 100644
> --- a/tests/qapi-schema/unknown-escape.err
> +++ b/tests/qapi-schema/unknown-escape.err
> @@ -1 +1 @@
> -tests/qapi-schema/unknown-escape.json:3:21: Unknown escape \x
> +tests/qapi-schema/unknown-escape.qapi:3:21: Unknown escape \x
> diff --git a/tests/qapi-schema/unknown-escape.json b/tests/qapi-schema/unknown-escape.qapi
> similarity index 100%
> rename from tests/qapi-schema/unknown-escape.json
> rename to tests/qapi-schema/unknown-escape.qapi
> diff --git a/tests/qapi-schema/unknown-expr-key.err b/tests/qapi-schema/unknown-expr-key.err
> index 12f5ed5b435..5b8dee56fa0 100644
> --- a/tests/qapi-schema/unknown-expr-key.err
> +++ b/tests/qapi-schema/unknown-expr-key.err
> @@ -1 +1 @@
> -tests/qapi-schema/unknown-expr-key.json:2: Unknown key 'bogus' in struct 'bar'
> +tests/qapi-schema/unknown-expr-key.qapi:2: Unknown key 'bogus' in struct 'bar'
> diff --git a/tests/qapi-schema/unknown-expr-key.json b/tests/qapi-schema/unknown-expr-key.qapi
> similarity index 100%
> rename from tests/qapi-schema/unknown-expr-key.json
> rename to tests/qapi-schema/unknown-expr-key.qapi
> -- 
> 2.14.3
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Eric Blake April 20, 2018, 1:16 p.m. UTC | #4
On 04/20/2018 04:27 AM, Dr. David Alan Gilbert wrote:
> * Markus Armbruster (armbru@redhat.com) wrote:
>> Eric Blake <eblake@redhat.com> writes:
>>
>>> Our QAPI input files aren't quite true JSON (comments being one obvious
>>> difference); naming things .json doesn't make that obvious.  Use a new
>>> suffix .qapi that makes it easy to identify our files.
>>
>> I agree that .json is sub-optimal.  Evidence: we add Emacs file
>> variables to get Python mode, because that's less wrong than JavaScript
>> mode.  Except for "trivial" files, where we can't be bothered.
>>
>> The rename lessens the human confusion, but increases the Editor
>> confusion somewhat: we get Fundamental mode for "trivial" files, which
>> is more wrong than JavaScript mode.
>>
>> One way to avoid that would be adding file variables to all files.
> 
> That depends on your editor;  this rename makes life **much** better
> in vim;   with them as .json files they display with white text on
> bright red background (I guess because it's upset by syntax somewhere)
> but as .qapi files it's readable (I'm not entirely sure which syntax
> it's using)

It's also possible to document that emacs users can add to their .emacs
file:

(add-to-list 'auto-mode-alist '("\\.qapi\\'" . python-mode))

to automatically treat all .qapi files with sane highlighting.  Sadly,
.dir-locals.el cannot do this without warning the users about an unsafe
'eval' variable, so users that don't do their own manual setup are stuck
with fundamental mode on trivial files.
diff mbox series

Patch

diff --git a/docs/devel/blkdebug.txt b/docs/devel/blkdebug.txt
index 43d8e8f9c63..33b56daad1b 100644
--- a/docs/devel/blkdebug.txt
+++ b/docs/devel/blkdebug.txt
@@ -92,7 +92,7 @@  The core events are:

   flush_to_disk - flush the host block device's disk cache

-See qapi/block-core.json:BlkdebugEvent for the full list of events.
+See qapi/block-core.qapi:BlkdebugEvent for the full list of events.
 You may need to grep block driver source code to understand the
 meaning of specific events.

diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
index a569d247455..4a5af251269 100644
--- a/docs/devel/qapi-code-gen.txt
+++ b/docs/devel/qapi-code-gen.txt
@@ -293,7 +293,7 @@  Usage: { 'include': STRING }

 The QAPI schema definitions can be modularized using the 'include' directive:

- { 'include': 'path/to/file.json' }
+ { 'include': 'path/to/file.qapi' }

 The directive is evaluated recursively, and include paths are relative to the
 file using the directive. Multiple includes of the same file are
@@ -961,7 +961,7 @@  list of that type as a parameter, and returns a single element of that
 type.  The user is responsible for writing the implementation of
 qmp_my_command(); everything else is produced by the generator.

-    $ cat example-schema.json
+    $ cat example-schema.qapi
     { 'struct': 'UserDefOne',
       'data': { 'integer': 'int', '*string': 'str' } }

@@ -977,7 +977,7 @@  We run qapi-gen.py like this:
     --prefix="example-" example-schema.json

 For a more thorough look at generated code, the testsuite includes
-tests/qapi-schema/qapi-schema-tests.json that covers more examples of
+tests/qapi-schema/qapi-schema-tests.qapi that covers more examples of
 what the generator will accept, and compiles the resulting C code as
 part of 'make check-unit'.

diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst
index 0ca1a2d4b58..b7a1211591c 100644
--- a/docs/devel/testing.rst
+++ b/docs/devel/testing.rst
@@ -132,7 +132,7 @@  output.
 The input/output data is managed under the ``tests/qapi-schema`` directory.
 Each test case includes four files that have a common base name:

-  * ``${casename}.json`` - the file contains the JSON input for feeding the
+  * ``${casename}.qapi`` - the file contains the JSON input for feeding the
     parser
   * ``${casename}.out`` - the file contains the expected stdout from the parser
   * ``${casename}.err`` - the file contains the expected stderr from the parser
@@ -147,7 +147,7 @@  parser (either fixing a bug or extending/modifying the syntax). To do this:

 2. Add the new test in ``tests/Makefile.include``. For example:

-  ``qapi-schema += foo.json``
+  ``qapi-schema += foo.qapi``

 check-block
 -----------
diff --git a/docs/devel/writing-qmp-commands.txt b/docs/devel/writing-qmp-commands.txt
index 1cd3dbf48ac..056b9fa081f 100644
--- a/docs/devel/writing-qmp-commands.txt
+++ b/docs/devel/writing-qmp-commands.txt
@@ -89,7 +89,7 @@  Our command will be called "hello-world". It takes no arguments, nor does it
 return any data.

 The first step is defining the command in the appropriate QAPI schema
-module.  We pick module qapi/misc.json, and add the following line at
+module.  We pick module qapi/misc.qapi, and add the following line at
 the bottom:

 { 'command': 'hello-world' }
@@ -239,7 +239,7 @@  There's only one step missing to make "hello-world"'s implementation complete,
 and that's its documentation in the schema file.

 There are many examples of such documentation in the schema file already, but
-here goes "hello-world"'s new entry for qapi/misc.json:
+here goes "hello-world"'s new entry for qapi/misc.qapi:

 ##
 # @hello-world
diff --git a/docs/interop/live-block-operations.rst b/docs/interop/live-block-operations.rst
index 734252bc804..f2967ad9514 100644
--- a/docs/interop/live-block-operations.rst
+++ b/docs/interop/live-block-operations.rst
@@ -20,7 +20,7 @@  primitives, and some (non-exhaustive list of) examples to illustrate
 their use.

 .. note::
-    The file ``qapi/block-core.json`` in the QEMU source tree has the
+    The file ``qapi/block-core.qapi`` in the QEMU source tree has the
     canonical QEMU API (QAPI) schema documentation for the QMP
     primitives discussed here.

@@ -54,7 +54,7 @@  files in a disk image backing chain:
 (1) Directional: 'base' and 'top'.  Given the simple disk image chain
     above, image [A] can be referred to as 'base', and image [B] as
     'top'.  (This terminology can be seen in in QAPI schema file,
-    block-core.json.)
+    block-core.qapi.)

 (2) Relational: 'backing file' and 'overlay'.  Again, taking the same
     simple disk image chain from the above, disk image [A] is referred
diff --git a/docs/interop/qmp-intro.txt b/docs/interop/qmp-intro.txt
index 19ac6c573b6..705ee520073 100644
--- a/docs/interop/qmp-intro.txt
+++ b/docs/interop/qmp-intro.txt
@@ -79,7 +79,7 @@  Escape character is '^]'.
 }

 Please refer to docs/interop/qemu-qmp-ref.* for a complete command
-reference, generated from qapi/qmp-schema.json.
+reference, generated from qapi/qmp-schema.qapi.

 QMP wiki page
 -------------
diff --git a/Makefile b/Makefile
index f5c2ace8b30..428ac423fba 100644
--- a/Makefile
+++ b/Makefile
@@ -571,27 +571,27 @@  qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h \
 qga/qapi-generated/qga-qapi-commands.h qga/qapi-generated/qga-qapi-commands.c \
 qga/qapi-generated/qga-qapi-doc.texi: \
 qga/qapi-generated/qga-gen-timestamp ;
-qga/qapi-generated/qga-gen-timestamp: $(SRC_PATH)/qapi/qga-schema.json $(qapi-py)
+qga/qapi-generated/qga-gen-timestamp: $(SRC_PATH)/qapi/qga-schema.qapi $(qapi-py)
 	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
 		-o qga/qapi-generated -p "qga-" $<, \
 		"GEN","$(@:%-timestamp=%)")
 	@>$@

-qmp-modules = $(SRC_PATH)/qapi/qmp-schema.json $(SRC_PATH)/qapi/common.json \
-               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
-               $(SRC_PATH)/qapi/char.json \
-               $(SRC_PATH)/qapi/crypto.json \
-               $(SRC_PATH)/qapi/introspect.json \
-               $(SRC_PATH)/qapi/migration.json \
-               $(SRC_PATH)/qapi/misc.json \
-               $(SRC_PATH)/qapi/net.json \
-               $(SRC_PATH)/qapi/rocker.json \
-               $(SRC_PATH)/qapi/run-state.json \
-               $(SRC_PATH)/qapi/sockets.json \
-               $(SRC_PATH)/qapi/tpm.json \
-               $(SRC_PATH)/qapi/trace.json \
-               $(SRC_PATH)/qapi/transaction.json \
-               $(SRC_PATH)/qapi/ui.json
+qmp-modules = $(SRC_PATH)/qapi/qmp-schema.qapi $(SRC_PATH)/qapi/common.qapi \
+               $(SRC_PATH)/qapi/block.qapi $(SRC_PATH)/qapi/block-core.qapi \
+               $(SRC_PATH)/qapi/char.qapi \
+               $(SRC_PATH)/qapi/crypto.qapi \
+               $(SRC_PATH)/qapi/introspect.qapi \
+               $(SRC_PATH)/qapi/migration.qapi \
+               $(SRC_PATH)/qapi/misc.qapi \
+               $(SRC_PATH)/qapi/net.qapi \
+               $(SRC_PATH)/qapi/rocker.qapi \
+               $(SRC_PATH)/qapi/run-state.qapi \
+               $(SRC_PATH)/qapi/sockets.qapi \
+               $(SRC_PATH)/qapi/tpm.qapi \
+               $(SRC_PATH)/qapi/trace.qapi \
+               $(SRC_PATH)/qapi/transaction.qapi \
+               $(SRC_PATH)/qapi/ui.qapi

 qapi/qapi-builtin-types.c qapi/qapi-builtin-types.h \
 qapi/qapi-types.c qapi/qapi-types.h \
diff --git a/qapi/block-core.json b/qapi/block-core.qapi
similarity index 99%
rename from qapi/block-core.json
rename to qapi/block-core.qapi
index c50517bff31..228060a137c 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.qapi
@@ -4,9 +4,9 @@ 
 # == Block core (VM unrelated)
 ##

-{ 'include': 'common.json' }
-{ 'include': 'crypto.json' }
-{ 'include': 'sockets.json' }
+{ 'include': 'common.qapi' }
+{ 'include': 'crypto.qapi' }
+{ 'include': 'sockets.qapi' }

 ##
 # @SnapshotInfo:
diff --git a/qapi/block.json b/qapi/block.qapi
similarity index 99%
rename from qapi/block.json
rename to qapi/block.qapi
index c6945240029..da85ef68886 100644
--- a/qapi/block.json
+++ b/qapi/block.qapi
@@ -4,7 +4,7 @@ 
 # = Block devices
 ##

-{ 'include': 'block-core.json' }
+{ 'include': 'block-core.qapi' }

 ##
 # == Additional block stuff (VM related)
diff --git a/qapi/char.json b/qapi/char.qapi
similarity index 99%
rename from qapi/char.json
rename to qapi/char.qapi
index ae19dcd1ed1..45901fb4502 100644
--- a/qapi/char.json
+++ b/qapi/char.qapi
@@ -5,7 +5,7 @@ 
 # = Character devices
 ##

-{ 'include': 'sockets.json' }
+{ 'include': 'sockets.qapi' }

 ##
 # @ChardevInfo:
diff --git a/qapi/common.json b/qapi/common.qapi
similarity index 100%
rename from qapi/common.json
rename to qapi/common.qapi
diff --git a/qapi/crypto.json b/qapi/crypto.qapi
similarity index 100%
rename from qapi/crypto.json
rename to qapi/crypto.qapi
diff --git a/qapi/introspect.json b/qapi/introspect.qapi
similarity index 100%
rename from qapi/introspect.json
rename to qapi/introspect.qapi
diff --git a/qapi/migration.json b/qapi/migration.qapi
similarity index 99%
rename from qapi/migration.json
rename to qapi/migration.qapi
index 9d0bf82cf46..dc64952ec4f 100644
--- a/qapi/migration.json
+++ b/qapi/migration.qapi
@@ -5,7 +5,7 @@ 
 # = Migration
 ##

-{ 'include': 'common.json' }
+{ 'include': 'common.qapi' }

 ##
 # @MigrationStats:
diff --git a/qapi/misc.json b/qapi/misc.qapi
similarity index 100%
rename from qapi/misc.json
rename to qapi/misc.qapi
diff --git a/qapi/net.json b/qapi/net.qapi
similarity index 99%
rename from qapi/net.json
rename to qapi/net.qapi
index 9117c569723..b28451758a8 100644
--- a/qapi/net.json
+++ b/qapi/net.qapi
@@ -5,7 +5,7 @@ 
 # = Net devices
 ##

-{ 'include': 'common.json' }
+{ 'include': 'common.qapi' }

 ##
 # @set_link:
diff --git a/qapi/qga-schema.json b/qapi/qga-schema.qapi
similarity index 100%
rename from qapi/qga-schema.json
rename to qapi/qga-schema.qapi
diff --git a/qapi/qmp-schema.json b/qapi/qmp-schema.qapi
similarity index 88%
rename from qapi/qmp-schema.json
rename to qapi/qmp-schema.qapi
index 25bce78352b..067a61fa6f3 100644
--- a/qapi/qmp-schema.json
+++ b/qapi/qmp-schema.qapi
@@ -78,18 +78,18 @@ 
 # stable order, it's best to include each sub-schema just once, or
 # include it first right here.

-{ 'include': 'common.json' }
-{ 'include': 'sockets.json' }
-{ 'include': 'run-state.json' }
-{ 'include': 'crypto.json' }
-{ 'include': 'block.json' }
-{ 'include': 'char.json' }
-{ 'include': 'net.json' }
-{ 'include': 'rocker.json' }
-{ 'include': 'tpm.json' }
-{ 'include': 'ui.json' }
-{ 'include': 'migration.json' }
-{ 'include': 'transaction.json' }
-{ 'include': 'trace.json' }
-{ 'include': 'introspect.json' }
-{ 'include': 'misc.json' }
+{ 'include': 'common.qapi' }
+{ 'include': 'sockets.qapi' }
+{ 'include': 'run-state.qapi' }
+{ 'include': 'crypto.qapi' }
+{ 'include': 'block.qapi' }
+{ 'include': 'char.qapi' }
+{ 'include': 'net.qapi' }
+{ 'include': 'rocker.qapi' }
+{ 'include': 'tpm.qapi' }
+{ 'include': 'ui.qapi' }
+{ 'include': 'migration.qapi' }
+{ 'include': 'transaction.qapi' }
+{ 'include': 'trace.qapi' }
+{ 'include': 'introspect.qapi' }
+{ 'include': 'misc.qapi' }
diff --git a/qapi/rocker.json b/qapi/rocker.qapi
similarity index 100%
rename from qapi/rocker.json
rename to qapi/rocker.qapi
diff --git a/qapi/run-state.json b/qapi/run-state.qapi
similarity index 100%
rename from qapi/run-state.json
rename to qapi/run-state.qapi
diff --git a/qapi/sockets.json b/qapi/sockets.qapi
similarity index 99%
rename from qapi/sockets.json
rename to qapi/sockets.qapi
index fc81d8d5e8b..e58db0b8b03 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.qapi
@@ -4,7 +4,7 @@ 
 # = Socket data types
 ##

-{ 'include': 'common.json' }
+{ 'include': 'common.qapi' }

 ##
 # @NetworkAddressFamily:
diff --git a/qapi/tpm.json b/qapi/tpm.qapi
similarity index 100%
rename from qapi/tpm.json
rename to qapi/tpm.qapi
diff --git a/qapi/trace.json b/qapi/trace.qapi
similarity index 100%
rename from qapi/trace.json
rename to qapi/trace.qapi
diff --git a/qapi/transaction.json b/qapi/transaction.qapi
similarity index 99%
rename from qapi/transaction.json
rename to qapi/transaction.qapi
index bd312792dae..49118f49f1d 100644
--- a/qapi/transaction.json
+++ b/qapi/transaction.qapi
@@ -5,7 +5,7 @@ 
 # = Transactions
 ##

-{ 'include': 'block.json' }
+{ 'include': 'block.qapi' }

 ##
 # @Abort:
diff --git a/qapi/ui.json b/qapi/ui.qapi
similarity index 99%
rename from qapi/ui.json
rename to qapi/ui.qapi
index 5d01ad43045..cb8b7a86d1c 100644
--- a/qapi/ui.json
+++ b/qapi/ui.qapi
@@ -5,7 +5,7 @@ 
 # = Remote desktop
 ##

-{ 'include': 'sockets.json' }
+{ 'include': 'sockets.qapi' }

 ##
 # @set_password:
diff --git a/include/crypto/block.h b/include/crypto/block.h
index cd18f46d56d..ccab4d2df8b 100644
--- a/include/crypto/block.h
+++ b/include/crypto/block.h
@@ -27,7 +27,7 @@ 
 typedef struct QCryptoBlock QCryptoBlock;

 /* See also QCryptoBlockFormat, QCryptoBlockCreateOptions
- * and QCryptoBlockOpenOptions in qapi/crypto.json */
+ * and QCryptoBlockOpenOptions in qapi/crypto.qapi */

 typedef ssize_t (*QCryptoBlockReadFunc)(QCryptoBlock *block,
                                         size_t offset,
diff --git a/include/crypto/cipher.h b/include/crypto/cipher.h
index bce2d4c8e46..287c921874d 100644
--- a/include/crypto/cipher.h
+++ b/include/crypto/cipher.h
@@ -26,7 +26,7 @@ 
 typedef struct QCryptoCipher QCryptoCipher;

 /* See also "QCryptoCipherAlgorithm" and "QCryptoCipherMode"
- * enums defined in qapi/crypto.json */
+ * enums defined in qapi/crypto.qapi */

 /**
  * QCryptoCipher:
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
index 077ac7bea0e..d9ee11f5224 100644
--- a/include/crypto/hash.h
+++ b/include/crypto/hash.h
@@ -23,7 +23,7 @@ 

 #include "qapi/qapi-types-crypto.h"

-/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.json */
+/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.qapi */

 /**
  * qcrypto_hash_supports:
diff --git a/include/crypto/ivgen.h b/include/crypto/ivgen.h
index 0350cd2a930..0609f4f1f94 100644
--- a/include/crypto/ivgen.h
+++ b/include/crypto/ivgen.h
@@ -97,7 +97,7 @@ 

 typedef struct QCryptoIVGen QCryptoIVGen;

-/* See also QCryptoIVGenAlgorithm enum in qapi/crypto.json */
+/* See also QCryptoIVGenAlgorithm enum in qapi/crypto.qapi */


 /**
diff --git a/MAINTAINERS b/MAINTAINERS
index 4a4b7aa2a64..cf2c0de6cd2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1380,8 +1380,8 @@  M: Markus Armbruster <armbru@redhat.com>
 S: Supported
 F: blockdev.c
 F: block/qapi.c
-F: qapi/block*.json
-F: qapi/transaction.json
+F: qapi/block*.qapi
+F: qapi/transaction.qapi
 T: git git://repo.or.cz/qemu/armbru.git block-next

 Dirty Bitmaps
@@ -1404,7 +1404,7 @@  M: Marc-André Lureau <marcandre.lureau@redhat.com>
 S: Maintained
 F: chardev/
 F: include/chardev/
-F: qapi/char.json
+F: qapi/char.qapi

 Character Devices (Braille)
 M: Samuel Thibault <samuel.thibault@ens-lyon.org>
@@ -1482,14 +1482,14 @@  F: include/ui/spice-display.h
 F: ui/spice-*.c
 F: audio/spiceaudio.c
 F: hw/display/qxl*
-F: qapi/ui.json
+F: qapi/ui.qapi

 Graphics
 M: Gerd Hoffmann <kraxel@redhat.com>
 S: Odd Fixes
 F: ui/
 F: include/ui/
-F: qapi/ui.json
+F: qapi/ui.qapi

 Cocoa graphics
 M: Peter Maydell <peter.maydell@linaro.org>
@@ -1503,7 +1503,7 @@  F: cpus.c
 F: util/main-loop.c
 F: util/qemu-timer.c
 F: vl.c
-F: qapi/run-state.json
+F: qapi/run-state.qapi

 Human Monitor (HMP)
 M: Dr. David Alan Gilbert <dgilbert@redhat.com>
@@ -1520,7 +1520,7 @@  S: Maintained
 F: net/
 F: include/net/
 T: git git://github.com/jasowang/qemu.git net
-F: qapi/net.json
+F: qapi/net.qapi

 Netmap network backend
 M: Luigi Rizzo <rizzo@iet.unipi.it>
@@ -1564,7 +1564,7 @@  M: Markus Armbruster <armbru@redhat.com>
 M: Michael Roth <mdroth@linux.vnet.ibm.com>
 S: Supported
 F: qapi/
-X: qapi/*.json
+X: qapi/*.qapi
 F: include/qapi/
 X: include/qapi/qmp/
 F: include/qapi/qmp/dispatch.h
@@ -1581,7 +1581,7 @@  QAPI Schema
 M: Eric Blake <eblake@redhat.com>
 M: Markus Armbruster <armbru@redhat.com>
 S: Supported
-F: qapi/*.json
+F: qapi/*.qapi
 T: git git://repo.or.cz/qemu/armbru.git qapi-next

 QObject
@@ -1602,7 +1602,7 @@  QEMU Guest Agent
 M: Michael Roth <mdroth@linux.vnet.ibm.com>
 S: Maintained
 F: qga/
-F: qapi/qga-schema.json
+F: qapi/qga-schema.qapi
 F: qemu-ga.texi
 F: scripts/qemu-guest-agent/
 F: tests/test-qga.c
@@ -1669,7 +1669,7 @@  F: stubs/tpm.c
 F: hw/tpm/*
 F: include/hw/acpi/tpm.h
 F: include/sysemu/tpm*
-F: qapi/tpm.json
+F: qapi/tpm.qapi
 F: backends/tpm.c
 F: tests/*tpm*
 T: git git://github.com/stefanberger/qemu-tpm.git tpm-next
@@ -1688,7 +1688,7 @@  F: scripts/vmstate-static-checker.py
 F: tests/vmstate-static-checker-data/
 F: tests/migration-test.c
 F: docs/devel/migration.txt
-F: qapi/migration.json
+F: qapi/migration.qapi

 Seccomp
 M: Eduardo Otubo <otubo@redhat.com>
@@ -1732,7 +1732,7 @@  M: Paolo Bonzini <pbonzini@redhat.com>
 S: Maintained
 F: include/qemu/sockets.h
 F: util/qemu-sockets.c
-F: qapi/sockets.json
+F: qapi/sockets.qapi

 Throttling infrastructure
 M: Alberto Garcia <berto@igalia.com>
diff --git a/scripts/git.orderfile b/scripts/git.orderfile
index ac699700b18..1549511d877 100644
--- a/scripts/git.orderfile
+++ b/scripts/git.orderfile
@@ -19,7 +19,7 @@  Makefile*
 *.mak

 # qapi schema
-*.json
+*.qapi

 # headers
 *.h
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 3b9a5e31a2c..21abab15acd 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -404,171 +404,171 @@  check-qtest-generic-y += tests/machine-none-test$(EXESUF)
 check-qtest-generic-y += tests/qom-test$(EXESUF)
 check-qtest-generic-y += tests/test-hmp$(EXESUF)

-qapi-schema += alternate-any.json
-qapi-schema += alternate-array.json
-qapi-schema += alternate-base.json
-qapi-schema += alternate-clash.json
-qapi-schema += alternate-conflict-dict.json
-qapi-schema += alternate-conflict-enum-bool.json
-qapi-schema += alternate-conflict-enum-int.json
-qapi-schema += alternate-conflict-string.json
-qapi-schema += alternate-conflict-bool-string.json
-qapi-schema += alternate-conflict-num-string.json
-qapi-schema += alternate-empty.json
-qapi-schema += alternate-nested.json
-qapi-schema += alternate-unknown.json
-qapi-schema += args-alternate.json
-qapi-schema += args-any.json
-qapi-schema += args-array-empty.json
-qapi-schema += args-array-unknown.json
-qapi-schema += args-bad-boxed.json
-qapi-schema += args-boxed-anon.json
-qapi-schema += args-boxed-empty.json
-qapi-schema += args-boxed-string.json
-qapi-schema += args-int.json
-qapi-schema += args-invalid.json
-qapi-schema += args-member-array-bad.json
-qapi-schema += args-member-case.json
-qapi-schema += args-member-unknown.json
-qapi-schema += args-name-clash.json
-qapi-schema += args-union.json
-qapi-schema += args-unknown.json
-qapi-schema += bad-base.json
-qapi-schema += bad-data.json
-qapi-schema += bad-ident.json
-qapi-schema += bad-type-bool.json
-qapi-schema += bad-type-dict.json
-qapi-schema += bad-type-int.json
-qapi-schema += base-cycle-direct.json
-qapi-schema += base-cycle-indirect.json
-qapi-schema += command-int.json
-qapi-schema += comments.json
-qapi-schema += doc-bad-alternate-member.json
-qapi-schema += doc-bad-command-arg.json
-qapi-schema += doc-bad-section.json
-qapi-schema += doc-bad-symbol.json
-qapi-schema += doc-bad-union-member.json
-qapi-schema += doc-before-include.json
-qapi-schema += doc-before-pragma.json
-qapi-schema += doc-duplicated-arg.json
-qapi-schema += doc-duplicated-return.json
-qapi-schema += doc-duplicated-since.json
-qapi-schema += doc-empty-arg.json
-qapi-schema += doc-empty-section.json
-qapi-schema += doc-empty-symbol.json
-qapi-schema += doc-good.json
-qapi-schema += doc-interleaved-section.json
-qapi-schema += doc-invalid-end.json
-qapi-schema += doc-invalid-end2.json
-qapi-schema += doc-invalid-return.json
-qapi-schema += doc-invalid-section.json
-qapi-schema += doc-invalid-start.json
-qapi-schema += doc-missing-colon.json
-qapi-schema += doc-missing-expr.json
-qapi-schema += doc-missing-space.json
-qapi-schema += doc-missing.json
-qapi-schema += doc-no-symbol.json
-qapi-schema += double-data.json
-qapi-schema += double-type.json
-qapi-schema += duplicate-key.json
-qapi-schema += empty.json
-qapi-schema += enum-bad-name.json
-qapi-schema += enum-bad-prefix.json
-qapi-schema += enum-clash-member.json
-qapi-schema += enum-dict-member.json
-qapi-schema += enum-int-member.json
-qapi-schema += enum-member-case.json
-qapi-schema += enum-missing-data.json
-qapi-schema += enum-wrong-data.json
-qapi-schema += escape-outside-string.json
-qapi-schema += escape-too-big.json
-qapi-schema += escape-too-short.json
-qapi-schema += event-boxed-empty.json
-qapi-schema += event-case.json
-qapi-schema += event-nest-struct.json
-qapi-schema += flat-union-array-branch.json
-qapi-schema += flat-union-bad-base.json
-qapi-schema += flat-union-bad-discriminator.json
-qapi-schema += flat-union-base-any.json
-qapi-schema += flat-union-base-union.json
-qapi-schema += flat-union-clash-member.json
-qapi-schema += flat-union-empty.json
-qapi-schema += flat-union-incomplete-branch.json
-qapi-schema += flat-union-inline.json
-qapi-schema += flat-union-int-branch.json
-qapi-schema += flat-union-invalid-branch-key.json
-qapi-schema += flat-union-invalid-discriminator.json
-qapi-schema += flat-union-no-base.json
-qapi-schema += flat-union-optional-discriminator.json
-qapi-schema += flat-union-string-discriminator.json
-qapi-schema += funny-char.json
-qapi-schema += ident-with-escape.json
-qapi-schema += include-before-err.json
-qapi-schema += include-cycle.json
-qapi-schema += include-extra-junk.json
-qapi-schema += include-format-err.json
-qapi-schema += include-nested-err.json
-qapi-schema += include-no-file.json
-qapi-schema += include-non-file.json
-qapi-schema += include-relpath.json
-qapi-schema += include-repetition.json
-qapi-schema += include-self-cycle.json
-qapi-schema += include-simple.json
-qapi-schema += indented-expr.json
-qapi-schema += leading-comma-list.json
-qapi-schema += leading-comma-object.json
-qapi-schema += missing-colon.json
-qapi-schema += missing-comma-list.json
-qapi-schema += missing-comma-object.json
-qapi-schema += missing-type.json
-qapi-schema += nested-struct-data.json
-qapi-schema += non-objects.json
-qapi-schema += oob-test.json
-qapi-schema += pragma-doc-required-crap.json
-qapi-schema += pragma-extra-junk.json
-qapi-schema += pragma-name-case-whitelist-crap.json
-qapi-schema += pragma-non-dict.json
-qapi-schema += pragma-returns-whitelist-crap.json
-qapi-schema += qapi-schema-test.json
-qapi-schema += quoted-structural-chars.json
-qapi-schema += redefined-builtin.json
-qapi-schema += redefined-command.json
-qapi-schema += redefined-event.json
-qapi-schema += redefined-type.json
-qapi-schema += reserved-command-q.json
-qapi-schema += reserved-enum-q.json
-qapi-schema += reserved-member-has.json
-qapi-schema += reserved-member-q.json
-qapi-schema += reserved-member-u.json
-qapi-schema += reserved-member-underscore.json
-qapi-schema += reserved-type-kind.json
-qapi-schema += reserved-type-list.json
-qapi-schema += returns-alternate.json
-qapi-schema += returns-array-bad.json
-qapi-schema += returns-dict.json
-qapi-schema += returns-unknown.json
-qapi-schema += returns-whitelist.json
-qapi-schema += struct-base-clash-deep.json
-qapi-schema += struct-base-clash.json
-qapi-schema += struct-data-invalid.json
-qapi-schema += struct-member-invalid.json
-qapi-schema += trailing-comma-list.json
-qapi-schema += trailing-comma-object.json
-qapi-schema += type-bypass-bad-gen.json
-qapi-schema += unclosed-list.json
-qapi-schema += unclosed-object.json
-qapi-schema += unclosed-string.json
-qapi-schema += unicode-str.json
-qapi-schema += union-base-empty.json
-qapi-schema += union-base-no-discriminator.json
-qapi-schema += union-branch-case.json
-qapi-schema += union-clash-branches.json
-qapi-schema += union-empty.json
-qapi-schema += union-invalid-base.json
-qapi-schema += union-optional-branch.json
-qapi-schema += union-unknown.json
-qapi-schema += unknown-escape.json
-qapi-schema += unknown-expr-key.json
+qapi-schema += alternate-any.qapi
+qapi-schema += alternate-array.qapi
+qapi-schema += alternate-base.qapi
+qapi-schema += alternate-clash.qapi
+qapi-schema += alternate-conflict-dict.qapi
+qapi-schema += alternate-conflict-enum-bool.qapi
+qapi-schema += alternate-conflict-enum-int.qapi
+qapi-schema += alternate-conflict-string.qapi
+qapi-schema += alternate-conflict-bool-string.qapi
+qapi-schema += alternate-conflict-num-string.qapi
+qapi-schema += alternate-empty.qapi
+qapi-schema += alternate-nested.qapi
+qapi-schema += alternate-unknown.qapi
+qapi-schema += args-alternate.qapi
+qapi-schema += args-any.qapi
+qapi-schema += args-array-empty.qapi
+qapi-schema += args-array-unknown.qapi
+qapi-schema += args-bad-boxed.qapi
+qapi-schema += args-boxed-anon.qapi
+qapi-schema += args-boxed-empty.qapi
+qapi-schema += args-boxed-string.qapi
+qapi-schema += args-int.qapi
+qapi-schema += args-invalid.qapi
+qapi-schema += args-member-array-bad.qapi
+qapi-schema += args-member-case.qapi
+qapi-schema += args-member-unknown.qapi
+qapi-schema += args-name-clash.qapi
+qapi-schema += args-union.qapi
+qapi-schema += args-unknown.qapi
+qapi-schema += bad-base.qapi
+qapi-schema += bad-data.qapi
+qapi-schema += bad-ident.qapi
+qapi-schema += bad-type-bool.qapi
+qapi-schema += bad-type-dict.qapi
+qapi-schema += bad-type-int.qapi
+qapi-schema += base-cycle-direct.qapi
+qapi-schema += base-cycle-indirect.qapi
+qapi-schema += command-int.qapi
+qapi-schema += comments.qapi
+qapi-schema += doc-bad-alternate-member.qapi
+qapi-schema += doc-bad-command-arg.qapi
+qapi-schema += doc-bad-section.qapi
+qapi-schema += doc-bad-symbol.qapi
+qapi-schema += doc-bad-union-member.qapi
+qapi-schema += doc-before-include.qapi
+qapi-schema += doc-before-pragma.qapi
+qapi-schema += doc-duplicated-arg.qapi
+qapi-schema += doc-duplicated-return.qapi
+qapi-schema += doc-duplicated-since.qapi
+qapi-schema += doc-empty-arg.qapi
+qapi-schema += doc-empty-section.qapi
+qapi-schema += doc-empty-symbol.qapi
+qapi-schema += doc-good.qapi
+qapi-schema += doc-interleaved-section.qapi
+qapi-schema += doc-invalid-end.qapi
+qapi-schema += doc-invalid-end2.qapi
+qapi-schema += doc-invalid-return.qapi
+qapi-schema += doc-invalid-section.qapi
+qapi-schema += doc-invalid-start.qapi
+qapi-schema += doc-missing-colon.qapi
+qapi-schema += doc-missing-expr.qapi
+qapi-schema += doc-missing-space.qapi
+qapi-schema += doc-missing.qapi
+qapi-schema += doc-no-symbol.qapi
+qapi-schema += double-data.qapi
+qapi-schema += double-type.qapi
+qapi-schema += duplicate-key.qapi
+qapi-schema += empty.qapi
+qapi-schema += enum-bad-name.qapi
+qapi-schema += enum-bad-prefix.qapi
+qapi-schema += enum-clash-member.qapi
+qapi-schema += enum-dict-member.qapi
+qapi-schema += enum-int-member.qapi
+qapi-schema += enum-member-case.qapi
+qapi-schema += enum-missing-data.qapi
+qapi-schema += enum-wrong-data.qapi
+qapi-schema += escape-outside-string.qapi
+qapi-schema += escape-too-big.qapi
+qapi-schema += escape-too-short.qapi
+qapi-schema += event-boxed-empty.qapi
+qapi-schema += event-case.qapi
+qapi-schema += event-nest-struct.qapi
+qapi-schema += flat-union-array-branch.qapi
+qapi-schema += flat-union-bad-base.qapi
+qapi-schema += flat-union-bad-discriminator.qapi
+qapi-schema += flat-union-base-any.qapi
+qapi-schema += flat-union-base-union.qapi
+qapi-schema += flat-union-clash-member.qapi
+qapi-schema += flat-union-empty.qapi
+qapi-schema += flat-union-incomplete-branch.qapi
+qapi-schema += flat-union-inline.qapi
+qapi-schema += flat-union-int-branch.qapi
+qapi-schema += flat-union-invalid-branch-key.qapi
+qapi-schema += flat-union-invalid-discriminator.qapi
+qapi-schema += flat-union-no-base.qapi
+qapi-schema += flat-union-optional-discriminator.qapi
+qapi-schema += flat-union-string-discriminator.qapi
+qapi-schema += funny-char.qapi
+qapi-schema += ident-with-escape.qapi
+qapi-schema += include-before-err.qapi
+qapi-schema += include-cycle.qapi
+qapi-schema += include-extra-junk.qapi
+qapi-schema += include-format-err.qapi
+qapi-schema += include-nested-err.qapi
+qapi-schema += include-no-file.qapi
+qapi-schema += include-non-file.qapi
+qapi-schema += include-relpath.qapi
+qapi-schema += include-repetition.qapi
+qapi-schema += include-self-cycle.qapi
+qapi-schema += include-simple.qapi
+qapi-schema += indented-expr.qapi
+qapi-schema += leading-comma-list.qapi
+qapi-schema += leading-comma-object.qapi
+qapi-schema += missing-colon.qapi
+qapi-schema += missing-comma-list.qapi
+qapi-schema += missing-comma-object.qapi
+qapi-schema += missing-type.qapi
+qapi-schema += nested-struct-data.qapi
+qapi-schema += non-objects.qapi
+qapi-schema += oob-test.qapi
+qapi-schema += pragma-doc-required-crap.qapi
+qapi-schema += pragma-extra-junk.qapi
+qapi-schema += pragma-name-case-whitelist-crap.qapi
+qapi-schema += pragma-non-dict.qapi
+qapi-schema += pragma-returns-whitelist-crap.qapi
+qapi-schema += qapi-schema-test.qapi
+qapi-schema += quoted-structural-chars.qapi
+qapi-schema += redefined-builtin.qapi
+qapi-schema += redefined-command.qapi
+qapi-schema += redefined-event.qapi
+qapi-schema += redefined-type.qapi
+qapi-schema += reserved-command-q.qapi
+qapi-schema += reserved-enum-q.qapi
+qapi-schema += reserved-member-has.qapi
+qapi-schema += reserved-member-q.qapi
+qapi-schema += reserved-member-u.qapi
+qapi-schema += reserved-member-underscore.qapi
+qapi-schema += reserved-type-kind.qapi
+qapi-schema += reserved-type-list.qapi
+qapi-schema += returns-alternate.qapi
+qapi-schema += returns-array-bad.qapi
+qapi-schema += returns-dict.qapi
+qapi-schema += returns-unknown.qapi
+qapi-schema += returns-whitelist.qapi
+qapi-schema += struct-base-clash-deep.qapi
+qapi-schema += struct-base-clash.qapi
+qapi-schema += struct-data-invalid.qapi
+qapi-schema += struct-member-invalid.qapi
+qapi-schema += trailing-comma-list.qapi
+qapi-schema += trailing-comma-object.qapi
+qapi-schema += type-bypass-bad-gen.qapi
+qapi-schema += unclosed-list.qapi
+qapi-schema += unclosed-object.qapi
+qapi-schema += unclosed-string.qapi
+qapi-schema += unicode-str.qapi
+qapi-schema += union-base-empty.qapi
+qapi-schema += union-base-no-discriminator.qapi
+qapi-schema += union-branch-case.qapi
+qapi-schema += union-clash-branches.qapi
+qapi-schema += union-empty.qapi
+qapi-schema += union-invalid-base.qapi
+qapi-schema += union-optional-branch.qapi
+qapi-schema += union-unknown.qapi
+qapi-schema += unknown-escape.qapi
+qapi-schema += unknown-expr-key.qapi


 check-qapi-schema-y := $(addprefix tests/qapi-schema/, $(qapi-schema))
@@ -669,13 +669,13 @@  tests/test-qapi-commands.h tests/test-qapi-commands.c \
 tests/test-qapi-events.c tests/test-qapi-events.h \
 tests/test-qapi-introspect.c tests/test-qapi-introspect.h: \
 tests/test-qapi-gen-timestamp ;
-tests/test-qapi-gen-timestamp: $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(qapi-py)
+tests/test-qapi-gen-timestamp: $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.qapi $(qapi-py)
 	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
 		-o tests -p "test-" $<, \
 		"GEN","$(@:%-timestamp=%)")
 	@>$@

-tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.json $(qapi-py)
+tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.qapi $(qapi-py)
 	$(call quiet-command,$(PYTHON_UTF8) $(SRC_PATH)/scripts/qapi-gen.py \
 		-o tests/qapi-schema -p "doc-good-" $<, \
 		"GEN","$@")
@@ -926,7 +926,7 @@  check-tests/qemu-iotests-quick.sh: tests/qemu-iotests-quick.sh qemu-img$(EXESUF)
 	$<

 .PHONY: $(patsubst %, check-%, $(check-qapi-schema-y))
-$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.json: $(SRC_PATH)/%.json
+$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.qapi: $(SRC_PATH)/%.qapi
 	$(call quiet-command, PYTHONPATH=$(SRC_PATH)/scripts \
 		$(PYTHON_UTF8) $(SRC_PATH)/tests/qapi-schema/test-qapi.py \
 		$^ >$*.test.out 2>$*.test.err; \
diff --git a/tests/qapi-schema/alternate-any.err b/tests/qapi-schema/alternate-any.err
index aaa01547310..bf762f9afe8 100644
--- a/tests/qapi-schema/alternate-any.err
+++ b/tests/qapi-schema/alternate-any.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-any.json:2: Alternate 'Alt' member 'one' cannot use type 'any'
+tests/qapi-schema/alternate-any.qapi:2: Alternate 'Alt' member 'one' cannot use type 'any'
diff --git a/tests/qapi-schema/alternate-any.json b/tests/qapi-schema/alternate-any.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-any.json
rename to tests/qapi-schema/alternate-any.qapi
diff --git a/tests/qapi-schema/alternate-array.err b/tests/qapi-schema/alternate-array.err
index 7b930c64abf..0e4a14e59d0 100644
--- a/tests/qapi-schema/alternate-array.err
+++ b/tests/qapi-schema/alternate-array.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-array.json:5: Member 'two' of alternate 'Alt' cannot be an array
+tests/qapi-schema/alternate-array.qapi:5: Member 'two' of alternate 'Alt' cannot be an array
diff --git a/tests/qapi-schema/alternate-array.json b/tests/qapi-schema/alternate-array.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-array.json
rename to tests/qapi-schema/alternate-array.qapi
diff --git a/tests/qapi-schema/alternate-base.err b/tests/qapi-schema/alternate-base.err
index 30d8a343734..9560f452eb3 100644
--- a/tests/qapi-schema/alternate-base.err
+++ b/tests/qapi-schema/alternate-base.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-base.json:4: Unknown key 'base' in alternate 'Alt'
+tests/qapi-schema/alternate-base.qapi:4: Unknown key 'base' in alternate 'Alt'
diff --git a/tests/qapi-schema/alternate-base.json b/tests/qapi-schema/alternate-base.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-base.json
rename to tests/qapi-schema/alternate-base.qapi
diff --git a/tests/qapi-schema/alternate-clash.err b/tests/qapi-schema/alternate-clash.err
index 604d8495eb0..d5eb85a256c 100644
--- a/tests/qapi-schema/alternate-clash.err
+++ b/tests/qapi-schema/alternate-clash.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-clash.json:7: 'a_b' (branch of Alt1) collides with 'a-b' (branch of Alt1)
+tests/qapi-schema/alternate-clash.qapi:7: 'a_b' (branch of Alt1) collides with 'a-b' (branch of Alt1)
diff --git a/tests/qapi-schema/alternate-clash.json b/tests/qapi-schema/alternate-clash.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-clash.json
rename to tests/qapi-schema/alternate-clash.qapi
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.err b/tests/qapi-schema/alternate-conflict-bool-string.err
index e52fee76201..800267a2124 100644
--- a/tests/qapi-schema/alternate-conflict-bool-string.err
+++ b/tests/qapi-schema/alternate-conflict-bool-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-bool-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-bool-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.json b/tests/qapi-schema/alternate-conflict-bool-string.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-bool-string.json
rename to tests/qapi-schema/alternate-conflict-bool-string.qapi
diff --git a/tests/qapi-schema/alternate-conflict-dict.err b/tests/qapi-schema/alternate-conflict-dict.err
index 0f411f4faf5..2aeff136883 100644
--- a/tests/qapi-schema/alternate-conflict-dict.err
+++ b/tests/qapi-schema/alternate-conflict-dict.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-dict.json:6: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-dict.qapi:6: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-dict.json b/tests/qapi-schema/alternate-conflict-dict.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-dict.json
rename to tests/qapi-schema/alternate-conflict-dict.qapi
diff --git a/tests/qapi-schema/alternate-conflict-enum-bool.err b/tests/qapi-schema/alternate-conflict-enum-bool.err
index 0dfc00242d8..cf166d6a3d4 100644
--- a/tests/qapi-schema/alternate-conflict-enum-bool.err
+++ b/tests/qapi-schema/alternate-conflict-enum-bool.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-enum-bool.json:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-enum-bool.qapi:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-enum-bool.json b/tests/qapi-schema/alternate-conflict-enum-bool.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-enum-bool.json
rename to tests/qapi-schema/alternate-conflict-enum-bool.qapi
diff --git a/tests/qapi-schema/alternate-conflict-enum-int.err b/tests/qapi-schema/alternate-conflict-enum-int.err
index 2cc8e7b9aa4..04298eae905 100644
--- a/tests/qapi-schema/alternate-conflict-enum-int.err
+++ b/tests/qapi-schema/alternate-conflict-enum-int.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-enum-int.json:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-enum-int.qapi:4: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-enum-int.json b/tests/qapi-schema/alternate-conflict-enum-int.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-enum-int.json
rename to tests/qapi-schema/alternate-conflict-enum-int.qapi
diff --git a/tests/qapi-schema/alternate-conflict-num-string.err b/tests/qapi-schema/alternate-conflict-num-string.err
index 5ba3827dd12..42a6dbc449f 100644
--- a/tests/qapi-schema/alternate-conflict-num-string.err
+++ b/tests/qapi-schema/alternate-conflict-num-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-num-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-num-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-num-string.json b/tests/qapi-schema/alternate-conflict-num-string.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-num-string.json
rename to tests/qapi-schema/alternate-conflict-num-string.qapi
diff --git a/tests/qapi-schema/alternate-conflict-string.err b/tests/qapi-schema/alternate-conflict-string.err
index fe2f188295b..ee70cad527b 100644
--- a/tests/qapi-schema/alternate-conflict-string.err
+++ b/tests/qapi-schema/alternate-conflict-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-conflict-string.json:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
+tests/qapi-schema/alternate-conflict-string.qapi:2: Alternate 'Alt' member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-string.json b/tests/qapi-schema/alternate-conflict-string.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-conflict-string.json
rename to tests/qapi-schema/alternate-conflict-string.qapi
diff --git a/tests/qapi-schema/alternate-empty.err b/tests/qapi-schema/alternate-empty.err
index bb06c5bfec0..4253cac8af5 100644
--- a/tests/qapi-schema/alternate-empty.err
+++ b/tests/qapi-schema/alternate-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-empty.json:2: Alternate 'Alt' should have at least two branches in 'data'
+tests/qapi-schema/alternate-empty.qapi:2: Alternate 'Alt' should have at least two branches in 'data'
diff --git a/tests/qapi-schema/alternate-empty.json b/tests/qapi-schema/alternate-empty.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-empty.json
rename to tests/qapi-schema/alternate-empty.qapi
diff --git a/tests/qapi-schema/alternate-nested.err b/tests/qapi-schema/alternate-nested.err
index 4d1187e60ec..ae3aa1a73f0 100644
--- a/tests/qapi-schema/alternate-nested.err
+++ b/tests/qapi-schema/alternate-nested.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-nested.json:4: Member 'nested' of alternate 'Alt2' cannot use alternate type 'Alt1'
+tests/qapi-schema/alternate-nested.qapi:4: Member 'nested' of alternate 'Alt2' cannot use alternate type 'Alt1'
diff --git a/tests/qapi-schema/alternate-nested.json b/tests/qapi-schema/alternate-nested.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-nested.json
rename to tests/qapi-schema/alternate-nested.qapi
diff --git a/tests/qapi-schema/alternate-unknown.err b/tests/qapi-schema/alternate-unknown.err
index dea45dc7302..706658d4959 100644
--- a/tests/qapi-schema/alternate-unknown.err
+++ b/tests/qapi-schema/alternate-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/alternate-unknown.json:2: Member 'unknown' of alternate 'Alt' uses unknown type 'MissingType'
+tests/qapi-schema/alternate-unknown.qapi:2: Member 'unknown' of alternate 'Alt' uses unknown type 'MissingType'
diff --git a/tests/qapi-schema/alternate-unknown.json b/tests/qapi-schema/alternate-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/alternate-unknown.json
rename to tests/qapi-schema/alternate-unknown.qapi
diff --git a/tests/qapi-schema/args-alternate.err b/tests/qapi-schema/args-alternate.err
index 3086eae56b0..637d9884867 100644
--- a/tests/qapi-schema/args-alternate.err
+++ b/tests/qapi-schema/args-alternate.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-alternate.json:3: 'data' for command 'oops' cannot use alternate type 'Alt'
+tests/qapi-schema/args-alternate.qapi:3: 'data' for command 'oops' cannot use alternate type 'Alt'
diff --git a/tests/qapi-schema/args-alternate.json b/tests/qapi-schema/args-alternate.qapi
similarity index 100%
rename from tests/qapi-schema/args-alternate.json
rename to tests/qapi-schema/args-alternate.qapi
diff --git a/tests/qapi-schema/args-any.err b/tests/qapi-schema/args-any.err
index bf9b5e0730b..2853bdb41ea 100644
--- a/tests/qapi-schema/args-any.err
+++ b/tests/qapi-schema/args-any.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-any.json:2: 'data' for command 'oops' cannot use built-in type 'any'
+tests/qapi-schema/args-any.qapi:2: 'data' for command 'oops' cannot use built-in type 'any'
diff --git a/tests/qapi-schema/args-any.json b/tests/qapi-schema/args-any.qapi
similarity index 100%
rename from tests/qapi-schema/args-any.json
rename to tests/qapi-schema/args-any.qapi
diff --git a/tests/qapi-schema/args-array-empty.err b/tests/qapi-schema/args-array-empty.err
index cb7ed33b3fb..530d661b649 100644
--- a/tests/qapi-schema/args-array-empty.err
+++ b/tests/qapi-schema/args-array-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-array-empty.json:2: Member 'empty' of 'data' for command 'oops': array type must contain single type name
+tests/qapi-schema/args-array-empty.qapi:2: Member 'empty' of 'data' for command 'oops': array type must contain single type name
diff --git a/tests/qapi-schema/args-array-empty.json b/tests/qapi-schema/args-array-empty.qapi
similarity index 100%
rename from tests/qapi-schema/args-array-empty.json
rename to tests/qapi-schema/args-array-empty.qapi
diff --git a/tests/qapi-schema/args-array-unknown.err b/tests/qapi-schema/args-array-unknown.err
index cd7a0f98d79..6273c088bb3 100644
--- a/tests/qapi-schema/args-array-unknown.err
+++ b/tests/qapi-schema/args-array-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-array-unknown.json:2: Member 'array' of 'data' for command 'oops' uses unknown type 'NoSuchType'
+tests/qapi-schema/args-array-unknown.qapi:2: Member 'array' of 'data' for command 'oops' uses unknown type 'NoSuchType'
diff --git a/tests/qapi-schema/args-array-unknown.json b/tests/qapi-schema/args-array-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/args-array-unknown.json
rename to tests/qapi-schema/args-array-unknown.qapi
diff --git a/tests/qapi-schema/args-bad-boxed.err b/tests/qapi-schema/args-bad-boxed.err
index ad0d417321c..b059bcc3076 100644
--- a/tests/qapi-schema/args-bad-boxed.err
+++ b/tests/qapi-schema/args-bad-boxed.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-bad-boxed.json:2: 'boxed' of command 'foo' should only use true value
+tests/qapi-schema/args-bad-boxed.qapi:2: 'boxed' of command 'foo' should only use true value
diff --git a/tests/qapi-schema/args-bad-boxed.json b/tests/qapi-schema/args-bad-boxed.qapi
similarity index 100%
rename from tests/qapi-schema/args-bad-boxed.json
rename to tests/qapi-schema/args-bad-boxed.qapi
diff --git a/tests/qapi-schema/args-boxed-anon.err b/tests/qapi-schema/args-boxed-anon.err
index f24f3452185..fc5f2828c44 100644
--- a/tests/qapi-schema/args-boxed-anon.err
+++ b/tests/qapi-schema/args-boxed-anon.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-boxed-anon.json:2: 'data' for command 'foo' should be a type name
+tests/qapi-schema/args-boxed-anon.qapi:2: 'data' for command 'foo' should be a type name
diff --git a/tests/qapi-schema/args-boxed-anon.json b/tests/qapi-schema/args-boxed-anon.qapi
similarity index 100%
rename from tests/qapi-schema/args-boxed-anon.json
rename to tests/qapi-schema/args-boxed-anon.qapi
diff --git a/tests/qapi-schema/args-boxed-empty.err b/tests/qapi-schema/args-boxed-empty.err
index 039603e85ca..c144d317b7f 100644
--- a/tests/qapi-schema/args-boxed-empty.err
+++ b/tests/qapi-schema/args-boxed-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-boxed-empty.json:3: Cannot use 'boxed' with empty type
+tests/qapi-schema/args-boxed-empty.qapi:3: Cannot use 'boxed' with empty type
diff --git a/tests/qapi-schema/args-boxed-empty.json b/tests/qapi-schema/args-boxed-empty.qapi
similarity index 100%
rename from tests/qapi-schema/args-boxed-empty.json
rename to tests/qapi-schema/args-boxed-empty.qapi
diff --git a/tests/qapi-schema/args-boxed-string.err b/tests/qapi-schema/args-boxed-string.err
index d326b48aefd..48d612261c1 100644
--- a/tests/qapi-schema/args-boxed-string.err
+++ b/tests/qapi-schema/args-boxed-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-boxed-string.json:2: 'data' for command 'foo' cannot use built-in type 'str'
+tests/qapi-schema/args-boxed-string.qapi:2: 'data' for command 'foo' cannot use built-in type 'str'
diff --git a/tests/qapi-schema/args-boxed-string.json b/tests/qapi-schema/args-boxed-string.qapi
similarity index 100%
rename from tests/qapi-schema/args-boxed-string.json
rename to tests/qapi-schema/args-boxed-string.qapi
diff --git a/tests/qapi-schema/args-int.err b/tests/qapi-schema/args-int.err
index dc1d2504ff8..35b50e18825 100644
--- a/tests/qapi-schema/args-int.err
+++ b/tests/qapi-schema/args-int.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-int.json:2: 'data' for command 'oops' cannot use built-in type 'int'
+tests/qapi-schema/args-int.qapi:2: 'data' for command 'oops' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/args-int.json b/tests/qapi-schema/args-int.qapi
similarity index 100%
rename from tests/qapi-schema/args-int.json
rename to tests/qapi-schema/args-int.qapi
diff --git a/tests/qapi-schema/args-invalid.err b/tests/qapi-schema/args-invalid.err
index fe1e94975b9..5884976eeed 100644
--- a/tests/qapi-schema/args-invalid.err
+++ b/tests/qapi-schema/args-invalid.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-invalid.json:1: 'data' for command 'foo' should be a dictionary or type name
+tests/qapi-schema/args-invalid.qapi:1: 'data' for command 'foo' should be a dictionary or type name
diff --git a/tests/qapi-schema/args-invalid.json b/tests/qapi-schema/args-invalid.qapi
similarity index 100%
rename from tests/qapi-schema/args-invalid.json
rename to tests/qapi-schema/args-invalid.qapi
diff --git a/tests/qapi-schema/args-member-array-bad.err b/tests/qapi-schema/args-member-array-bad.err
index 881b4d954f2..19fb4f4bfb3 100644
--- a/tests/qapi-schema/args-member-array-bad.err
+++ b/tests/qapi-schema/args-member-array-bad.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-member-array-bad.json:2: Member 'member' of 'data' for command 'oops': array type must contain single type name
+tests/qapi-schema/args-member-array-bad.qapi:2: Member 'member' of 'data' for command 'oops': array type must contain single type name
diff --git a/tests/qapi-schema/args-member-array-bad.json b/tests/qapi-schema/args-member-array-bad.qapi
similarity index 100%
rename from tests/qapi-schema/args-member-array-bad.json
rename to tests/qapi-schema/args-member-array-bad.qapi
diff --git a/tests/qapi-schema/args-member-case.err b/tests/qapi-schema/args-member-case.err
index 19c44266015..62294827266 100644
--- a/tests/qapi-schema/args-member-case.err
+++ b/tests/qapi-schema/args-member-case.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-member-case.json:2: 'Arg' (parameter of no-way-this-will-get-whitelisted) should not use uppercase
+tests/qapi-schema/args-member-case.qapi:2: 'Arg' (parameter of no-way-this-will-get-whitelisted) should not use uppercase
diff --git a/tests/qapi-schema/args-member-case.json b/tests/qapi-schema/args-member-case.qapi
similarity index 100%
rename from tests/qapi-schema/args-member-case.json
rename to tests/qapi-schema/args-member-case.qapi
diff --git a/tests/qapi-schema/args-member-unknown.err b/tests/qapi-schema/args-member-unknown.err
index f6f82828ce5..c9e58b2d074 100644
--- a/tests/qapi-schema/args-member-unknown.err
+++ b/tests/qapi-schema/args-member-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-member-unknown.json:2: Member 'member' of 'data' for command 'oops' uses unknown type 'NoSuchType'
+tests/qapi-schema/args-member-unknown.qapi:2: Member 'member' of 'data' for command 'oops' uses unknown type 'NoSuchType'
diff --git a/tests/qapi-schema/args-member-unknown.json b/tests/qapi-schema/args-member-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/args-member-unknown.json
rename to tests/qapi-schema/args-member-unknown.qapi
diff --git a/tests/qapi-schema/args-name-clash.err b/tests/qapi-schema/args-name-clash.err
index d953e8d2416..5e9dc79a3dd 100644
--- a/tests/qapi-schema/args-name-clash.err
+++ b/tests/qapi-schema/args-name-clash.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-name-clash.json:4: 'a_b' (parameter of oops) collides with 'a-b' (parameter of oops)
+tests/qapi-schema/args-name-clash.qapi:4: 'a_b' (parameter of oops) collides with 'a-b' (parameter of oops)
diff --git a/tests/qapi-schema/args-name-clash.json b/tests/qapi-schema/args-name-clash.qapi
similarity index 100%
rename from tests/qapi-schema/args-name-clash.json
rename to tests/qapi-schema/args-name-clash.qapi
diff --git a/tests/qapi-schema/args-union.err b/tests/qapi-schema/args-union.err
index f8ad223ddee..8b84f4034e8 100644
--- a/tests/qapi-schema/args-union.err
+++ b/tests/qapi-schema/args-union.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-union.json:3: 'data' for command 'oops' cannot use union type 'Uni'
+tests/qapi-schema/args-union.qapi:3: 'data' for command 'oops' cannot use union type 'Uni'
diff --git a/tests/qapi-schema/args-union.json b/tests/qapi-schema/args-union.qapi
similarity index 100%
rename from tests/qapi-schema/args-union.json
rename to tests/qapi-schema/args-union.qapi
diff --git a/tests/qapi-schema/args-unknown.err b/tests/qapi-schema/args-unknown.err
index 4d91ec869f9..86b4d123566 100644
--- a/tests/qapi-schema/args-unknown.err
+++ b/tests/qapi-schema/args-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/args-unknown.json:2: 'data' for command 'oops' uses unknown type 'NoSuchType'
+tests/qapi-schema/args-unknown.qapi:2: 'data' for command 'oops' uses unknown type 'NoSuchType'
diff --git a/tests/qapi-schema/args-unknown.json b/tests/qapi-schema/args-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/args-unknown.json
rename to tests/qapi-schema/args-unknown.qapi
diff --git a/tests/qapi-schema/bad-base.err b/tests/qapi-schema/bad-base.err
index 154274bdd3f..2329ecc605e 100644
--- a/tests/qapi-schema/bad-base.err
+++ b/tests/qapi-schema/bad-base.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-base.json:3: 'base' for struct 'MyType' cannot use union type 'Union'
+tests/qapi-schema/bad-base.qapi:3: 'base' for struct 'MyType' cannot use union type 'Union'
diff --git a/tests/qapi-schema/bad-base.json b/tests/qapi-schema/bad-base.qapi
similarity index 100%
rename from tests/qapi-schema/bad-base.json
rename to tests/qapi-schema/bad-base.qapi
diff --git a/tests/qapi-schema/bad-data.err b/tests/qapi-schema/bad-data.err
index 8523ac4f46d..7f6c19eaf0d 100644
--- a/tests/qapi-schema/bad-data.err
+++ b/tests/qapi-schema/bad-data.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-data.json:2: 'data' for command 'oops' cannot be an array
+tests/qapi-schema/bad-data.qapi:2: 'data' for command 'oops' cannot be an array
diff --git a/tests/qapi-schema/bad-data.json b/tests/qapi-schema/bad-data.qapi
similarity index 100%
rename from tests/qapi-schema/bad-data.json
rename to tests/qapi-schema/bad-data.qapi
diff --git a/tests/qapi-schema/bad-ident.err b/tests/qapi-schema/bad-ident.err
index c4190602b5c..0733e38d4cd 100644
--- a/tests/qapi-schema/bad-ident.err
+++ b/tests/qapi-schema/bad-ident.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-ident.json:2: 'struct' does not allow optional name '*oops'
+tests/qapi-schema/bad-ident.qapi:2: 'struct' does not allow optional name '*oops'
diff --git a/tests/qapi-schema/bad-ident.json b/tests/qapi-schema/bad-ident.qapi
similarity index 100%
rename from tests/qapi-schema/bad-ident.json
rename to tests/qapi-schema/bad-ident.qapi
diff --git a/tests/qapi-schema/bad-type-bool.err b/tests/qapi-schema/bad-type-bool.err
index 62fd70baafd..824d0b737e7 100644
--- a/tests/qapi-schema/bad-type-bool.err
+++ b/tests/qapi-schema/bad-type-bool.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-type-bool.json:2: 'struct' key must have a string value
+tests/qapi-schema/bad-type-bool.qapi:2: 'struct' key must have a string value
diff --git a/tests/qapi-schema/bad-type-bool.json b/tests/qapi-schema/bad-type-bool.qapi
similarity index 100%
rename from tests/qapi-schema/bad-type-bool.json
rename to tests/qapi-schema/bad-type-bool.qapi
diff --git a/tests/qapi-schema/bad-type-dict.err b/tests/qapi-schema/bad-type-dict.err
index 0b2a2aeac42..fc5302bd9af 100644
--- a/tests/qapi-schema/bad-type-dict.err
+++ b/tests/qapi-schema/bad-type-dict.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-type-dict.json:2: 'command' key must have a string value
+tests/qapi-schema/bad-type-dict.qapi:2: 'command' key must have a string value
diff --git a/tests/qapi-schema/bad-type-dict.json b/tests/qapi-schema/bad-type-dict.qapi
similarity index 100%
rename from tests/qapi-schema/bad-type-dict.json
rename to tests/qapi-schema/bad-type-dict.qapi
diff --git a/tests/qapi-schema/bad-type-int.err b/tests/qapi-schema/bad-type-int.err
index da898954046..a6c074644bb 100644
--- a/tests/qapi-schema/bad-type-int.err
+++ b/tests/qapi-schema/bad-type-int.err
@@ -1 +1 @@ 
-tests/qapi-schema/bad-type-int.json:3:13: Stray "1"
+tests/qapi-schema/bad-type-int.qapi:3:13: Stray "1"
diff --git a/tests/qapi-schema/bad-type-int.json b/tests/qapi-schema/bad-type-int.qapi
similarity index 100%
rename from tests/qapi-schema/bad-type-int.json
rename to tests/qapi-schema/bad-type-int.qapi
diff --git a/tests/qapi-schema/base-cycle-direct.err b/tests/qapi-schema/base-cycle-direct.err
index 9c68f6543d3..7b83d041ea4 100644
--- a/tests/qapi-schema/base-cycle-direct.err
+++ b/tests/qapi-schema/base-cycle-direct.err
@@ -1 +1 @@ 
-tests/qapi-schema/base-cycle-direct.json:2: Object Loopy contains itself
+tests/qapi-schema/base-cycle-direct.qapi:2: Object Loopy contains itself
diff --git a/tests/qapi-schema/base-cycle-direct.json b/tests/qapi-schema/base-cycle-direct.qapi
similarity index 100%
rename from tests/qapi-schema/base-cycle-direct.json
rename to tests/qapi-schema/base-cycle-direct.qapi
diff --git a/tests/qapi-schema/base-cycle-indirect.err b/tests/qapi-schema/base-cycle-indirect.err
index fc92fe47f82..585c95aea24 100644
--- a/tests/qapi-schema/base-cycle-indirect.err
+++ b/tests/qapi-schema/base-cycle-indirect.err
@@ -1 +1 @@ 
-tests/qapi-schema/base-cycle-indirect.json:2: Object Base1 contains itself
+tests/qapi-schema/base-cycle-indirect.qapi:2: Object Base1 contains itself
diff --git a/tests/qapi-schema/base-cycle-indirect.json b/tests/qapi-schema/base-cycle-indirect.qapi
similarity index 100%
rename from tests/qapi-schema/base-cycle-indirect.json
rename to tests/qapi-schema/base-cycle-indirect.qapi
diff --git a/tests/qapi-schema/command-int.err b/tests/qapi-schema/command-int.err
index 0f9300679b3..10c53335fa9 100644
--- a/tests/qapi-schema/command-int.err
+++ b/tests/qapi-schema/command-int.err
@@ -1 +1 @@ 
-tests/qapi-schema/command-int.json:2: built-in 'int' is already defined
+tests/qapi-schema/command-int.qapi:2: built-in 'int' is already defined
diff --git a/tests/qapi-schema/command-int.json b/tests/qapi-schema/command-int.qapi
similarity index 100%
rename from tests/qapi-schema/command-int.json
rename to tests/qapi-schema/command-int.qapi
diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out
index 8d2f1ce8a2e..6c0d162bc0a 100644
--- a/tests/qapi-schema/comments.out
+++ b/tests/qapi-schema/comments.out
@@ -1,5 +1,5 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module comments.json
+module comments.qapi
 enum Status ['good', 'bad', 'ugly']
diff --git a/tests/qapi-schema/comments.json b/tests/qapi-schema/comments.qapi
similarity index 100%
rename from tests/qapi-schema/comments.json
rename to tests/qapi-schema/comments.qapi
diff --git a/tests/qapi-schema/doc-bad-alternate-member.err b/tests/qapi-schema/doc-bad-alternate-member.err
index 387f7824daa..318d1df8748 100644
--- a/tests/qapi-schema/doc-bad-alternate-member.err
+++ b/tests/qapi-schema/doc-bad-alternate-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-bad-alternate-member.json:3: The following documented members are not in the declaration: aa, bb
+tests/qapi-schema/doc-bad-alternate-member.qapi:3: The following documented members are not in the declaration: aa, bb
diff --git a/tests/qapi-schema/doc-bad-alternate-member.json b/tests/qapi-schema/doc-bad-alternate-member.qapi
similarity index 100%
rename from tests/qapi-schema/doc-bad-alternate-member.json
rename to tests/qapi-schema/doc-bad-alternate-member.qapi
diff --git a/tests/qapi-schema/doc-bad-command-arg.err b/tests/qapi-schema/doc-bad-command-arg.err
index 8075b146ae3..bd236a1f819 100644
--- a/tests/qapi-schema/doc-bad-command-arg.err
+++ b/tests/qapi-schema/doc-bad-command-arg.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-bad-command-arg.json:3: The following documented members are not in the declaration: b
+tests/qapi-schema/doc-bad-command-arg.qapi:3: The following documented members are not in the declaration: b
diff --git a/tests/qapi-schema/doc-bad-command-arg.json b/tests/qapi-schema/doc-bad-command-arg.qapi
similarity index 100%
rename from tests/qapi-schema/doc-bad-command-arg.json
rename to tests/qapi-schema/doc-bad-command-arg.qapi
diff --git a/tests/qapi-schema/doc-bad-section.out b/tests/qapi-schema/doc-bad-section.out
index cd287215689..3a8b8d3fe0b 100644
--- a/tests/qapi-schema/doc-bad-section.out
+++ b/tests/qapi-schema/doc-bad-section.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module doc-bad-section.json
+module doc-bad-section.qapi
 enum Enum ['one', 'two']
 doc symbol=Enum
     body=
diff --git a/tests/qapi-schema/doc-bad-section.json b/tests/qapi-schema/doc-bad-section.qapi
similarity index 100%
rename from tests/qapi-schema/doc-bad-section.json
rename to tests/qapi-schema/doc-bad-section.qapi
diff --git a/tests/qapi-schema/doc-bad-symbol.err b/tests/qapi-schema/doc-bad-symbol.err
index 8472030c791..5fe61db4e79 100644
--- a/tests/qapi-schema/doc-bad-symbol.err
+++ b/tests/qapi-schema/doc-bad-symbol.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-bad-symbol.json:6: Definition of 'foo' follows documentation for 'food'
+tests/qapi-schema/doc-bad-symbol.qapi:6: Definition of 'foo' follows documentation for 'food'
diff --git a/tests/qapi-schema/doc-bad-symbol.json b/tests/qapi-schema/doc-bad-symbol.qapi
similarity index 100%
rename from tests/qapi-schema/doc-bad-symbol.json
rename to tests/qapi-schema/doc-bad-symbol.qapi
diff --git a/tests/qapi-schema/doc-bad-union-member.err b/tests/qapi-schema/doc-bad-union-member.err
index 4b016df7ff7..0bb90004cc9 100644
--- a/tests/qapi-schema/doc-bad-union-member.err
+++ b/tests/qapi-schema/doc-bad-union-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-bad-union-member.json:3: The following documented members are not in the declaration: a, b
+tests/qapi-schema/doc-bad-union-member.qapi:3: The following documented members are not in the declaration: a, b
diff --git a/tests/qapi-schema/doc-bad-union-member.json b/tests/qapi-schema/doc-bad-union-member.qapi
similarity index 100%
rename from tests/qapi-schema/doc-bad-union-member.json
rename to tests/qapi-schema/doc-bad-union-member.qapi
diff --git a/tests/qapi-schema/doc-before-include.err b/tests/qapi-schema/doc-before-include.err
index a649d38a630..a7b903fc1e9 100644
--- a/tests/qapi-schema/doc-before-include.err
+++ b/tests/qapi-schema/doc-before-include.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-before-include.json:3: Documentation for 'foo' is not followed by the definition
+tests/qapi-schema/doc-before-include.qapi:3: Documentation for 'foo' is not followed by the definition
diff --git a/tests/qapi-schema/doc-before-include.json b/tests/qapi-schema/doc-before-include.qapi
similarity index 81%
rename from tests/qapi-schema/doc-before-include.json
rename to tests/qapi-schema/doc-before-include.qapi
index 0caa0ae0791..7fae0a67550 100644
--- a/tests/qapi-schema/doc-before-include.json
+++ b/tests/qapi-schema/doc-before-include.qapi
@@ -3,5 +3,5 @@ 
 ##
 # @foo:
 ##
-{ 'include': 'empty.json' }
+{ 'include': 'empty.qapi' }
 { 'struct': 'foo', 'data': {} }
diff --git a/tests/qapi-schema/doc-before-pragma.err b/tests/qapi-schema/doc-before-pragma.err
index c0fb0660d14..2dbc7e00de8 100644
--- a/tests/qapi-schema/doc-before-pragma.err
+++ b/tests/qapi-schema/doc-before-pragma.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-before-pragma.json:3: Documentation for 'foo' is not followed by the definition
+tests/qapi-schema/doc-before-pragma.qapi:3: Documentation for 'foo' is not followed by the definition
diff --git a/tests/qapi-schema/doc-before-pragma.json b/tests/qapi-schema/doc-before-pragma.qapi
similarity index 100%
rename from tests/qapi-schema/doc-before-pragma.json
rename to tests/qapi-schema/doc-before-pragma.qapi
diff --git a/tests/qapi-schema/doc-duplicated-arg.err b/tests/qapi-schema/doc-duplicated-arg.err
index 1c3f8e0a542..4929ac53cf3 100644
--- a/tests/qapi-schema/doc-duplicated-arg.err
+++ b/tests/qapi-schema/doc-duplicated-arg.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-duplicated-arg.json:6:1: 'a' parameter name duplicated
+tests/qapi-schema/doc-duplicated-arg.qapi:6:1: 'a' parameter name duplicated
diff --git a/tests/qapi-schema/doc-duplicated-arg.json b/tests/qapi-schema/doc-duplicated-arg.qapi
similarity index 100%
rename from tests/qapi-schema/doc-duplicated-arg.json
rename to tests/qapi-schema/doc-duplicated-arg.qapi
diff --git a/tests/qapi-schema/doc-duplicated-return.err b/tests/qapi-schema/doc-duplicated-return.err
index e48039f8e53..92f7b655d4c 100644
--- a/tests/qapi-schema/doc-duplicated-return.err
+++ b/tests/qapi-schema/doc-duplicated-return.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-duplicated-return.json:7:1: Duplicated 'Returns' section
+tests/qapi-schema/doc-duplicated-return.qapi:7:1: Duplicated 'Returns' section
diff --git a/tests/qapi-schema/doc-duplicated-return.json b/tests/qapi-schema/doc-duplicated-return.qapi
similarity index 100%
rename from tests/qapi-schema/doc-duplicated-return.json
rename to tests/qapi-schema/doc-duplicated-return.qapi
diff --git a/tests/qapi-schema/doc-duplicated-since.err b/tests/qapi-schema/doc-duplicated-since.err
index 3fb890744a4..2bb0097fb09 100644
--- a/tests/qapi-schema/doc-duplicated-since.err
+++ b/tests/qapi-schema/doc-duplicated-since.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-duplicated-since.json:7:1: Duplicated 'Since' section
+tests/qapi-schema/doc-duplicated-since.qapi:7:1: Duplicated 'Since' section
diff --git a/tests/qapi-schema/doc-duplicated-since.json b/tests/qapi-schema/doc-duplicated-since.qapi
similarity index 100%
rename from tests/qapi-schema/doc-duplicated-since.json
rename to tests/qapi-schema/doc-duplicated-since.qapi
diff --git a/tests/qapi-schema/doc-empty-arg.err b/tests/qapi-schema/doc-empty-arg.err
index 2895518fa7f..873eddca052 100644
--- a/tests/qapi-schema/doc-empty-arg.err
+++ b/tests/qapi-schema/doc-empty-arg.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-empty-arg.json:5:1: Invalid parameter name
+tests/qapi-schema/doc-empty-arg.qapi:5:1: Invalid parameter name
diff --git a/tests/qapi-schema/doc-empty-arg.json b/tests/qapi-schema/doc-empty-arg.qapi
similarity index 100%
rename from tests/qapi-schema/doc-empty-arg.json
rename to tests/qapi-schema/doc-empty-arg.qapi
diff --git a/tests/qapi-schema/doc-empty-section.err b/tests/qapi-schema/doc-empty-section.err
index b61e4a78860..ed54e31ba5e 100644
--- a/tests/qapi-schema/doc-empty-section.err
+++ b/tests/qapi-schema/doc-empty-section.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-empty-section.json:7:1: Empty doc section 'Note'
+tests/qapi-schema/doc-empty-section.qapi:7:1: Empty doc section 'Note'
diff --git a/tests/qapi-schema/doc-empty-section.json b/tests/qapi-schema/doc-empty-section.qapi
similarity index 100%
rename from tests/qapi-schema/doc-empty-section.json
rename to tests/qapi-schema/doc-empty-section.qapi
diff --git a/tests/qapi-schema/doc-empty-symbol.err b/tests/qapi-schema/doc-empty-symbol.err
index 1936ad094f8..ca349b1ec47 100644
--- a/tests/qapi-schema/doc-empty-symbol.err
+++ b/tests/qapi-schema/doc-empty-symbol.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-empty-symbol.json:4:1: Invalid name
+tests/qapi-schema/doc-empty-symbol.qapi:4:1: Invalid name
diff --git a/tests/qapi-schema/doc-empty-symbol.json b/tests/qapi-schema/doc-empty-symbol.qapi
similarity index 100%
rename from tests/qapi-schema/doc-empty-symbol.json
rename to tests/qapi-schema/doc-empty-symbol.qapi
diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out
index 63058b1590a..e5aede089b1 100644
--- a/tests/qapi-schema/doc-good.out
+++ b/tests/qapi-schema/doc-good.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module doc-good.json
+module doc-good.qapi
 enum Enum ['one', 'two']
 object Base
     member base1: Enum optional=False
diff --git a/tests/qapi-schema/doc-good.json b/tests/qapi-schema/doc-good.qapi
similarity index 100%
rename from tests/qapi-schema/doc-good.json
rename to tests/qapi-schema/doc-good.qapi
diff --git a/tests/qapi-schema/doc-interleaved-section.err b/tests/qapi-schema/doc-interleaved-section.err
index d373eabc556..f5e347f391b 100644
--- a/tests/qapi-schema/doc-interleaved-section.err
+++ b/tests/qapi-schema/doc-interleaved-section.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-interleaved-section.json:15:1: '@foobar:' can't follow 'Note' section
+tests/qapi-schema/doc-interleaved-section.qapi:15:1: '@foobar:' can't follow 'Note' section
diff --git a/tests/qapi-schema/doc-interleaved-section.json b/tests/qapi-schema/doc-interleaved-section.qapi
similarity index 100%
rename from tests/qapi-schema/doc-interleaved-section.json
rename to tests/qapi-schema/doc-interleaved-section.qapi
diff --git a/tests/qapi-schema/doc-invalid-end.err b/tests/qapi-schema/doc-invalid-end.err
index 2bda28cb548..2152663541e 100644
--- a/tests/qapi-schema/doc-invalid-end.err
+++ b/tests/qapi-schema/doc-invalid-end.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-invalid-end.json:5:2: Documentation comment must end with '##'
+tests/qapi-schema/doc-invalid-end.qapi:5:2: Documentation comment must end with '##'
diff --git a/tests/qapi-schema/doc-invalid-end.json b/tests/qapi-schema/doc-invalid-end.qapi
similarity index 100%
rename from tests/qapi-schema/doc-invalid-end.json
rename to tests/qapi-schema/doc-invalid-end.qapi
diff --git a/tests/qapi-schema/doc-invalid-end2.err b/tests/qapi-schema/doc-invalid-end2.err
index 6fad9c789e7..077931d8500 100644
--- a/tests/qapi-schema/doc-invalid-end2.err
+++ b/tests/qapi-schema/doc-invalid-end2.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-invalid-end2.json:5:1: Junk after '##' at end of documentation comment
+tests/qapi-schema/doc-invalid-end2.qapi:5:1: Junk after '##' at end of documentation comment
diff --git a/tests/qapi-schema/doc-invalid-end2.json b/tests/qapi-schema/doc-invalid-end2.qapi
similarity index 100%
rename from tests/qapi-schema/doc-invalid-end2.json
rename to tests/qapi-schema/doc-invalid-end2.qapi
diff --git a/tests/qapi-schema/doc-invalid-return.err b/tests/qapi-schema/doc-invalid-return.err
index 5aaba33bb42..32eb8db5e53 100644
--- a/tests/qapi-schema/doc-invalid-return.err
+++ b/tests/qapi-schema/doc-invalid-return.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-invalid-return.json:3: 'Returns:' is only valid for commands
+tests/qapi-schema/doc-invalid-return.qapi:3: 'Returns:' is only valid for commands
diff --git a/tests/qapi-schema/doc-invalid-return.json b/tests/qapi-schema/doc-invalid-return.qapi
similarity index 100%
rename from tests/qapi-schema/doc-invalid-return.json
rename to tests/qapi-schema/doc-invalid-return.qapi
diff --git a/tests/qapi-schema/doc-invalid-section.err b/tests/qapi-schema/doc-invalid-section.err
index bda93b44fde..810957cfc16 100644
--- a/tests/qapi-schema/doc-invalid-section.err
+++ b/tests/qapi-schema/doc-invalid-section.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-invalid-section.json:5:1: '@note:' not allowed in free-form documentation
+tests/qapi-schema/doc-invalid-section.qapi:5:1: '@note:' not allowed in free-form documentation
diff --git a/tests/qapi-schema/doc-invalid-section.json b/tests/qapi-schema/doc-invalid-section.qapi
similarity index 100%
rename from tests/qapi-schema/doc-invalid-section.json
rename to tests/qapi-schema/doc-invalid-section.qapi
diff --git a/tests/qapi-schema/doc-invalid-start.err b/tests/qapi-schema/doc-invalid-start.err
index 149af2bfacd..08dce5feafe 100644
--- a/tests/qapi-schema/doc-invalid-start.err
+++ b/tests/qapi-schema/doc-invalid-start.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-invalid-start.json:3:1: Junk after '##' at start of documentation comment
+tests/qapi-schema/doc-invalid-start.qapi:3:1: Junk after '##' at start of documentation comment
diff --git a/tests/qapi-schema/doc-invalid-start.json b/tests/qapi-schema/doc-invalid-start.qapi
similarity index 100%
rename from tests/qapi-schema/doc-invalid-start.json
rename to tests/qapi-schema/doc-invalid-start.qapi
diff --git a/tests/qapi-schema/doc-missing-colon.err b/tests/qapi-schema/doc-missing-colon.err
index 817398b8e42..0052605c972 100644
--- a/tests/qapi-schema/doc-missing-colon.err
+++ b/tests/qapi-schema/doc-missing-colon.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-missing-colon.json:4:1: Line should end with :
+tests/qapi-schema/doc-missing-colon.qapi:4:1: Line should end with :
diff --git a/tests/qapi-schema/doc-missing-colon.json b/tests/qapi-schema/doc-missing-colon.qapi
similarity index 100%
rename from tests/qapi-schema/doc-missing-colon.json
rename to tests/qapi-schema/doc-missing-colon.qapi
diff --git a/tests/qapi-schema/doc-missing-expr.err b/tests/qapi-schema/doc-missing-expr.err
index c909e26eca5..d2af40b1c68 100644
--- a/tests/qapi-schema/doc-missing-expr.err
+++ b/tests/qapi-schema/doc-missing-expr.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-missing-expr.json:3: Documentation for 'bar' is not followed by the definition
+tests/qapi-schema/doc-missing-expr.qapi:3: Documentation for 'bar' is not followed by the definition
diff --git a/tests/qapi-schema/doc-missing-expr.json b/tests/qapi-schema/doc-missing-expr.qapi
similarity index 100%
rename from tests/qapi-schema/doc-missing-expr.json
rename to tests/qapi-schema/doc-missing-expr.qapi
diff --git a/tests/qapi-schema/doc-missing-space.err b/tests/qapi-schema/doc-missing-space.err
index d6b46ffd778..756122f26b1 100644
--- a/tests/qapi-schema/doc-missing-space.err
+++ b/tests/qapi-schema/doc-missing-space.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-missing-space.json:5:1: Missing space after #
+tests/qapi-schema/doc-missing-space.qapi:5:1: Missing space after #
diff --git a/tests/qapi-schema/doc-missing-space.json b/tests/qapi-schema/doc-missing-space.qapi
similarity index 100%
rename from tests/qapi-schema/doc-missing-space.json
rename to tests/qapi-schema/doc-missing-space.qapi
diff --git a/tests/qapi-schema/doc-missing.err b/tests/qapi-schema/doc-missing.err
index 7f2f326b30a..2b44937a201 100644
--- a/tests/qapi-schema/doc-missing.err
+++ b/tests/qapi-schema/doc-missing.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-missing.json:5: Expression missing documentation comment
+tests/qapi-schema/doc-missing.qapi:5: Expression missing documentation comment
diff --git a/tests/qapi-schema/doc-missing.json b/tests/qapi-schema/doc-missing.qapi
similarity index 100%
rename from tests/qapi-schema/doc-missing.json
rename to tests/qapi-schema/doc-missing.qapi
diff --git a/tests/qapi-schema/doc-no-symbol.err b/tests/qapi-schema/doc-no-symbol.err
index 75f032a9421..212c1241d7d 100644
--- a/tests/qapi-schema/doc-no-symbol.err
+++ b/tests/qapi-schema/doc-no-symbol.err
@@ -1 +1 @@ 
-tests/qapi-schema/doc-no-symbol.json:3: Expression documentation required
+tests/qapi-schema/doc-no-symbol.qapi:3: Expression documentation required
diff --git a/tests/qapi-schema/doc-no-symbol.json b/tests/qapi-schema/doc-no-symbol.qapi
similarity index 100%
rename from tests/qapi-schema/doc-no-symbol.json
rename to tests/qapi-schema/doc-no-symbol.qapi
diff --git a/tests/qapi-schema/double-data.err b/tests/qapi-schema/double-data.err
index cc765c4ff23..afa6b9ec681 100644
--- a/tests/qapi-schema/double-data.err
+++ b/tests/qapi-schema/double-data.err
@@ -1 +1 @@ 
-tests/qapi-schema/double-data.json:2:41: Duplicate key "data"
+tests/qapi-schema/double-data.qapi:2:41: Duplicate key "data"
diff --git a/tests/qapi-schema/double-data.json b/tests/qapi-schema/double-data.qapi
similarity index 100%
rename from tests/qapi-schema/double-data.json
rename to tests/qapi-schema/double-data.qapi
diff --git a/tests/qapi-schema/double-type.err b/tests/qapi-schema/double-type.err
index f9613c6d6b5..95df26ced22 100644
--- a/tests/qapi-schema/double-type.err
+++ b/tests/qapi-schema/double-type.err
@@ -1 +1 @@ 
-tests/qapi-schema/double-type.json:2: Unknown key 'command' in struct 'bar'
+tests/qapi-schema/double-type.qapi:2: Unknown key 'command' in struct 'bar'
diff --git a/tests/qapi-schema/double-type.json b/tests/qapi-schema/double-type.qapi
similarity index 100%
rename from tests/qapi-schema/double-type.json
rename to tests/qapi-schema/double-type.qapi
diff --git a/tests/qapi-schema/duplicate-key.err b/tests/qapi-schema/duplicate-key.err
index 6d02f835388..2bf72416f56 100644
--- a/tests/qapi-schema/duplicate-key.err
+++ b/tests/qapi-schema/duplicate-key.err
@@ -1 +1 @@ 
-tests/qapi-schema/duplicate-key.json:3:10: Duplicate key "key"
+tests/qapi-schema/duplicate-key.qapi:3:10: Duplicate key "key"
diff --git a/tests/qapi-schema/duplicate-key.json b/tests/qapi-schema/duplicate-key.qapi
similarity index 100%
rename from tests/qapi-schema/duplicate-key.json
rename to tests/qapi-schema/duplicate-key.qapi
diff --git a/tests/qapi-schema/empty.json b/tests/qapi-schema/empty.qapi
similarity index 100%
rename from tests/qapi-schema/empty.json
rename to tests/qapi-schema/empty.qapi
diff --git a/tests/qapi-schema/enum-bad-name.err b/tests/qapi-schema/enum-bad-name.err
index 9c3c1002b78..485965dfb99 100644
--- a/tests/qapi-schema/enum-bad-name.err
+++ b/tests/qapi-schema/enum-bad-name.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-bad-name.json:2: Member of enum 'MyEnum' uses invalid name 'not^possible'
+tests/qapi-schema/enum-bad-name.qapi:2: Member of enum 'MyEnum' uses invalid name 'not^possible'
diff --git a/tests/qapi-schema/enum-bad-name.json b/tests/qapi-schema/enum-bad-name.qapi
similarity index 100%
rename from tests/qapi-schema/enum-bad-name.json
rename to tests/qapi-schema/enum-bad-name.qapi
diff --git a/tests/qapi-schema/enum-bad-prefix.err b/tests/qapi-schema/enum-bad-prefix.err
index 399f5f7af5c..10ef1ca6192 100644
--- a/tests/qapi-schema/enum-bad-prefix.err
+++ b/tests/qapi-schema/enum-bad-prefix.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-bad-prefix.json:2: Enum 'MyEnum' requires a string for 'prefix'
+tests/qapi-schema/enum-bad-prefix.qapi:2: Enum 'MyEnum' requires a string for 'prefix'
diff --git a/tests/qapi-schema/enum-bad-prefix.json b/tests/qapi-schema/enum-bad-prefix.qapi
similarity index 100%
rename from tests/qapi-schema/enum-bad-prefix.json
rename to tests/qapi-schema/enum-bad-prefix.qapi
diff --git a/tests/qapi-schema/enum-clash-member.err b/tests/qapi-schema/enum-clash-member.err
index 5403c785079..3a1b6d95e23 100644
--- a/tests/qapi-schema/enum-clash-member.err
+++ b/tests/qapi-schema/enum-clash-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-clash-member.json:2: 'one_two' (member of MyEnum) collides with 'one-two' (member of MyEnum)
+tests/qapi-schema/enum-clash-member.qapi:2: 'one_two' (member of MyEnum) collides with 'one-two' (member of MyEnum)
diff --git a/tests/qapi-schema/enum-clash-member.json b/tests/qapi-schema/enum-clash-member.qapi
similarity index 100%
rename from tests/qapi-schema/enum-clash-member.json
rename to tests/qapi-schema/enum-clash-member.qapi
diff --git a/tests/qapi-schema/enum-dict-member.err b/tests/qapi-schema/enum-dict-member.err
index 8ca146ea592..e758d0f4de1 100644
--- a/tests/qapi-schema/enum-dict-member.err
+++ b/tests/qapi-schema/enum-dict-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-dict-member.json:2: Member of enum 'MyEnum' requires a string name
+tests/qapi-schema/enum-dict-member.qapi:2: Member of enum 'MyEnum' requires a string name
diff --git a/tests/qapi-schema/enum-dict-member.json b/tests/qapi-schema/enum-dict-member.qapi
similarity index 100%
rename from tests/qapi-schema/enum-dict-member.json
rename to tests/qapi-schema/enum-dict-member.qapi
diff --git a/tests/qapi-schema/enum-int-member.err b/tests/qapi-schema/enum-int-member.err
index 071c5213d8e..25d0034786f 100644
--- a/tests/qapi-schema/enum-int-member.err
+++ b/tests/qapi-schema/enum-int-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-int-member.json:3:31: Stray "1"
+tests/qapi-schema/enum-int-member.qapi:3:31: Stray "1"
diff --git a/tests/qapi-schema/enum-int-member.json b/tests/qapi-schema/enum-int-member.qapi
similarity index 100%
rename from tests/qapi-schema/enum-int-member.json
rename to tests/qapi-schema/enum-int-member.qapi
diff --git a/tests/qapi-schema/enum-member-case.err b/tests/qapi-schema/enum-member-case.err
index 3c67a3a067e..73bb81caf72 100644
--- a/tests/qapi-schema/enum-member-case.err
+++ b/tests/qapi-schema/enum-member-case.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-member-case.json:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
+tests/qapi-schema/enum-member-case.qapi:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
diff --git a/tests/qapi-schema/enum-member-case.json b/tests/qapi-schema/enum-member-case.qapi
similarity index 100%
rename from tests/qapi-schema/enum-member-case.json
rename to tests/qapi-schema/enum-member-case.qapi
diff --git a/tests/qapi-schema/enum-missing-data.err b/tests/qapi-schema/enum-missing-data.err
index ba4873ae69a..ed90e42f0c8 100644
--- a/tests/qapi-schema/enum-missing-data.err
+++ b/tests/qapi-schema/enum-missing-data.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-missing-data.json:2: Key 'data' is missing from enum 'MyEnum'
+tests/qapi-schema/enum-missing-data.qapi:2: Key 'data' is missing from enum 'MyEnum'
diff --git a/tests/qapi-schema/enum-missing-data.json b/tests/qapi-schema/enum-missing-data.qapi
similarity index 100%
rename from tests/qapi-schema/enum-missing-data.json
rename to tests/qapi-schema/enum-missing-data.qapi
diff --git a/tests/qapi-schema/enum-wrong-data.err b/tests/qapi-schema/enum-wrong-data.err
index 11b43471cf3..8cb349fc51a 100644
--- a/tests/qapi-schema/enum-wrong-data.err
+++ b/tests/qapi-schema/enum-wrong-data.err
@@ -1 +1 @@ 
-tests/qapi-schema/enum-wrong-data.json:2: Enum 'MyEnum' requires an array for 'data'
+tests/qapi-schema/enum-wrong-data.qapi:2: Enum 'MyEnum' requires an array for 'data'
diff --git a/tests/qapi-schema/enum-wrong-data.json b/tests/qapi-schema/enum-wrong-data.qapi
similarity index 100%
rename from tests/qapi-schema/enum-wrong-data.json
rename to tests/qapi-schema/enum-wrong-data.qapi
diff --git a/tests/qapi-schema/escape-outside-string.err b/tests/qapi-schema/escape-outside-string.err
index b9b8837fd2e..3e3bcd76f6e 100644
--- a/tests/qapi-schema/escape-outside-string.err
+++ b/tests/qapi-schema/escape-outside-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/escape-outside-string.json:3:27: Stray "\"
+tests/qapi-schema/escape-outside-string.qapi:3:27: Stray "\"
diff --git a/tests/qapi-schema/escape-outside-string.json b/tests/qapi-schema/escape-outside-string.qapi
similarity index 100%
rename from tests/qapi-schema/escape-outside-string.json
rename to tests/qapi-schema/escape-outside-string.qapi
diff --git a/tests/qapi-schema/escape-too-big.err b/tests/qapi-schema/escape-too-big.err
index d9aeb5dc38a..9ade8c10de1 100644
--- a/tests/qapi-schema/escape-too-big.err
+++ b/tests/qapi-schema/escape-too-big.err
@@ -1 +1 @@ 
-tests/qapi-schema/escape-too-big.json:3:14: For now, \u escape only supports non-zero values up to \u007f
+tests/qapi-schema/escape-too-big.qapi:3:14: For now, \u escape only supports non-zero values up to \u007f
diff --git a/tests/qapi-schema/escape-too-big.json b/tests/qapi-schema/escape-too-big.qapi
similarity index 100%
rename from tests/qapi-schema/escape-too-big.json
rename to tests/qapi-schema/escape-too-big.qapi
diff --git a/tests/qapi-schema/escape-too-short.err b/tests/qapi-schema/escape-too-short.err
index 934de598ee2..7c36fe81a54 100644
--- a/tests/qapi-schema/escape-too-short.err
+++ b/tests/qapi-schema/escape-too-short.err
@@ -1 +1 @@ 
-tests/qapi-schema/escape-too-short.json:3:14: \u escape needs 4 hex digits
+tests/qapi-schema/escape-too-short.qapi:3:14: \u escape needs 4 hex digits
diff --git a/tests/qapi-schema/escape-too-short.json b/tests/qapi-schema/escape-too-short.qapi
similarity index 100%
rename from tests/qapi-schema/escape-too-short.json
rename to tests/qapi-schema/escape-too-short.qapi
diff --git a/tests/qapi-schema/event-boxed-empty.err b/tests/qapi-schema/event-boxed-empty.err
index 68ec6f2d2bd..5ae28cd9319 100644
--- a/tests/qapi-schema/event-boxed-empty.err
+++ b/tests/qapi-schema/event-boxed-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/event-boxed-empty.json:2: Use of 'boxed' requires 'data'
+tests/qapi-schema/event-boxed-empty.qapi:2: Use of 'boxed' requires 'data'
diff --git a/tests/qapi-schema/event-boxed-empty.json b/tests/qapi-schema/event-boxed-empty.qapi
similarity index 100%
rename from tests/qapi-schema/event-boxed-empty.json
rename to tests/qapi-schema/event-boxed-empty.qapi
diff --git a/tests/qapi-schema/event-case.out b/tests/qapi-schema/event-case.out
index 88c0964917a..6fbaefb98c3 100644
--- a/tests/qapi-schema/event-case.out
+++ b/tests/qapi-schema/event-case.out
@@ -1,6 +1,6 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module event-case.json
+module event-case.qapi
 event oops None
    boxed=False
diff --git a/tests/qapi-schema/event-case.json b/tests/qapi-schema/event-case.qapi
similarity index 100%
rename from tests/qapi-schema/event-case.json
rename to tests/qapi-schema/event-case.qapi
diff --git a/tests/qapi-schema/event-nest-struct.err b/tests/qapi-schema/event-nest-struct.err
index 5a42701b8f2..7d94765c06f 100644
--- a/tests/qapi-schema/event-nest-struct.err
+++ b/tests/qapi-schema/event-nest-struct.err
@@ -1 +1 @@ 
-tests/qapi-schema/event-nest-struct.json:1: Member 'a' of 'data' for event 'EVENT_A' should be a type name
+tests/qapi-schema/event-nest-struct.qapi:1: Member 'a' of 'data' for event 'EVENT_A' should be a type name
diff --git a/tests/qapi-schema/event-nest-struct.json b/tests/qapi-schema/event-nest-struct.qapi
similarity index 100%
rename from tests/qapi-schema/event-nest-struct.json
rename to tests/qapi-schema/event-nest-struct.qapi
diff --git a/tests/qapi-schema/flat-union-array-branch.err b/tests/qapi-schema/flat-union-array-branch.err
index 8ea91eadb2d..cd767b524c3 100644
--- a/tests/qapi-schema/flat-union-array-branch.err
+++ b/tests/qapi-schema/flat-union-array-branch.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-array-branch.json:8: Member 'value1' of union 'TestUnion' cannot be an array
+tests/qapi-schema/flat-union-array-branch.qapi:8: Member 'value1' of union 'TestUnion' cannot be an array
diff --git a/tests/qapi-schema/flat-union-array-branch.json b/tests/qapi-schema/flat-union-array-branch.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-array-branch.json
rename to tests/qapi-schema/flat-union-array-branch.qapi
diff --git a/tests/qapi-schema/flat-union-bad-base.err b/tests/qapi-schema/flat-union-bad-base.err
index bee24a217ae..e09b8b3cdf0 100644
--- a/tests/qapi-schema/flat-union-bad-base.err
+++ b/tests/qapi-schema/flat-union-bad-base.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-bad-base.json:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
+tests/qapi-schema/flat-union-bad-base.qapi:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
diff --git a/tests/qapi-schema/flat-union-bad-base.json b/tests/qapi-schema/flat-union-bad-base.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-bad-base.json
rename to tests/qapi-schema/flat-union-bad-base.qapi
diff --git a/tests/qapi-schema/flat-union-bad-discriminator.err b/tests/qapi-schema/flat-union-bad-discriminator.err
index c38cc8e4dfd..c2817008c5f 100644
--- a/tests/qapi-schema/flat-union-bad-discriminator.err
+++ b/tests/qapi-schema/flat-union-bad-discriminator.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-bad-discriminator.json:11: Discriminator of flat union 'TestUnion' requires a string name
+tests/qapi-schema/flat-union-bad-discriminator.qapi:11: Discriminator of flat union 'TestUnion' requires a string name
diff --git a/tests/qapi-schema/flat-union-bad-discriminator.json b/tests/qapi-schema/flat-union-bad-discriminator.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-bad-discriminator.json
rename to tests/qapi-schema/flat-union-bad-discriminator.qapi
diff --git a/tests/qapi-schema/flat-union-base-any.err b/tests/qapi-schema/flat-union-base-any.err
index 646f1c9cd11..feed578a29b 100644
--- a/tests/qapi-schema/flat-union-base-any.err
+++ b/tests/qapi-schema/flat-union-base-any.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-base-any.json:8: 'base' for union 'TestUnion' cannot use built-in type 'any'
+tests/qapi-schema/flat-union-base-any.qapi:8: 'base' for union 'TestUnion' cannot use built-in type 'any'
diff --git a/tests/qapi-schema/flat-union-base-any.json b/tests/qapi-schema/flat-union-base-any.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-base-any.json
rename to tests/qapi-schema/flat-union-base-any.qapi
diff --git a/tests/qapi-schema/flat-union-base-union.err b/tests/qapi-schema/flat-union-base-union.err
index f138395e456..9fca152d2c8 100644
--- a/tests/qapi-schema/flat-union-base-union.err
+++ b/tests/qapi-schema/flat-union-base-union.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-base-union.json:14: 'base' for union 'TestUnion' cannot use union type 'UnionBase'
+tests/qapi-schema/flat-union-base-union.qapi:14: 'base' for union 'TestUnion' cannot use union type 'UnionBase'
diff --git a/tests/qapi-schema/flat-union-base-union.json b/tests/qapi-schema/flat-union-base-union.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-base-union.json
rename to tests/qapi-schema/flat-union-base-union.qapi
diff --git a/tests/qapi-schema/flat-union-clash-member.err b/tests/qapi-schema/flat-union-clash-member.err
index 2adf69755ab..bd8dc62222e 100644
--- a/tests/qapi-schema/flat-union-clash-member.err
+++ b/tests/qapi-schema/flat-union-clash-member.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-clash-member.json:11: 'name' (member of Branch1) collides with 'name' (member of Base)
+tests/qapi-schema/flat-union-clash-member.qapi:11: 'name' (member of Branch1) collides with 'name' (member of Base)
diff --git a/tests/qapi-schema/flat-union-clash-member.json b/tests/qapi-schema/flat-union-clash-member.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-clash-member.json
rename to tests/qapi-schema/flat-union-clash-member.qapi
diff --git a/tests/qapi-schema/flat-union-empty.err b/tests/qapi-schema/flat-union-empty.err
index 15754f54eb9..b39f0761e94 100644
--- a/tests/qapi-schema/flat-union-empty.err
+++ b/tests/qapi-schema/flat-union-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-empty.json:4: Union 'Union' cannot have empty 'data'
+tests/qapi-schema/flat-union-empty.qapi:4: Union 'Union' cannot have empty 'data'
diff --git a/tests/qapi-schema/flat-union-empty.json b/tests/qapi-schema/flat-union-empty.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-empty.json
rename to tests/qapi-schema/flat-union-empty.qapi
diff --git a/tests/qapi-schema/flat-union-incomplete-branch.err b/tests/qapi-schema/flat-union-incomplete-branch.err
index e826bf07893..9fe7d2f43cd 100644
--- a/tests/qapi-schema/flat-union-incomplete-branch.err
+++ b/tests/qapi-schema/flat-union-incomplete-branch.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-incomplete-branch.json:6: Union 'TestUnion' data missing 'value2' branch
+tests/qapi-schema/flat-union-incomplete-branch.qapi:6: Union 'TestUnion' data missing 'value2' branch
diff --git a/tests/qapi-schema/flat-union-incomplete-branch.json b/tests/qapi-schema/flat-union-incomplete-branch.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-incomplete-branch.json
rename to tests/qapi-schema/flat-union-incomplete-branch.qapi
diff --git a/tests/qapi-schema/flat-union-inline.err b/tests/qapi-schema/flat-union-inline.err
index 2333358d28b..d16e6cd87c5 100644
--- a/tests/qapi-schema/flat-union-inline.err
+++ b/tests/qapi-schema/flat-union-inline.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-inline.json:7: Member 'value1' of union 'TestUnion' should be a type name
+tests/qapi-schema/flat-union-inline.qapi:7: Member 'value1' of union 'TestUnion' should be a type name
diff --git a/tests/qapi-schema/flat-union-inline.json b/tests/qapi-schema/flat-union-inline.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-inline.json
rename to tests/qapi-schema/flat-union-inline.qapi
diff --git a/tests/qapi-schema/flat-union-int-branch.err b/tests/qapi-schema/flat-union-int-branch.err
index faf01573b79..8baf223a691 100644
--- a/tests/qapi-schema/flat-union-int-branch.err
+++ b/tests/qapi-schema/flat-union-int-branch.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-int-branch.json:8: Member 'value1' of union 'TestUnion' cannot use built-in type 'int'
+tests/qapi-schema/flat-union-int-branch.qapi:8: Member 'value1' of union 'TestUnion' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/flat-union-int-branch.json b/tests/qapi-schema/flat-union-int-branch.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-int-branch.json
rename to tests/qapi-schema/flat-union-int-branch.qapi
diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.err b/tests/qapi-schema/flat-union-invalid-branch-key.err
index ccf72d2dfe2..3dfc7521810 100644
--- a/tests/qapi-schema/flat-union-invalid-branch-key.err
+++ b/tests/qapi-schema/flat-union-invalid-branch-key.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-invalid-branch-key.json:13: Discriminator value 'value_wrong' is not found in enum 'TestEnum'
+tests/qapi-schema/flat-union-invalid-branch-key.qapi:13: Discriminator value 'value_wrong' is not found in enum 'TestEnum'
diff --git a/tests/qapi-schema/flat-union-invalid-branch-key.json b/tests/qapi-schema/flat-union-invalid-branch-key.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-invalid-branch-key.json
rename to tests/qapi-schema/flat-union-invalid-branch-key.qapi
diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.err b/tests/qapi-schema/flat-union-invalid-discriminator.err
index 5f4055614ea..5490a3fa942 100644
--- a/tests/qapi-schema/flat-union-invalid-discriminator.err
+++ b/tests/qapi-schema/flat-union-invalid-discriminator.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-invalid-discriminator.json:13: Discriminator 'enum_wrong' is not a member of base struct 'TestBase'
+tests/qapi-schema/flat-union-invalid-discriminator.qapi:13: Discriminator 'enum_wrong' is not a member of base struct 'TestBase'
diff --git a/tests/qapi-schema/flat-union-invalid-discriminator.json b/tests/qapi-schema/flat-union-invalid-discriminator.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-invalid-discriminator.json
rename to tests/qapi-schema/flat-union-invalid-discriminator.qapi
diff --git a/tests/qapi-schema/flat-union-no-base.err b/tests/qapi-schema/flat-union-no-base.err
index 841c93b5544..b0de89317d8 100644
--- a/tests/qapi-schema/flat-union-no-base.err
+++ b/tests/qapi-schema/flat-union-no-base.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-no-base.json:9: Flat union 'TestUnion' must have a base
+tests/qapi-schema/flat-union-no-base.qapi:9: Flat union 'TestUnion' must have a base
diff --git a/tests/qapi-schema/flat-union-no-base.json b/tests/qapi-schema/flat-union-no-base.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-no-base.json
rename to tests/qapi-schema/flat-union-no-base.qapi
diff --git a/tests/qapi-schema/flat-union-optional-discriminator.err b/tests/qapi-schema/flat-union-optional-discriminator.err
index aaabedb3bd6..d905598456b 100644
--- a/tests/qapi-schema/flat-union-optional-discriminator.err
+++ b/tests/qapi-schema/flat-union-optional-discriminator.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-optional-discriminator.json:6: Discriminator of flat union 'MyUnion' does not allow optional name '*switch'
+tests/qapi-schema/flat-union-optional-discriminator.qapi:6: Discriminator of flat union 'MyUnion' does not allow optional name '*switch'
diff --git a/tests/qapi-schema/flat-union-optional-discriminator.json b/tests/qapi-schema/flat-union-optional-discriminator.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-optional-discriminator.json
rename to tests/qapi-schema/flat-union-optional-discriminator.qapi
diff --git a/tests/qapi-schema/flat-union-string-discriminator.err b/tests/qapi-schema/flat-union-string-discriminator.err
index 200016bd5c5..d8ce54a09f0 100644
--- a/tests/qapi-schema/flat-union-string-discriminator.err
+++ b/tests/qapi-schema/flat-union-string-discriminator.err
@@ -1 +1 @@ 
-tests/qapi-schema/flat-union-string-discriminator.json:13: Discriminator 'kind' must be of enumeration type
+tests/qapi-schema/flat-union-string-discriminator.qapi:13: Discriminator 'kind' must be of enumeration type
diff --git a/tests/qapi-schema/flat-union-string-discriminator.json b/tests/qapi-schema/flat-union-string-discriminator.qapi
similarity index 100%
rename from tests/qapi-schema/flat-union-string-discriminator.json
rename to tests/qapi-schema/flat-union-string-discriminator.qapi
diff --git a/tests/qapi-schema/funny-char.err b/tests/qapi-schema/funny-char.err
index bfc890cd9f2..990b44e1468 100644
--- a/tests/qapi-schema/funny-char.err
+++ b/tests/qapi-schema/funny-char.err
@@ -1 +1 @@ 
-tests/qapi-schema/funny-char.json:2:36: Stray ";"
+tests/qapi-schema/funny-char.qapi:2:36: Stray ";"
diff --git a/tests/qapi-schema/funny-char.json b/tests/qapi-schema/funny-char.qapi
similarity index 100%
rename from tests/qapi-schema/funny-char.json
rename to tests/qapi-schema/funny-char.qapi
diff --git a/tests/qapi-schema/ident-with-escape.out b/tests/qapi-schema/ident-with-escape.out
index 82213aa51dd..3bb7c434340 100644
--- a/tests/qapi-schema/ident-with-escape.out
+++ b/tests/qapi-schema/ident-with-escape.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module ident-with-escape.json
+module ident-with-escape.qapi
 object q_obj_fooA-arg
     member bar1: str optional=False
 command fooA q_obj_fooA-arg -> None
diff --git a/tests/qapi-schema/ident-with-escape.json b/tests/qapi-schema/ident-with-escape.qapi
similarity index 100%
rename from tests/qapi-schema/ident-with-escape.json
rename to tests/qapi-schema/ident-with-escape.qapi
diff --git a/tests/qapi-schema/include-before-err.err b/tests/qapi-schema/include-before-err.err
index 55652751e10..d9f0cf5db10 100644
--- a/tests/qapi-schema/include-before-err.err
+++ b/tests/qapi-schema/include-before-err.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-before-err.json:2:13: Expected ":"
+tests/qapi-schema/include-before-err.qapi:2:13: Expected ":"
diff --git a/tests/qapi-schema/include-before-err.json b/tests/qapi-schema/include-before-err.json
deleted file mode 100644
index afb6cb63c47..00000000000
--- a/tests/qapi-schema/include-before-err.json
+++ /dev/null
@@ -1,2 +0,0 @@ 
-{ 'include': 'include-simple-sub.json' }
-{ 'command' 'missing-colon' }
diff --git a/tests/qapi-schema/include-before-err.qapi b/tests/qapi-schema/include-before-err.qapi
new file mode 100644
index 00000000000..f1e5fa6d417
--- /dev/null
+++ b/tests/qapi-schema/include-before-err.qapi
@@ -0,0 +1,2 @@ 
+{ 'include': 'include-simple-sub.qapi' }
+{ 'command' 'missing-colon' }
diff --git a/tests/qapi-schema/include-cycle-b.json b/tests/qapi-schema/include-cycle-b.json
deleted file mode 100644
index 4fa985dcd59..00000000000
--- a/tests/qapi-schema/include-cycle-b.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-cycle-c.json' }
diff --git a/tests/qapi-schema/include-cycle-b.qapi b/tests/qapi-schema/include-cycle-b.qapi
new file mode 100644
index 00000000000..ef8aa0d8bdb
--- /dev/null
+++ b/tests/qapi-schema/include-cycle-b.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-cycle-c.qapi' }
diff --git a/tests/qapi-schema/include-cycle-c.json b/tests/qapi-schema/include-cycle-c.json
deleted file mode 100644
index d12b5924a36..00000000000
--- a/tests/qapi-schema/include-cycle-c.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-cycle.json' }
diff --git a/tests/qapi-schema/include-cycle-c.qapi b/tests/qapi-schema/include-cycle-c.qapi
new file mode 100644
index 00000000000..dfa26a712ab
--- /dev/null
+++ b/tests/qapi-schema/include-cycle-c.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-cycle.qapi' }
diff --git a/tests/qapi-schema/include-cycle.err b/tests/qapi-schema/include-cycle.err
index bdcd07dce25..99a1ea20fc8 100644
--- a/tests/qapi-schema/include-cycle.err
+++ b/tests/qapi-schema/include-cycle.err
@@ -1,3 +1,3 @@ 
-In file included from tests/qapi-schema/include-cycle.json:1:
-In file included from tests/qapi-schema/include-cycle-b.json:1:
-tests/qapi-schema/include-cycle-c.json:1: Inclusion loop for include-cycle.json
+In file included from tests/qapi-schema/include-cycle.qapi:1:
+In file included from tests/qapi-schema/include-cycle-b.qapi:1:
+tests/qapi-schema/include-cycle-c.qapi:1: Inclusion loop for include-cycle.qapi
diff --git a/tests/qapi-schema/include-cycle.json b/tests/qapi-schema/include-cycle.json
deleted file mode 100644
index 6fcf1ebaac8..00000000000
--- a/tests/qapi-schema/include-cycle.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-cycle-b.json' }
diff --git a/tests/qapi-schema/include-cycle.qapi b/tests/qapi-schema/include-cycle.qapi
new file mode 100644
index 00000000000..9feca30e6de
--- /dev/null
+++ b/tests/qapi-schema/include-cycle.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-cycle-b.qapi' }
diff --git a/tests/qapi-schema/include-extra-junk.err b/tests/qapi-schema/include-extra-junk.err
index e6ef2a3720d..4a98d794483 100644
--- a/tests/qapi-schema/include-extra-junk.err
+++ b/tests/qapi-schema/include-extra-junk.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-extra-junk.json:3: Invalid 'include' directive
+tests/qapi-schema/include-extra-junk.qapi:3: Invalid 'include' directive
diff --git a/tests/qapi-schema/include-extra-junk.json b/tests/qapi-schema/include-extra-junk.json
deleted file mode 100644
index 25fe85078de..00000000000
--- a/tests/qapi-schema/include-extra-junk.json
+++ /dev/null
@@ -1,3 +0,0 @@ 
-# 'include' must be the sole member
-
-{ 'include': 'comments.json', 'junk': true }
diff --git a/tests/qapi-schema/include-extra-junk.qapi b/tests/qapi-schema/include-extra-junk.qapi
new file mode 100644
index 00000000000..609f9d5449f
--- /dev/null
+++ b/tests/qapi-schema/include-extra-junk.qapi
@@ -0,0 +1,3 @@ 
+# 'include' must be the sole member
+
+{ 'include': 'comments.qapi', 'junk': true }
diff --git a/tests/qapi-schema/include-format-err.err b/tests/qapi-schema/include-format-err.err
index 721ff4eccc0..1143089323b 100644
--- a/tests/qapi-schema/include-format-err.err
+++ b/tests/qapi-schema/include-format-err.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-format-err.json:1: Invalid 'include' directive
+tests/qapi-schema/include-format-err.qapi:1: Invalid 'include' directive
diff --git a/tests/qapi-schema/include-format-err.json b/tests/qapi-schema/include-format-err.json
deleted file mode 100644
index 44980f026f8..00000000000
--- a/tests/qapi-schema/include-format-err.json
+++ /dev/null
@@ -1,2 +0,0 @@ 
-{ 'include': 'include-simple-sub.json',
-  'foo': 'bar' }
diff --git a/tests/qapi-schema/include-format-err.qapi b/tests/qapi-schema/include-format-err.qapi
new file mode 100644
index 00000000000..f17f16e6dc3
--- /dev/null
+++ b/tests/qapi-schema/include-format-err.qapi
@@ -0,0 +1,2 @@ 
+{ 'include': 'include-simple-sub.qapi',
+  'foo': 'bar' }
diff --git a/tests/qapi-schema/include-nested-err.err b/tests/qapi-schema/include-nested-err.err
index 1b7b22706be..9a13aa8a802 100644
--- a/tests/qapi-schema/include-nested-err.err
+++ b/tests/qapi-schema/include-nested-err.err
@@ -1,2 +1,2 @@ 
-In file included from tests/qapi-schema/include-nested-err.json:1:
-tests/qapi-schema/missing-colon.json:1:10: Expected ":"
+In file included from tests/qapi-schema/include-nested-err.qapi:1:
+tests/qapi-schema/missing-colon.qapi:1:10: Expected ":"
diff --git a/tests/qapi-schema/include-nested-err.json b/tests/qapi-schema/include-nested-err.json
deleted file mode 100644
index 5631e56ea0d..00000000000
--- a/tests/qapi-schema/include-nested-err.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'missing-colon.json' }
diff --git a/tests/qapi-schema/include-nested-err.qapi b/tests/qapi-schema/include-nested-err.qapi
new file mode 100644
index 00000000000..34b249824fb
--- /dev/null
+++ b/tests/qapi-schema/include-nested-err.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'missing-colon.qapi' }
diff --git a/tests/qapi-schema/include-no-file.err b/tests/qapi-schema/include-no-file.err
index e42bcf4bc1a..770db16793c 100644
--- a/tests/qapi-schema/include-no-file.err
+++ b/tests/qapi-schema/include-no-file.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-no-file.json:1: No such file or directory: tests/qapi-schema/include-no-file-sub.json
+tests/qapi-schema/include-no-file.qapi:1: No such file or directory: tests/qapi-schema/include-no-file-sub.qapi
diff --git a/tests/qapi-schema/include-no-file.json b/tests/qapi-schema/include-no-file.json
deleted file mode 100644
index 9249ebd50c2..00000000000
--- a/tests/qapi-schema/include-no-file.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-no-file-sub.json' }
diff --git a/tests/qapi-schema/include-no-file.qapi b/tests/qapi-schema/include-no-file.qapi
new file mode 100644
index 00000000000..2f0d0633eb5
--- /dev/null
+++ b/tests/qapi-schema/include-no-file.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-no-file-sub.qapi' }
diff --git a/tests/qapi-schema/include-non-file.err b/tests/qapi-schema/include-non-file.err
index faae1eacf1a..5f60d553727 100644
--- a/tests/qapi-schema/include-non-file.err
+++ b/tests/qapi-schema/include-non-file.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-non-file.json:1: Value of 'include' must be a string
+tests/qapi-schema/include-non-file.qapi:1: Value of 'include' must be a string
diff --git a/tests/qapi-schema/include-non-file.json b/tests/qapi-schema/include-non-file.qapi
similarity index 100%
rename from tests/qapi-schema/include-non-file.json
rename to tests/qapi-schema/include-non-file.qapi
diff --git a/tests/qapi-schema/include-relpath-sub.json b/tests/qapi-schema/include-relpath-sub.qapi
similarity index 100%
rename from tests/qapi-schema/include-relpath-sub.json
rename to tests/qapi-schema/include-relpath-sub.qapi
diff --git a/tests/qapi-schema/include-relpath.json b/tests/qapi-schema/include-relpath.json
deleted file mode 100644
index 05018f39083..00000000000
--- a/tests/qapi-schema/include-relpath.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include/relpath.json' }
diff --git a/tests/qapi-schema/include-relpath.out b/tests/qapi-schema/include-relpath.out
index ebbabd7a186..67828f2cebd 100644
--- a/tests/qapi-schema/include-relpath.out
+++ b/tests/qapi-schema/include-relpath.out
@@ -1,9 +1,9 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module include-relpath.json
-include include/relpath.json
-module include/relpath.json
-include include-relpath-sub.json
-module include-relpath-sub.json
+module include-relpath.qapi
+include include/relpath.qapi
+module include/relpath.qapi
+include include-relpath-sub.qapi
+module include-relpath-sub.qapi
 enum Status ['good', 'bad', 'ugly']
diff --git a/tests/qapi-schema/include-relpath.qapi b/tests/qapi-schema/include-relpath.qapi
new file mode 100644
index 00000000000..f4e5205084f
--- /dev/null
+++ b/tests/qapi-schema/include-relpath.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include/relpath.qapi' }
diff --git a/tests/qapi-schema/include-repetition-sub.json b/tests/qapi-schema/include-repetition-sub.json
deleted file mode 100644
index 6bfffdfd556..00000000000
--- a/tests/qapi-schema/include-repetition-sub.json
+++ /dev/null
@@ -1,2 +0,0 @@ 
-{ 'include': 'comments.json' }
-{ 'include': 'comments.json' }
diff --git a/tests/qapi-schema/include-repetition-sub.qapi b/tests/qapi-schema/include-repetition-sub.qapi
new file mode 100644
index 00000000000..92bcc7fab47
--- /dev/null
+++ b/tests/qapi-schema/include-repetition-sub.qapi
@@ -0,0 +1,2 @@ 
+{ 'include': 'comments.qapi' }
+{ 'include': 'comments.qapi' }
diff --git a/tests/qapi-schema/include-repetition.json b/tests/qapi-schema/include-repetition.json
deleted file mode 100644
index ec329dde586..00000000000
--- a/tests/qapi-schema/include-repetition.json
+++ /dev/null
@@ -1,3 +0,0 @@ 
-{ 'include': 'comments.json' }
-{ 'include': 'include-repetition-sub.json' }
-{ 'include': 'comments.json' }
diff --git a/tests/qapi-schema/include-repetition.out b/tests/qapi-schema/include-repetition.out
index 7235e055bc1..6c4c8aec5d8 100644
--- a/tests/qapi-schema/include-repetition.out
+++ b/tests/qapi-schema/include-repetition.out
@@ -1,14 +1,14 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module include-repetition.json
-include comments.json
-module comments.json
+module include-repetition.qapi
+include comments.qapi
+module comments.qapi
 enum Status ['good', 'bad', 'ugly']
-module include-repetition.json
-include include-repetition-sub.json
-module include-repetition-sub.json
-include comments.json
-include comments.json
-module include-repetition.json
-include comments.json
+module include-repetition.qapi
+include include-repetition-sub.qapi
+module include-repetition-sub.qapi
+include comments.qapi
+include comments.qapi
+module include-repetition.qapi
+include comments.qapi
diff --git a/tests/qapi-schema/include-repetition.qapi b/tests/qapi-schema/include-repetition.qapi
new file mode 100644
index 00000000000..7d0dd95c233
--- /dev/null
+++ b/tests/qapi-schema/include-repetition.qapi
@@ -0,0 +1,3 @@ 
+{ 'include': 'comments.qapi' }
+{ 'include': 'include-repetition-sub.qapi' }
+{ 'include': 'comments.qapi' }
diff --git a/tests/qapi-schema/include-self-cycle.err b/tests/qapi-schema/include-self-cycle.err
index 981742ae5f5..7c0f7711777 100644
--- a/tests/qapi-schema/include-self-cycle.err
+++ b/tests/qapi-schema/include-self-cycle.err
@@ -1 +1 @@ 
-tests/qapi-schema/include-self-cycle.json:1: Inclusion loop for include-self-cycle.json
+tests/qapi-schema/include-self-cycle.qapi:1: Inclusion loop for include-self-cycle.qapi
diff --git a/tests/qapi-schema/include-self-cycle.json b/tests/qapi-schema/include-self-cycle.json
deleted file mode 100644
index 55fb1b596fa..00000000000
--- a/tests/qapi-schema/include-self-cycle.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-self-cycle.json' }
diff --git a/tests/qapi-schema/include-self-cycle.qapi b/tests/qapi-schema/include-self-cycle.qapi
new file mode 100644
index 00000000000..8517ba9e202
--- /dev/null
+++ b/tests/qapi-schema/include-self-cycle.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-self-cycle.qapi' }
diff --git a/tests/qapi-schema/include-simple-sub.json b/tests/qapi-schema/include-simple-sub.qapi
similarity index 100%
rename from tests/qapi-schema/include-simple-sub.json
rename to tests/qapi-schema/include-simple-sub.qapi
diff --git a/tests/qapi-schema/include-simple.json b/tests/qapi-schema/include-simple.json
deleted file mode 100644
index 1dd391a5925..00000000000
--- a/tests/qapi-schema/include-simple.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': 'include-simple-sub.json' }
diff --git a/tests/qapi-schema/include-simple.out b/tests/qapi-schema/include-simple.out
index 006f723eebc..3ec2d051c33 100644
--- a/tests/qapi-schema/include-simple.out
+++ b/tests/qapi-schema/include-simple.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module include-simple.json
-include include-simple-sub.json
-module include-simple-sub.json
+module include-simple.qapi
+include include-simple-sub.qapi
+module include-simple-sub.qapi
 enum Status ['good', 'bad', 'ugly']
diff --git a/tests/qapi-schema/include-simple.qapi b/tests/qapi-schema/include-simple.qapi
new file mode 100644
index 00000000000..312aa7ed7f3
--- /dev/null
+++ b/tests/qapi-schema/include-simple.qapi
@@ -0,0 +1 @@ 
+{ 'include': 'include-simple-sub.qapi' }
diff --git a/tests/qapi-schema/include/relpath.json b/tests/qapi-schema/include/relpath.json
deleted file mode 100644
index 45dee247048..00000000000
--- a/tests/qapi-schema/include/relpath.json
+++ /dev/null
@@ -1 +0,0 @@ 
-{ 'include': '../include-relpath-sub.json' }
diff --git a/tests/qapi-schema/include/relpath.qapi b/tests/qapi-schema/include/relpath.qapi
new file mode 100644
index 00000000000..081be90ef70
--- /dev/null
+++ b/tests/qapi-schema/include/relpath.qapi
@@ -0,0 +1 @@ 
+{ 'include': '../include-relpath-sub.qapi' }
diff --git a/tests/qapi-schema/indented-expr.out b/tests/qapi-schema/indented-expr.out
index 862678f8f4c..8c59290610d 100644
--- a/tests/qapi-schema/indented-expr.out
+++ b/tests/qapi-schema/indented-expr.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module indented-expr.json
+module indented-expr.qapi
 command eins None -> None
    gen=True success_response=True boxed=False oob=False
 command zwei None -> None
diff --git a/tests/qapi-schema/indented-expr.json b/tests/qapi-schema/indented-expr.qapi
similarity index 100%
rename from tests/qapi-schema/indented-expr.json
rename to tests/qapi-schema/indented-expr.qapi
diff --git a/tests/qapi-schema/leading-comma-list.err b/tests/qapi-schema/leading-comma-list.err
index f5c870bb9c4..0c8eb27cb5d 100644
--- a/tests/qapi-schema/leading-comma-list.err
+++ b/tests/qapi-schema/leading-comma-list.err
@@ -1 +1 @@ 
-tests/qapi-schema/leading-comma-list.json:2:13: Expected "{", "[", "]", string, boolean or "null"
+tests/qapi-schema/leading-comma-list.qapi:2:13: Expected "{", "[", "]", string, boolean or "null"
diff --git a/tests/qapi-schema/leading-comma-list.json b/tests/qapi-schema/leading-comma-list.qapi
similarity index 100%
rename from tests/qapi-schema/leading-comma-list.json
rename to tests/qapi-schema/leading-comma-list.qapi
diff --git a/tests/qapi-schema/leading-comma-object.err b/tests/qapi-schema/leading-comma-object.err
index f767b95544e..ca86113ddd7 100644
--- a/tests/qapi-schema/leading-comma-object.err
+++ b/tests/qapi-schema/leading-comma-object.err
@@ -1 +1 @@ 
-tests/qapi-schema/leading-comma-object.json:1:3: Expected string or "}"
+tests/qapi-schema/leading-comma-object.qapi:1:3: Expected string or "}"
diff --git a/tests/qapi-schema/leading-comma-object.json b/tests/qapi-schema/leading-comma-object.qapi
similarity index 100%
rename from tests/qapi-schema/leading-comma-object.json
rename to tests/qapi-schema/leading-comma-object.qapi
diff --git a/tests/qapi-schema/missing-colon.err b/tests/qapi-schema/missing-colon.err
index d9d66b377af..0b72b631c4e 100644
--- a/tests/qapi-schema/missing-colon.err
+++ b/tests/qapi-schema/missing-colon.err
@@ -1 +1 @@ 
-tests/qapi-schema/missing-colon.json:1:10: Expected ":"
+tests/qapi-schema/missing-colon.qapi:1:10: Expected ":"
diff --git a/tests/qapi-schema/missing-colon.json b/tests/qapi-schema/missing-colon.qapi
similarity index 100%
rename from tests/qapi-schema/missing-colon.json
rename to tests/qapi-schema/missing-colon.qapi
diff --git a/tests/qapi-schema/missing-comma-list.err b/tests/qapi-schema/missing-comma-list.err
index e73d2770d63..786cd6a95a6 100644
--- a/tests/qapi-schema/missing-comma-list.err
+++ b/tests/qapi-schema/missing-comma-list.err
@@ -1 +1 @@ 
-tests/qapi-schema/missing-comma-list.json:2:20: Expected "," or "]"
+tests/qapi-schema/missing-comma-list.qapi:2:20: Expected "," or "]"
diff --git a/tests/qapi-schema/missing-comma-list.json b/tests/qapi-schema/missing-comma-list.qapi
similarity index 100%
rename from tests/qapi-schema/missing-comma-list.json
rename to tests/qapi-schema/missing-comma-list.qapi
diff --git a/tests/qapi-schema/missing-comma-object.err b/tests/qapi-schema/missing-comma-object.err
index 52b3a8a1ec8..60bf1d014eb 100644
--- a/tests/qapi-schema/missing-comma-object.err
+++ b/tests/qapi-schema/missing-comma-object.err
@@ -1 +1 @@ 
-tests/qapi-schema/missing-comma-object.json:2:3: Expected "," or "}"
+tests/qapi-schema/missing-comma-object.qapi:2:3: Expected "," or "}"
diff --git a/tests/qapi-schema/missing-comma-object.json b/tests/qapi-schema/missing-comma-object.qapi
similarity index 100%
rename from tests/qapi-schema/missing-comma-object.json
rename to tests/qapi-schema/missing-comma-object.qapi
diff --git a/tests/qapi-schema/missing-type.err b/tests/qapi-schema/missing-type.err
index b3e7b14e420..b8cb5d116c4 100644
--- a/tests/qapi-schema/missing-type.err
+++ b/tests/qapi-schema/missing-type.err
@@ -1 +1 @@ 
-tests/qapi-schema/missing-type.json:2: Expression is missing metatype
+tests/qapi-schema/missing-type.qapi:2: Expression is missing metatype
diff --git a/tests/qapi-schema/missing-type.json b/tests/qapi-schema/missing-type.qapi
similarity index 100%
rename from tests/qapi-schema/missing-type.json
rename to tests/qapi-schema/missing-type.qapi
diff --git a/tests/qapi-schema/nested-struct-data.err b/tests/qapi-schema/nested-struct-data.err
index da767bade23..6783e25ecf1 100644
--- a/tests/qapi-schema/nested-struct-data.err
+++ b/tests/qapi-schema/nested-struct-data.err
@@ -1 +1 @@ 
-tests/qapi-schema/nested-struct-data.json:2: Member 'a' of 'data' for command 'foo' should be a type name
+tests/qapi-schema/nested-struct-data.qapi:2: Member 'a' of 'data' for command 'foo' should be a type name
diff --git a/tests/qapi-schema/nested-struct-data.json b/tests/qapi-schema/nested-struct-data.qapi
similarity index 100%
rename from tests/qapi-schema/nested-struct-data.json
rename to tests/qapi-schema/nested-struct-data.qapi
diff --git a/tests/qapi-schema/non-objects.err b/tests/qapi-schema/non-objects.err
index 334f0c91aea..3749ddf5159 100644
--- a/tests/qapi-schema/non-objects.err
+++ b/tests/qapi-schema/non-objects.err
@@ -1 +1 @@ 
-tests/qapi-schema/non-objects.json:1:1: Expected "{"
+tests/qapi-schema/non-objects.qapi:1:1: Expected "{"
diff --git a/tests/qapi-schema/non-objects.json b/tests/qapi-schema/non-objects.qapi
similarity index 100%
rename from tests/qapi-schema/non-objects.json
rename to tests/qapi-schema/non-objects.qapi
diff --git a/tests/qapi-schema/oob-test.err b/tests/qapi-schema/oob-test.err
index 35b60f74800..04ecc0921fb 100644
--- a/tests/qapi-schema/oob-test.err
+++ b/tests/qapi-schema/oob-test.err
@@ -1 +1 @@ 
-tests/qapi-schema/oob-test.json:2: 'allow-oob' of command 'oob-command-1' should only use true value
+tests/qapi-schema/oob-test.qapi:2: 'allow-oob' of command 'oob-command-1' should only use true value
diff --git a/tests/qapi-schema/oob-test.json b/tests/qapi-schema/oob-test.qapi
similarity index 100%
rename from tests/qapi-schema/oob-test.json
rename to tests/qapi-schema/oob-test.qapi
diff --git a/tests/qapi-schema/pragma-doc-required-crap.err b/tests/qapi-schema/pragma-doc-required-crap.err
index 39cd56cd483..08ed951aaf8 100644
--- a/tests/qapi-schema/pragma-doc-required-crap.err
+++ b/tests/qapi-schema/pragma-doc-required-crap.err
@@ -1 +1 @@ 
-tests/qapi-schema/pragma-doc-required-crap.json:3: Pragma 'doc-required' must be boolean
+tests/qapi-schema/pragma-doc-required-crap.qapi:3: Pragma 'doc-required' must be boolean
diff --git a/tests/qapi-schema/pragma-doc-required-crap.json b/tests/qapi-schema/pragma-doc-required-crap.qapi
similarity index 100%
rename from tests/qapi-schema/pragma-doc-required-crap.json
rename to tests/qapi-schema/pragma-doc-required-crap.qapi
diff --git a/tests/qapi-schema/pragma-extra-junk.err b/tests/qapi-schema/pragma-extra-junk.err
index 4481688dbf0..20a8ddc06fa 100644
--- a/tests/qapi-schema/pragma-extra-junk.err
+++ b/tests/qapi-schema/pragma-extra-junk.err
@@ -1 +1 @@ 
-tests/qapi-schema/pragma-extra-junk.json:3: Invalid 'pragma' directive
+tests/qapi-schema/pragma-extra-junk.qapi:3: Invalid 'pragma' directive
diff --git a/tests/qapi-schema/pragma-extra-junk.json b/tests/qapi-schema/pragma-extra-junk.qapi
similarity index 100%
rename from tests/qapi-schema/pragma-extra-junk.json
rename to tests/qapi-schema/pragma-extra-junk.qapi
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.err b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
index f83b97e075a..6f377553683 100644
--- a/tests/qapi-schema/pragma-name-case-whitelist-crap.err
+++ b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
@@ -1 +1 @@ 
-tests/qapi-schema/pragma-name-case-whitelist-crap.json:3: Pragma name-case-whitelist must be a list of strings
+tests/qapi-schema/pragma-name-case-whitelist-crap.qapi:3: Pragma name-case-whitelist must be a list of strings
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.json b/tests/qapi-schema/pragma-name-case-whitelist-crap.qapi
similarity index 100%
rename from tests/qapi-schema/pragma-name-case-whitelist-crap.json
rename to tests/qapi-schema/pragma-name-case-whitelist-crap.qapi
diff --git a/tests/qapi-schema/pragma-non-dict.err b/tests/qapi-schema/pragma-non-dict.err
index 75bc335aea4..d8a31c2ecd1 100644
--- a/tests/qapi-schema/pragma-non-dict.err
+++ b/tests/qapi-schema/pragma-non-dict.err
@@ -1 +1 @@ 
-tests/qapi-schema/pragma-non-dict.json:3: Value of 'pragma' must be a dictionary
+tests/qapi-schema/pragma-non-dict.qapi:3: Value of 'pragma' must be a dictionary
diff --git a/tests/qapi-schema/pragma-non-dict.json b/tests/qapi-schema/pragma-non-dict.qapi
similarity index 100%
rename from tests/qapi-schema/pragma-non-dict.json
rename to tests/qapi-schema/pragma-non-dict.qapi
diff --git a/tests/qapi-schema/pragma-returns-whitelist-crap.err b/tests/qapi-schema/pragma-returns-whitelist-crap.err
index 5d770216749..12926a6d949 100644
--- a/tests/qapi-schema/pragma-returns-whitelist-crap.err
+++ b/tests/qapi-schema/pragma-returns-whitelist-crap.err
@@ -1 +1 @@ 
-tests/qapi-schema/pragma-returns-whitelist-crap.json:3: Pragma returns-whitelist must be a list of strings
+tests/qapi-schema/pragma-returns-whitelist-crap.qapi:3: Pragma returns-whitelist must be a list of strings
diff --git a/tests/qapi-schema/pragma-returns-whitelist-crap.json b/tests/qapi-schema/pragma-returns-whitelist-crap.qapi
similarity index 100%
rename from tests/qapi-schema/pragma-returns-whitelist-crap.json
rename to tests/qapi-schema/pragma-returns-whitelist-crap.qapi
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 467577d770b..672bcda08a6 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -1,7 +1,7 @@ 
 object q_empty
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
-module qapi-schema-test.json
+module qapi-schema-test.qapi
 object TestStruct
     member integer: int optional=False
     member boolean: bool optional=False
diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.qapi
similarity index 100%
rename from tests/qapi-schema/qapi-schema-test.json
rename to tests/qapi-schema/qapi-schema-test.qapi
diff --git a/tests/qapi-schema/quoted-structural-chars.err b/tests/qapi-schema/quoted-structural-chars.err
index 9b183841ddd..33c160b6eb9 100644
--- a/tests/qapi-schema/quoted-structural-chars.err
+++ b/tests/qapi-schema/quoted-structural-chars.err
@@ -1 +1 @@ 
-tests/qapi-schema/quoted-structural-chars.json:1:1: Expected "{"
+tests/qapi-schema/quoted-structural-chars.qapi:1:1: Expected "{"
diff --git a/tests/qapi-schema/quoted-structural-chars.json b/tests/qapi-schema/quoted-structural-chars.qapi
similarity index 100%
rename from tests/qapi-schema/quoted-structural-chars.json
rename to tests/qapi-schema/quoted-structural-chars.qapi
diff --git a/tests/qapi-schema/redefined-builtin.err b/tests/qapi-schema/redefined-builtin.err
index b2757225c4e..45d5eb0b6bf 100644
--- a/tests/qapi-schema/redefined-builtin.err
+++ b/tests/qapi-schema/redefined-builtin.err
@@ -1 +1 @@ 
-tests/qapi-schema/redefined-builtin.json:2: built-in 'size' is already defined
+tests/qapi-schema/redefined-builtin.qapi:2: built-in 'size' is already defined
diff --git a/tests/qapi-schema/redefined-builtin.json b/tests/qapi-schema/redefined-builtin.qapi
similarity index 100%
rename from tests/qapi-schema/redefined-builtin.json
rename to tests/qapi-schema/redefined-builtin.qapi
diff --git a/tests/qapi-schema/redefined-command.err b/tests/qapi-schema/redefined-command.err
index 82ae256e639..e18fa60ee27 100644
--- a/tests/qapi-schema/redefined-command.err
+++ b/tests/qapi-schema/redefined-command.err
@@ -1 +1 @@ 
-tests/qapi-schema/redefined-command.json:3: command 'foo' is already defined
+tests/qapi-schema/redefined-command.qapi:3: command 'foo' is already defined
diff --git a/tests/qapi-schema/redefined-command.json b/tests/qapi-schema/redefined-command.qapi
similarity index 100%
rename from tests/qapi-schema/redefined-command.json
rename to tests/qapi-schema/redefined-command.qapi
diff --git a/tests/qapi-schema/redefined-event.err b/tests/qapi-schema/redefined-event.err
index 35429cb4818..843cb650d91 100644
--- a/tests/qapi-schema/redefined-event.err
+++ b/tests/qapi-schema/redefined-event.err
@@ -1 +1 @@ 
-tests/qapi-schema/redefined-event.json:3: event 'EVENT_A' is already defined
+tests/qapi-schema/redefined-event.qapi:3: event 'EVENT_A' is already defined
diff --git a/tests/qapi-schema/redefined-event.json b/tests/qapi-schema/redefined-event.qapi
similarity index 100%
rename from tests/qapi-schema/redefined-event.json
rename to tests/qapi-schema/redefined-event.qapi
diff --git a/tests/qapi-schema/redefined-type.err b/tests/qapi-schema/redefined-type.err
index 06ea78c4781..67d273c1221 100644
--- a/tests/qapi-schema/redefined-type.err
+++ b/tests/qapi-schema/redefined-type.err
@@ -1 +1 @@ 
-tests/qapi-schema/redefined-type.json:3: struct 'foo' is already defined
+tests/qapi-schema/redefined-type.qapi:3: struct 'foo' is already defined
diff --git a/tests/qapi-schema/redefined-type.json b/tests/qapi-schema/redefined-type.qapi
similarity index 100%
rename from tests/qapi-schema/redefined-type.json
rename to tests/qapi-schema/redefined-type.qapi
diff --git a/tests/qapi-schema/reserved-command-q.err b/tests/qapi-schema/reserved-command-q.err
index f939e044eba..91dd7ed8f08 100644
--- a/tests/qapi-schema/reserved-command-q.err
+++ b/tests/qapi-schema/reserved-command-q.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-command-q.json:5: 'command' uses invalid name 'q-unix'
+tests/qapi-schema/reserved-command-q.qapi:5: 'command' uses invalid name 'q-unix'
diff --git a/tests/qapi-schema/reserved-command-q.json b/tests/qapi-schema/reserved-command-q.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-command-q.json
rename to tests/qapi-schema/reserved-command-q.qapi
diff --git a/tests/qapi-schema/reserved-enum-q.err b/tests/qapi-schema/reserved-enum-q.err
index e1c3480ee22..034c9bd6cfe 100644
--- a/tests/qapi-schema/reserved-enum-q.err
+++ b/tests/qapi-schema/reserved-enum-q.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-enum-q.json:4: Member of enum 'Foo' uses invalid name 'q-Unix'
+tests/qapi-schema/reserved-enum-q.qapi:4: Member of enum 'Foo' uses invalid name 'q-Unix'
diff --git a/tests/qapi-schema/reserved-enum-q.json b/tests/qapi-schema/reserved-enum-q.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-enum-q.json
rename to tests/qapi-schema/reserved-enum-q.qapi
diff --git a/tests/qapi-schema/reserved-member-has.err b/tests/qapi-schema/reserved-member-has.err
index e7557714461..33630aa5689 100644
--- a/tests/qapi-schema/reserved-member-has.err
+++ b/tests/qapi-schema/reserved-member-has.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-member-has.json:5: Member of 'data' for command 'oops' uses reserved name 'has-a'
+tests/qapi-schema/reserved-member-has.qapi:5: Member of 'data' for command 'oops' uses reserved name 'has-a'
diff --git a/tests/qapi-schema/reserved-member-has.json b/tests/qapi-schema/reserved-member-has.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-member-has.json
rename to tests/qapi-schema/reserved-member-has.qapi
diff --git a/tests/qapi-schema/reserved-member-q.err b/tests/qapi-schema/reserved-member-q.err
index f3d5dd78187..6ccd4f0c70f 100644
--- a/tests/qapi-schema/reserved-member-q.err
+++ b/tests/qapi-schema/reserved-member-q.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-member-q.json:4: Member of 'data' for struct 'Foo' uses invalid name 'q-unix'
+tests/qapi-schema/reserved-member-q.qapi:4: Member of 'data' for struct 'Foo' uses invalid name 'q-unix'
diff --git a/tests/qapi-schema/reserved-member-q.json b/tests/qapi-schema/reserved-member-q.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-member-q.json
rename to tests/qapi-schema/reserved-member-q.qapi
diff --git a/tests/qapi-schema/reserved-member-u.err b/tests/qapi-schema/reserved-member-u.err
index 87d42296cc1..2587d3a1548 100644
--- a/tests/qapi-schema/reserved-member-u.err
+++ b/tests/qapi-schema/reserved-member-u.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-member-u.json:7: Member of 'data' for struct 'Oops' uses reserved name 'u'
+tests/qapi-schema/reserved-member-u.qapi:7: Member of 'data' for struct 'Oops' uses reserved name 'u'
diff --git a/tests/qapi-schema/reserved-member-u.json b/tests/qapi-schema/reserved-member-u.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-member-u.json
rename to tests/qapi-schema/reserved-member-u.qapi
diff --git a/tests/qapi-schema/reserved-member-underscore.err b/tests/qapi-schema/reserved-member-underscore.err
index 65ff0da8ce9..6080f0d6baf 100644
--- a/tests/qapi-schema/reserved-member-underscore.err
+++ b/tests/qapi-schema/reserved-member-underscore.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-member-underscore.json:4: Member of 'data' for struct 'Oops' uses invalid name '_oops'
+tests/qapi-schema/reserved-member-underscore.qapi:4: Member of 'data' for struct 'Oops' uses invalid name '_oops'
diff --git a/tests/qapi-schema/reserved-member-underscore.json b/tests/qapi-schema/reserved-member-underscore.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-member-underscore.json
rename to tests/qapi-schema/reserved-member-underscore.qapi
diff --git a/tests/qapi-schema/reserved-type-kind.err b/tests/qapi-schema/reserved-type-kind.err
index 0a38efaad8d..0d2b05f3100 100644
--- a/tests/qapi-schema/reserved-type-kind.err
+++ b/tests/qapi-schema/reserved-type-kind.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-type-kind.json:2: enum 'UnionKind' should not end in 'Kind'
+tests/qapi-schema/reserved-type-kind.qapi:2: enum 'UnionKind' should not end in 'Kind'
diff --git a/tests/qapi-schema/reserved-type-kind.json b/tests/qapi-schema/reserved-type-kind.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-type-kind.json
rename to tests/qapi-schema/reserved-type-kind.qapi
diff --git a/tests/qapi-schema/reserved-type-list.err b/tests/qapi-schema/reserved-type-list.err
index 4510fa6d903..0ee5c659be6 100644
--- a/tests/qapi-schema/reserved-type-list.err
+++ b/tests/qapi-schema/reserved-type-list.err
@@ -1 +1 @@ 
-tests/qapi-schema/reserved-type-list.json:5: struct 'FooList' should not end in 'List'
+tests/qapi-schema/reserved-type-list.qapi:5: struct 'FooList' should not end in 'List'
diff --git a/tests/qapi-schema/reserved-type-list.json b/tests/qapi-schema/reserved-type-list.qapi
similarity index 100%
rename from tests/qapi-schema/reserved-type-list.json
rename to tests/qapi-schema/reserved-type-list.qapi
diff --git a/tests/qapi-schema/returns-alternate.err b/tests/qapi-schema/returns-alternate.err
index dfbb419cac2..a79c0805984 100644
--- a/tests/qapi-schema/returns-alternate.err
+++ b/tests/qapi-schema/returns-alternate.err
@@ -1 +1 @@ 
-tests/qapi-schema/returns-alternate.json:3: 'returns' for command 'oops' cannot use alternate type 'Alt'
+tests/qapi-schema/returns-alternate.qapi:3: 'returns' for command 'oops' cannot use alternate type 'Alt'
diff --git a/tests/qapi-schema/returns-alternate.json b/tests/qapi-schema/returns-alternate.qapi
similarity index 100%
rename from tests/qapi-schema/returns-alternate.json
rename to tests/qapi-schema/returns-alternate.qapi
diff --git a/tests/qapi-schema/returns-array-bad.err b/tests/qapi-schema/returns-array-bad.err
index 138095ccde1..54981ce3846 100644
--- a/tests/qapi-schema/returns-array-bad.err
+++ b/tests/qapi-schema/returns-array-bad.err
@@ -1 +1 @@ 
-tests/qapi-schema/returns-array-bad.json:2: 'returns' for command 'oops': array type must contain single type name
+tests/qapi-schema/returns-array-bad.qapi:2: 'returns' for command 'oops': array type must contain single type name
diff --git a/tests/qapi-schema/returns-array-bad.json b/tests/qapi-schema/returns-array-bad.qapi
similarity index 100%
rename from tests/qapi-schema/returns-array-bad.json
rename to tests/qapi-schema/returns-array-bad.qapi
diff --git a/tests/qapi-schema/returns-dict.err b/tests/qapi-schema/returns-dict.err
index eb2d0c46615..b153bdc74c2 100644
--- a/tests/qapi-schema/returns-dict.err
+++ b/tests/qapi-schema/returns-dict.err
@@ -1 +1 @@ 
-tests/qapi-schema/returns-dict.json:2: 'returns' for command 'oops' should be a type name
+tests/qapi-schema/returns-dict.qapi:2: 'returns' for command 'oops' should be a type name
diff --git a/tests/qapi-schema/returns-dict.json b/tests/qapi-schema/returns-dict.qapi
similarity index 100%
rename from tests/qapi-schema/returns-dict.json
rename to tests/qapi-schema/returns-dict.qapi
diff --git a/tests/qapi-schema/returns-unknown.err b/tests/qapi-schema/returns-unknown.err
index 1f43e3ac9f6..26b9af8344c 100644
--- a/tests/qapi-schema/returns-unknown.err
+++ b/tests/qapi-schema/returns-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/returns-unknown.json:2: 'returns' for command 'oops' uses unknown type 'NoSuchType'
+tests/qapi-schema/returns-unknown.qapi:2: 'returns' for command 'oops' uses unknown type 'NoSuchType'
diff --git a/tests/qapi-schema/returns-unknown.json b/tests/qapi-schema/returns-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/returns-unknown.json
rename to tests/qapi-schema/returns-unknown.qapi
diff --git a/tests/qapi-schema/returns-whitelist.err b/tests/qapi-schema/returns-whitelist.err
index b2ba7a9deba..710fbb2f6f6 100644
--- a/tests/qapi-schema/returns-whitelist.err
+++ b/tests/qapi-schema/returns-whitelist.err
@@ -1 +1 @@ 
-tests/qapi-schema/returns-whitelist.json:14: 'returns' for command 'no-way-this-will-get-whitelisted' cannot use built-in type 'int'
+tests/qapi-schema/returns-whitelist.qapi:14: 'returns' for command 'no-way-this-will-get-whitelisted' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/returns-whitelist.json b/tests/qapi-schema/returns-whitelist.qapi
similarity index 100%
rename from tests/qapi-schema/returns-whitelist.json
rename to tests/qapi-schema/returns-whitelist.qapi
diff --git a/tests/qapi-schema/struct-base-clash-deep.err b/tests/qapi-schema/struct-base-clash-deep.err
index e2d7943f217..c6d7ef0a536 100644
--- a/tests/qapi-schema/struct-base-clash-deep.err
+++ b/tests/qapi-schema/struct-base-clash-deep.err
@@ -1 +1 @@ 
-tests/qapi-schema/struct-base-clash-deep.json:10: 'name' (member of Sub) collides with 'name' (member of Base)
+tests/qapi-schema/struct-base-clash-deep.qapi:10: 'name' (member of Sub) collides with 'name' (member of Base)
diff --git a/tests/qapi-schema/struct-base-clash-deep.json b/tests/qapi-schema/struct-base-clash-deep.qapi
similarity index 100%
rename from tests/qapi-schema/struct-base-clash-deep.json
rename to tests/qapi-schema/struct-base-clash-deep.qapi
diff --git a/tests/qapi-schema/struct-base-clash.err b/tests/qapi-schema/struct-base-clash.err
index c52f33d27bf..de89c0e0b93 100644
--- a/tests/qapi-schema/struct-base-clash.err
+++ b/tests/qapi-schema/struct-base-clash.err
@@ -1 +1 @@ 
-tests/qapi-schema/struct-base-clash.json:5: 'name' (member of Sub) collides with 'name' (member of Base)
+tests/qapi-schema/struct-base-clash.qapi:5: 'name' (member of Sub) collides with 'name' (member of Base)
diff --git a/tests/qapi-schema/struct-base-clash.json b/tests/qapi-schema/struct-base-clash.qapi
similarity index 100%
rename from tests/qapi-schema/struct-base-clash.json
rename to tests/qapi-schema/struct-base-clash.qapi
diff --git a/tests/qapi-schema/struct-data-invalid.err b/tests/qapi-schema/struct-data-invalid.err
index 6644f4c2ad2..84fc1404fa7 100644
--- a/tests/qapi-schema/struct-data-invalid.err
+++ b/tests/qapi-schema/struct-data-invalid.err
@@ -1 +1 @@ 
-tests/qapi-schema/struct-data-invalid.json:1: 'data' for struct 'foo' should be a dictionary or type name
+tests/qapi-schema/struct-data-invalid.qapi:1: 'data' for struct 'foo' should be a dictionary or type name
diff --git a/tests/qapi-schema/struct-data-invalid.json b/tests/qapi-schema/struct-data-invalid.qapi
similarity index 100%
rename from tests/qapi-schema/struct-data-invalid.json
rename to tests/qapi-schema/struct-data-invalid.qapi
diff --git a/tests/qapi-schema/struct-member-invalid.err b/tests/qapi-schema/struct-member-invalid.err
index 69a326d450e..c94c8c6d712 100644
--- a/tests/qapi-schema/struct-member-invalid.err
+++ b/tests/qapi-schema/struct-member-invalid.err
@@ -1 +1 @@ 
-tests/qapi-schema/struct-member-invalid.json:1: Member 'a' of 'data' for struct 'foo' should be a type name
+tests/qapi-schema/struct-member-invalid.qapi:1: Member 'a' of 'data' for struct 'foo' should be a type name
diff --git a/tests/qapi-schema/struct-member-invalid.json b/tests/qapi-schema/struct-member-invalid.qapi
similarity index 100%
rename from tests/qapi-schema/struct-member-invalid.json
rename to tests/qapi-schema/struct-member-invalid.qapi
diff --git a/tests/qapi-schema/trailing-comma-list.err b/tests/qapi-schema/trailing-comma-list.err
index 212e14ae28e..c786b67d2ff 100644
--- a/tests/qapi-schema/trailing-comma-list.err
+++ b/tests/qapi-schema/trailing-comma-list.err
@@ -1 +1 @@ 
-tests/qapi-schema/trailing-comma-list.json:2:36: Expected "{", "[", string, boolean or "null"
+tests/qapi-schema/trailing-comma-list.qapi:2:36: Expected "{", "[", string, boolean or "null"
diff --git a/tests/qapi-schema/trailing-comma-list.json b/tests/qapi-schema/trailing-comma-list.qapi
similarity index 100%
rename from tests/qapi-schema/trailing-comma-list.json
rename to tests/qapi-schema/trailing-comma-list.qapi
diff --git a/tests/qapi-schema/trailing-comma-object.err b/tests/qapi-schema/trailing-comma-object.err
index 30bce5e1945..aff13d63986 100644
--- a/tests/qapi-schema/trailing-comma-object.err
+++ b/tests/qapi-schema/trailing-comma-object.err
@@ -1 +1 @@ 
-tests/qapi-schema/trailing-comma-object.json:2:38: Expected string
+tests/qapi-schema/trailing-comma-object.qapi:2:38: Expected string
diff --git a/tests/qapi-schema/trailing-comma-object.json b/tests/qapi-schema/trailing-comma-object.qapi
similarity index 100%
rename from tests/qapi-schema/trailing-comma-object.json
rename to tests/qapi-schema/trailing-comma-object.qapi
diff --git a/tests/qapi-schema/type-bypass-bad-gen.err b/tests/qapi-schema/type-bypass-bad-gen.err
index a83c3c655de..e617f425b94 100644
--- a/tests/qapi-schema/type-bypass-bad-gen.err
+++ b/tests/qapi-schema/type-bypass-bad-gen.err
@@ -1 +1 @@ 
-tests/qapi-schema/type-bypass-bad-gen.json:2: 'gen' of command 'foo' should only use false value
+tests/qapi-schema/type-bypass-bad-gen.qapi:2: 'gen' of command 'foo' should only use false value
diff --git a/tests/qapi-schema/type-bypass-bad-gen.json b/tests/qapi-schema/type-bypass-bad-gen.qapi
similarity index 100%
rename from tests/qapi-schema/type-bypass-bad-gen.json
rename to tests/qapi-schema/type-bypass-bad-gen.qapi
diff --git a/tests/qapi-schema/unclosed-list.err b/tests/qapi-schema/unclosed-list.err
index fb41a86abd0..3e9bd74f833 100644
--- a/tests/qapi-schema/unclosed-list.err
+++ b/tests/qapi-schema/unclosed-list.err
@@ -1 +1 @@ 
-tests/qapi-schema/unclosed-list.json:1:20: Expected "," or "]"
+tests/qapi-schema/unclosed-list.qapi:1:20: Expected "," or "]"
diff --git a/tests/qapi-schema/unclosed-list.json b/tests/qapi-schema/unclosed-list.qapi
similarity index 100%
rename from tests/qapi-schema/unclosed-list.json
rename to tests/qapi-schema/unclosed-list.qapi
diff --git a/tests/qapi-schema/unclosed-object.err b/tests/qapi-schema/unclosed-object.err
index db3deedd63d..42b5ba1abb6 100644
--- a/tests/qapi-schema/unclosed-object.err
+++ b/tests/qapi-schema/unclosed-object.err
@@ -1 +1 @@ 
-tests/qapi-schema/unclosed-object.json:1:21: Expected "," or "}"
+tests/qapi-schema/unclosed-object.qapi:1:21: Expected "," or "}"
diff --git a/tests/qapi-schema/unclosed-object.json b/tests/qapi-schema/unclosed-object.qapi
similarity index 100%
rename from tests/qapi-schema/unclosed-object.json
rename to tests/qapi-schema/unclosed-object.qapi
diff --git a/tests/qapi-schema/unclosed-string.err b/tests/qapi-schema/unclosed-string.err
index 12b187074e7..fbe5385d6e2 100644
--- a/tests/qapi-schema/unclosed-string.err
+++ b/tests/qapi-schema/unclosed-string.err
@@ -1 +1 @@ 
-tests/qapi-schema/unclosed-string.json:1:11: Missing terminating "'"
+tests/qapi-schema/unclosed-string.qapi:1:11: Missing terminating "'"
diff --git a/tests/qapi-schema/unclosed-string.json b/tests/qapi-schema/unclosed-string.qapi
similarity index 100%
rename from tests/qapi-schema/unclosed-string.json
rename to tests/qapi-schema/unclosed-string.qapi
diff --git a/tests/qapi-schema/unicode-str.err b/tests/qapi-schema/unicode-str.err
index f621cd6448b..9301f12bd0d 100644
--- a/tests/qapi-schema/unicode-str.err
+++ b/tests/qapi-schema/unicode-str.err
@@ -1 +1 @@ 
-tests/qapi-schema/unicode-str.json:2: 'command' uses invalid name 'é'
+tests/qapi-schema/unicode-str.qapi:2: 'command' uses invalid name 'é'
diff --git a/tests/qapi-schema/unicode-str.json b/tests/qapi-schema/unicode-str.qapi
similarity index 100%
rename from tests/qapi-schema/unicode-str.json
rename to tests/qapi-schema/unicode-str.qapi
diff --git a/tests/qapi-schema/union-base-empty.err b/tests/qapi-schema/union-base-empty.err
index 7695806d81a..47dd3d6ac3b 100644
--- a/tests/qapi-schema/union-base-empty.err
+++ b/tests/qapi-schema/union-base-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-base-empty.json:5: Discriminator 'type' is not a member of base struct 'Empty'
+tests/qapi-schema/union-base-empty.qapi:5: Discriminator 'type' is not a member of base struct 'Empty'
diff --git a/tests/qapi-schema/union-base-empty.json b/tests/qapi-schema/union-base-empty.qapi
similarity index 100%
rename from tests/qapi-schema/union-base-empty.json
rename to tests/qapi-schema/union-base-empty.qapi
diff --git a/tests/qapi-schema/union-base-no-discriminator.err b/tests/qapi-schema/union-base-no-discriminator.err
index 8b7a24260ff..e632a4d2649 100644
--- a/tests/qapi-schema/union-base-no-discriminator.err
+++ b/tests/qapi-schema/union-base-no-discriminator.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-base-no-discriminator.json:11: Simple union 'TestUnion' must not have a base
+tests/qapi-schema/union-base-no-discriminator.qapi:11: Simple union 'TestUnion' must not have a base
diff --git a/tests/qapi-schema/union-base-no-discriminator.json b/tests/qapi-schema/union-base-no-discriminator.qapi
similarity index 100%
rename from tests/qapi-schema/union-base-no-discriminator.json
rename to tests/qapi-schema/union-base-no-discriminator.qapi
diff --git a/tests/qapi-schema/union-branch-case.err b/tests/qapi-schema/union-branch-case.err
index 11521901d88..8383a3394fa 100644
--- a/tests/qapi-schema/union-branch-case.err
+++ b/tests/qapi-schema/union-branch-case.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-branch-case.json:2: 'Branch' (branch of NoWayThisWillGetWhitelisted) should not use uppercase
+tests/qapi-schema/union-branch-case.qapi:2: 'Branch' (branch of NoWayThisWillGetWhitelisted) should not use uppercase
diff --git a/tests/qapi-schema/union-branch-case.json b/tests/qapi-schema/union-branch-case.qapi
similarity index 100%
rename from tests/qapi-schema/union-branch-case.json
rename to tests/qapi-schema/union-branch-case.qapi
diff --git a/tests/qapi-schema/union-clash-branches.err b/tests/qapi-schema/union-clash-branches.err
index e5b21135bb8..ee74c202af5 100644
--- a/tests/qapi-schema/union-clash-branches.err
+++ b/tests/qapi-schema/union-clash-branches.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-clash-branches.json:4: 'a_b' (branch of TestUnion) collides with 'a-b' (branch of TestUnion)
+tests/qapi-schema/union-clash-branches.qapi:4: 'a_b' (branch of TestUnion) collides with 'a-b' (branch of TestUnion)
diff --git a/tests/qapi-schema/union-clash-branches.json b/tests/qapi-schema/union-clash-branches.qapi
similarity index 100%
rename from tests/qapi-schema/union-clash-branches.json
rename to tests/qapi-schema/union-clash-branches.qapi
diff --git a/tests/qapi-schema/union-empty.err b/tests/qapi-schema/union-empty.err
index 12c20221bdf..da45ccaf497 100644
--- a/tests/qapi-schema/union-empty.err
+++ b/tests/qapi-schema/union-empty.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-empty.json:2: Union 'Union' cannot have empty 'data'
+tests/qapi-schema/union-empty.qapi:2: Union 'Union' cannot have empty 'data'
diff --git a/tests/qapi-schema/union-empty.json b/tests/qapi-schema/union-empty.qapi
similarity index 100%
rename from tests/qapi-schema/union-empty.json
rename to tests/qapi-schema/union-empty.qapi
diff --git a/tests/qapi-schema/union-invalid-base.err b/tests/qapi-schema/union-invalid-base.err
index 03d7b97a93b..7176a08136e 100644
--- a/tests/qapi-schema/union-invalid-base.err
+++ b/tests/qapi-schema/union-invalid-base.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-invalid-base.json:8: 'base' for union 'TestUnion' cannot use built-in type 'int'
+tests/qapi-schema/union-invalid-base.qapi:8: 'base' for union 'TestUnion' cannot use built-in type 'int'
diff --git a/tests/qapi-schema/union-invalid-base.json b/tests/qapi-schema/union-invalid-base.qapi
similarity index 100%
rename from tests/qapi-schema/union-invalid-base.json
rename to tests/qapi-schema/union-invalid-base.qapi
diff --git a/tests/qapi-schema/union-optional-branch.err b/tests/qapi-schema/union-optional-branch.err
index 3ada1334dc6..1dcb5835cc2 100644
--- a/tests/qapi-schema/union-optional-branch.err
+++ b/tests/qapi-schema/union-optional-branch.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-optional-branch.json:2: Member of union 'Union' does not allow optional name '*a'
+tests/qapi-schema/union-optional-branch.qapi:2: Member of union 'Union' does not allow optional name '*a'
diff --git a/tests/qapi-schema/union-optional-branch.json b/tests/qapi-schema/union-optional-branch.qapi
similarity index 100%
rename from tests/qapi-schema/union-optional-branch.json
rename to tests/qapi-schema/union-optional-branch.qapi
diff --git a/tests/qapi-schema/union-unknown.err b/tests/qapi-schema/union-unknown.err
index 54fe456f9cd..dab37db8b8f 100644
--- a/tests/qapi-schema/union-unknown.err
+++ b/tests/qapi-schema/union-unknown.err
@@ -1 +1 @@ 
-tests/qapi-schema/union-unknown.json:2: Member 'unknown' of union 'Union' uses unknown type 'MissingType'
+tests/qapi-schema/union-unknown.qapi:2: Member 'unknown' of union 'Union' uses unknown type 'MissingType'
diff --git a/tests/qapi-schema/union-unknown.json b/tests/qapi-schema/union-unknown.qapi
similarity index 100%
rename from tests/qapi-schema/union-unknown.json
rename to tests/qapi-schema/union-unknown.qapi
diff --git a/tests/qapi-schema/unknown-escape.err b/tests/qapi-schema/unknown-escape.err
index 000e30ddf33..ad58d0eae97 100644
--- a/tests/qapi-schema/unknown-escape.err
+++ b/tests/qapi-schema/unknown-escape.err
@@ -1 +1 @@ 
-tests/qapi-schema/unknown-escape.json:3:21: Unknown escape \x
+tests/qapi-schema/unknown-escape.qapi:3:21: Unknown escape \x
diff --git a/tests/qapi-schema/unknown-escape.json b/tests/qapi-schema/unknown-escape.qapi
similarity index 100%
rename from tests/qapi-schema/unknown-escape.json
rename to tests/qapi-schema/unknown-escape.qapi
diff --git a/tests/qapi-schema/unknown-expr-key.err b/tests/qapi-schema/unknown-expr-key.err
index 12f5ed5b435..5b8dee56fa0 100644
--- a/tests/qapi-schema/unknown-expr-key.err
+++ b/tests/qapi-schema/unknown-expr-key.err
@@ -1 +1 @@ 
-tests/qapi-schema/unknown-expr-key.json:2: Unknown key 'bogus' in struct 'bar'
+tests/qapi-schema/unknown-expr-key.qapi:2: Unknown key 'bogus' in struct 'bar'
diff --git a/tests/qapi-schema/unknown-expr-key.json b/tests/qapi-schema/unknown-expr-key.qapi
similarity index 100%
rename from tests/qapi-schema/unknown-expr-key.json
rename to tests/qapi-schema/unknown-expr-key.qapi