]> git.proxmox.com Git - mirror_qemu.git/commit
qapi: add qapi2texi script
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Fri, 13 Jan 2017 14:41:29 +0000 (15:41 +0100)
committerMarkus Armbruster <armbru@redhat.com>
Mon, 16 Jan 2017 09:10:35 +0000 (10:10 +0100)
commit3313b6124b524893683311e01437a82b40784e8b
tree47c6f55bdaa126423a94fcba70e4c2314b2ba02f
parent231aaf3a8217443b518221719d1073c08f367225
qapi: add qapi2texi script

As the name suggests, the qapi2texi script converts JSON QAPI
description into a texi file suitable for different target
formats (info/man/txt/pdf/html...).

It parses the following kind of blocks:

Free-form:

  ##
  # = Section
  # == Subsection
  #
  # Some text foo with *emphasis*
  # 1. with a list
  # 2. like that
  #
  # And some code:
  # | $ echo foo
  # | -> do this
  # | <- get that
  #
  ##

Symbol description:

  ##
  # @symbol:
  #
  # Symbol body ditto ergo sum. Foo bar
  # baz ding.
  #
  # @param1: the frob to frobnicate
  # @param2: #optional how hard to frobnicate
  #
  # Returns: the frobnicated frob.
  #          If frob isn't frobnicatable, GenericError.
  #
  # Since: version
  # Notes: notes, comments can have
  #        - itemized list
  #        - like this
  #
  # Example:
  #
  # -> { "execute": "quit" }
  # <- { "return": {} }
  #
  ##

That's roughly following the following EBNF grammar:

api_comment = "##\n" comment "##\n"
comment = freeform_comment | symbol_comment
freeform_comment = { "# " text "\n" | "#\n" }
symbol_comment = "# @" name ":\n" { member | tag_section | freeform_comment }
member = "# @" name ':' [ text ] "\n" freeform_comment
tag_section = "# " ( "Returns:", "Since:", "Note:", "Notes:", "Example:", "Examples:" ) [ text ]  "\n" freeform_comment
text = free text with markup

Note that the grammar is ambiguous: a line "# @foo:\n" can be parsed
both as freeform_comment and as symbol_comment.  The actual parser
recognizes symbol_comment.

See docs/qapi-code-gen.txt for more details.

Deficiencies and limitations:
- the generated QMP documentation includes internal types
- union type support is lacking
- type information is lacking in generated documentation
- doc comment error message positions are imprecise, they point
  to the beginning of the comment.
- a few minor issues, all marked TODO/FIXME in the code

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20170113144135.5150-16-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[test-qapi.py tweaked to avoid trailing empty lines in .out]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
276 files changed:
docs/qapi-code-gen.txt
scripts/qapi.py
scripts/qapi2texi.py [new file with mode: 0755]
tests/Makefile.include
tests/qapi-schema/alternate-any.err
tests/qapi-schema/alternate-any.json
tests/qapi-schema/alternate-array.err
tests/qapi-schema/alternate-array.json
tests/qapi-schema/alternate-base.err
tests/qapi-schema/alternate-base.json
tests/qapi-schema/alternate-clash.err
tests/qapi-schema/alternate-clash.json
tests/qapi-schema/alternate-conflict-dict.err
tests/qapi-schema/alternate-conflict-dict.json
tests/qapi-schema/alternate-conflict-string.err
tests/qapi-schema/alternate-conflict-string.json
tests/qapi-schema/alternate-empty.err
tests/qapi-schema/alternate-empty.json
tests/qapi-schema/alternate-nested.err
tests/qapi-schema/alternate-nested.json
tests/qapi-schema/alternate-unknown.err
tests/qapi-schema/alternate-unknown.json
tests/qapi-schema/args-alternate.err
tests/qapi-schema/args-alternate.json
tests/qapi-schema/args-any.err
tests/qapi-schema/args-any.json
tests/qapi-schema/args-array-empty.err
tests/qapi-schema/args-array-empty.json
tests/qapi-schema/args-array-unknown.err
tests/qapi-schema/args-array-unknown.json
tests/qapi-schema/args-bad-boxed.err
tests/qapi-schema/args-bad-boxed.json
tests/qapi-schema/args-boxed-anon.err
tests/qapi-schema/args-boxed-anon.json
tests/qapi-schema/args-boxed-empty.err
tests/qapi-schema/args-boxed-empty.json
tests/qapi-schema/args-boxed-string.err
tests/qapi-schema/args-boxed-string.json
tests/qapi-schema/args-int.err
tests/qapi-schema/args-int.json
tests/qapi-schema/args-invalid.err
tests/qapi-schema/args-invalid.json
tests/qapi-schema/args-member-array-bad.err
tests/qapi-schema/args-member-array-bad.json
tests/qapi-schema/args-member-case.err
tests/qapi-schema/args-member-case.json
tests/qapi-schema/args-member-unknown.err
tests/qapi-schema/args-member-unknown.json
tests/qapi-schema/args-name-clash.err
tests/qapi-schema/args-name-clash.json
tests/qapi-schema/args-union.err
tests/qapi-schema/args-union.json
tests/qapi-schema/args-unknown.err
tests/qapi-schema/args-unknown.json
tests/qapi-schema/bad-base.err
tests/qapi-schema/bad-base.json
tests/qapi-schema/bad-data.err
tests/qapi-schema/bad-data.json
tests/qapi-schema/bad-ident.err
tests/qapi-schema/bad-ident.json
tests/qapi-schema/bad-type-bool.err
tests/qapi-schema/bad-type-bool.json
tests/qapi-schema/bad-type-dict.err
tests/qapi-schema/bad-type-dict.json
tests/qapi-schema/base-cycle-direct.err
tests/qapi-schema/base-cycle-direct.json
tests/qapi-schema/base-cycle-indirect.err
tests/qapi-schema/base-cycle-indirect.json
tests/qapi-schema/command-int.err
tests/qapi-schema/command-int.json
tests/qapi-schema/comments.json
tests/qapi-schema/comments.out
tests/qapi-schema/doc-bad-args.err [new file with mode: 0644]
tests/qapi-schema/doc-bad-args.exit [new file with mode: 0644]
tests/qapi-schema/doc-bad-args.json [new file with mode: 0644]
tests/qapi-schema/doc-bad-args.out [new file with mode: 0644]
tests/qapi-schema/doc-bad-symbol.err [new file with mode: 0644]
tests/qapi-schema/doc-bad-symbol.exit [new file with mode: 0644]
tests/qapi-schema/doc-bad-symbol.json [new file with mode: 0644]
tests/qapi-schema/doc-bad-symbol.out [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-arg.err [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-arg.exit [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-arg.json [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-arg.out [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-return.err [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-return.exit [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-return.json [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-return.out [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-since.err [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-since.exit [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-since.json [new file with mode: 0644]
tests/qapi-schema/doc-duplicated-since.out [new file with mode: 0644]
tests/qapi-schema/doc-empty-arg.err [new file with mode: 0644]
tests/qapi-schema/doc-empty-arg.exit [new file with mode: 0644]
tests/qapi-schema/doc-empty-arg.json [new file with mode: 0644]
tests/qapi-schema/doc-empty-arg.out [new file with mode: 0644]
tests/qapi-schema/doc-empty-section.err [new file with mode: 0644]
tests/qapi-schema/doc-empty-section.exit [new file with mode: 0644]
tests/qapi-schema/doc-empty-section.json [new file with mode: 0644]
tests/qapi-schema/doc-empty-section.out [new file with mode: 0644]
tests/qapi-schema/doc-empty-symbol.err [new file with mode: 0644]
tests/qapi-schema/doc-empty-symbol.exit [new file with mode: 0644]
tests/qapi-schema/doc-empty-symbol.json [new file with mode: 0644]
tests/qapi-schema/doc-empty-symbol.out [new file with mode: 0644]
tests/qapi-schema/doc-interleaved-section.err [new file with mode: 0644]
tests/qapi-schema/doc-interleaved-section.exit [new file with mode: 0644]
tests/qapi-schema/doc-interleaved-section.json [new file with mode: 0644]
tests/qapi-schema/doc-interleaved-section.out [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end.err [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end.exit [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end.json [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end.out [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end2.err [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end2.exit [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end2.json [new file with mode: 0644]
tests/qapi-schema/doc-invalid-end2.out [new file with mode: 0644]
tests/qapi-schema/doc-invalid-return.err [new file with mode: 0644]
tests/qapi-schema/doc-invalid-return.exit [new file with mode: 0644]
tests/qapi-schema/doc-invalid-return.json [new file with mode: 0644]
tests/qapi-schema/doc-invalid-return.out [new file with mode: 0644]
tests/qapi-schema/doc-invalid-section.err [new file with mode: 0644]
tests/qapi-schema/doc-invalid-section.exit [new file with mode: 0644]
tests/qapi-schema/doc-invalid-section.json [new file with mode: 0644]
tests/qapi-schema/doc-invalid-section.out [new file with mode: 0644]
tests/qapi-schema/doc-invalid-start.err [new file with mode: 0644]
tests/qapi-schema/doc-invalid-start.exit [new file with mode: 0644]
tests/qapi-schema/doc-invalid-start.json [new file with mode: 0644]
tests/qapi-schema/doc-invalid-start.out [new file with mode: 0644]
tests/qapi-schema/doc-missing-colon.err [new file with mode: 0644]
tests/qapi-schema/doc-missing-colon.exit [new file with mode: 0644]
tests/qapi-schema/doc-missing-colon.json [new file with mode: 0644]
tests/qapi-schema/doc-missing-colon.out [new file with mode: 0644]
tests/qapi-schema/doc-missing-expr.err [new file with mode: 0644]
tests/qapi-schema/doc-missing-expr.exit [new file with mode: 0644]
tests/qapi-schema/doc-missing-expr.json [new file with mode: 0644]
tests/qapi-schema/doc-missing-expr.out [new file with mode: 0644]
tests/qapi-schema/doc-missing-space.err [new file with mode: 0644]
tests/qapi-schema/doc-missing-space.exit [new file with mode: 0644]
tests/qapi-schema/doc-missing-space.json [new file with mode: 0644]
tests/qapi-schema/doc-missing-space.out [new file with mode: 0644]
tests/qapi-schema/doc-optional.err [new file with mode: 0644]
tests/qapi-schema/doc-optional.exit [new file with mode: 0644]
tests/qapi-schema/doc-optional.json [new file with mode: 0644]
tests/qapi-schema/doc-optional.out [new file with mode: 0644]
tests/qapi-schema/double-type.err
tests/qapi-schema/double-type.json
tests/qapi-schema/enum-bad-name.err
tests/qapi-schema/enum-bad-name.json
tests/qapi-schema/enum-bad-prefix.err
tests/qapi-schema/enum-bad-prefix.json
tests/qapi-schema/enum-clash-member.err
tests/qapi-schema/enum-clash-member.json
tests/qapi-schema/enum-dict-member.err
tests/qapi-schema/enum-dict-member.json
tests/qapi-schema/enum-member-case.err
tests/qapi-schema/enum-member-case.json
tests/qapi-schema/enum-missing-data.err
tests/qapi-schema/enum-missing-data.json
tests/qapi-schema/enum-wrong-data.err
tests/qapi-schema/enum-wrong-data.json
tests/qapi-schema/event-boxed-empty.err
tests/qapi-schema/event-boxed-empty.json
tests/qapi-schema/event-case.json
tests/qapi-schema/event-case.out
tests/qapi-schema/event-nest-struct.err
tests/qapi-schema/event-nest-struct.json
tests/qapi-schema/flat-union-array-branch.err
tests/qapi-schema/flat-union-array-branch.json
tests/qapi-schema/flat-union-bad-base.err
tests/qapi-schema/flat-union-bad-base.json
tests/qapi-schema/flat-union-bad-discriminator.err
tests/qapi-schema/flat-union-bad-discriminator.json
tests/qapi-schema/flat-union-base-any.err
tests/qapi-schema/flat-union-base-any.json
tests/qapi-schema/flat-union-base-union.err
tests/qapi-schema/flat-union-base-union.json
tests/qapi-schema/flat-union-clash-member.err
tests/qapi-schema/flat-union-clash-member.json
tests/qapi-schema/flat-union-empty.err
tests/qapi-schema/flat-union-empty.json
tests/qapi-schema/flat-union-incomplete-branch.err
tests/qapi-schema/flat-union-incomplete-branch.json
tests/qapi-schema/flat-union-inline.err
tests/qapi-schema/flat-union-inline.json
tests/qapi-schema/flat-union-int-branch.err
tests/qapi-schema/flat-union-int-branch.json
tests/qapi-schema/flat-union-invalid-branch-key.err
tests/qapi-schema/flat-union-invalid-branch-key.json
tests/qapi-schema/flat-union-invalid-discriminator.err
tests/qapi-schema/flat-union-invalid-discriminator.json
tests/qapi-schema/flat-union-no-base.err
tests/qapi-schema/flat-union-no-base.json
tests/qapi-schema/flat-union-optional-discriminator.err
tests/qapi-schema/flat-union-optional-discriminator.json
tests/qapi-schema/flat-union-string-discriminator.err
tests/qapi-schema/flat-union-string-discriminator.json
tests/qapi-schema/ident-with-escape.json
tests/qapi-schema/ident-with-escape.out
tests/qapi-schema/include-relpath-sub.json
tests/qapi-schema/include-relpath.out
tests/qapi-schema/include-repetition.out
tests/qapi-schema/include-simple-sub.json
tests/qapi-schema/include-simple.out
tests/qapi-schema/indented-expr.json
tests/qapi-schema/indented-expr.out
tests/qapi-schema/missing-type.err
tests/qapi-schema/missing-type.json
tests/qapi-schema/nested-struct-data.err
tests/qapi-schema/nested-struct-data.json
tests/qapi-schema/qapi-schema-test.json
tests/qapi-schema/qapi-schema-test.out
tests/qapi-schema/redefined-builtin.err
tests/qapi-schema/redefined-builtin.json
tests/qapi-schema/redefined-command.err
tests/qapi-schema/redefined-command.json
tests/qapi-schema/redefined-event.err
tests/qapi-schema/redefined-event.json
tests/qapi-schema/redefined-type.err
tests/qapi-schema/redefined-type.json
tests/qapi-schema/reserved-command-q.err
tests/qapi-schema/reserved-command-q.json
tests/qapi-schema/reserved-enum-q.err
tests/qapi-schema/reserved-enum-q.json
tests/qapi-schema/reserved-member-has.err
tests/qapi-schema/reserved-member-has.json
tests/qapi-schema/reserved-member-q.err
tests/qapi-schema/reserved-member-q.json
tests/qapi-schema/reserved-member-u.err
tests/qapi-schema/reserved-member-u.json
tests/qapi-schema/reserved-member-underscore.err
tests/qapi-schema/reserved-member-underscore.json
tests/qapi-schema/reserved-type-kind.err
tests/qapi-schema/reserved-type-kind.json
tests/qapi-schema/reserved-type-list.err
tests/qapi-schema/reserved-type-list.json
tests/qapi-schema/returns-alternate.err
tests/qapi-schema/returns-alternate.json
tests/qapi-schema/returns-array-bad.err
tests/qapi-schema/returns-array-bad.json
tests/qapi-schema/returns-dict.err
tests/qapi-schema/returns-dict.json
tests/qapi-schema/returns-unknown.err
tests/qapi-schema/returns-unknown.json
tests/qapi-schema/returns-whitelist.err
tests/qapi-schema/returns-whitelist.json
tests/qapi-schema/struct-base-clash-deep.err
tests/qapi-schema/struct-base-clash-deep.json
tests/qapi-schema/struct-base-clash.err
tests/qapi-schema/struct-base-clash.json
tests/qapi-schema/struct-data-invalid.err
tests/qapi-schema/struct-data-invalid.json
tests/qapi-schema/struct-member-invalid.err
tests/qapi-schema/struct-member-invalid.json
tests/qapi-schema/test-qapi.py
tests/qapi-schema/type-bypass-bad-gen.err
tests/qapi-schema/type-bypass-bad-gen.json
tests/qapi-schema/unicode-str.err
tests/qapi-schema/unicode-str.json
tests/qapi-schema/union-base-no-discriminator.err
tests/qapi-schema/union-base-no-discriminator.json
tests/qapi-schema/union-branch-case.err
tests/qapi-schema/union-branch-case.json
tests/qapi-schema/union-clash-branches.err
tests/qapi-schema/union-clash-branches.json
tests/qapi-schema/union-empty.err
tests/qapi-schema/union-empty.json
tests/qapi-schema/union-invalid-base.err
tests/qapi-schema/union-invalid-base.json
tests/qapi-schema/union-optional-branch.err
tests/qapi-schema/union-optional-branch.json
tests/qapi-schema/union-unknown.err
tests/qapi-schema/union-unknown.json
tests/qapi-schema/unknown-escape.err
tests/qapi-schema/unknown-escape.json
tests/qapi-schema/unknown-expr-key.err
tests/qapi-schema/unknown-expr-key.json