On Thu, Apr 29, 2021 at 05:40:23PM +0400, marcandre.lureau@redhat.com wrote: > From: Marc-André Lureau > > Hi, > > This series makes the 'if' conditions less liberal, by formalizing a simple > expression tree based on bare boolean logic of configure option identifiers. > > (this allows to express conditions in Rust in my QAPI-Rust PoC series) > > This is based on John Snow QAPI pt4: > https://patchew.org/QEMU/20210421192233.3542904-1-jsnow@redhat.com/ > > Based-on: <20210421192233.3542904-2-jsnow@redhat.com> > > thanks > > v3: > - rebasing on queued pt4 (after waiting for it to land) > - improve documentation generation, to be more human-friendly > - drop typing annotations from schema.py (not yet queued) > - commit message tweaks > > v2: > - fix the normalization step to handle recursive expr > - replace IfCond by QAPISchemaIf (JohnS) > - commit message and documentation tweaks > - mypy/flake8/isort > > Marc-André Lureau (9): > qapi: replace List[str] by QAPISchemaIfCond > qapi: move gen_if/gen_endif to QAPISchemaIfCond > qapi: start building an 'if' predicate tree > qapi: introduce IfPredicateList and IfAny > qapi: add IfNot > qapi: normalize 'if' condition to IfPredicate tree > qapi: convert 'if' C-expressions to the new syntax tree > qapi: make 'if' condition strings simple identifiers > docs: update the documentation about schema configuration > > docs/devel/qapi-code-gen.txt | 33 +++--- > docs/sphinx/qapidoc.py | 6 +- > qapi/block-core.json | 16 +-- > qapi/block-export.json | 6 +- > qapi/char.json | 8 +- > qapi/machine-target.json | 28 +++-- > qapi/migration.json | 10 +- > qapi/misc-target.json | 37 +++--- > qapi/qom.json | 10 +- > qapi/sockets.json | 4 +- > qapi/ui.json | 48 ++++---- > qga/qapi-schema.json | 8 +- > tests/unit/test-qmp-cmds.c | 1 + > scripts/qapi/commands.py | 4 +- > scripts/qapi/common.py | 106 +++++++++++++++--- > scripts/qapi/events.py | 5 +- > scripts/qapi/expr.py | 62 +++++++--- > scripts/qapi/gen.py | 16 ++- > scripts/qapi/introspect.py | 33 +++--- > scripts/qapi/schema.py | 99 ++++++++++++---- > scripts/qapi/types.py | 43 ++++--- > scripts/qapi/visit.py | 25 ++--- > .../alternate-branch-if-invalid.err | 2 +- > tests/qapi-schema/bad-if-empty.err | 2 +- > tests/qapi-schema/bad-if-list.err | 2 +- > tests/qapi-schema/bad-if.err | 3 +- > tests/qapi-schema/bad-if.json | 2 +- > tests/qapi-schema/doc-good.json | 6 +- > tests/qapi-schema/doc-good.out | 12 +- > tests/qapi-schema/doc-good.txt | 6 +- > tests/qapi-schema/enum-if-invalid.err | 3 +- > tests/qapi-schema/features-if-invalid.err | 2 +- > tests/qapi-schema/features-missing-name.json | 2 +- > tests/qapi-schema/qapi-schema-test.json | 58 +++++----- > tests/qapi-schema/qapi-schema-test.out | 67 ++++++----- > .../qapi-schema/struct-member-if-invalid.err | 2 +- > tests/qapi-schema/union-branch-if-invalid.err | 2 +- > 37 files changed, 482 insertions(+), 297 deletions(-) > > -- > 2.29.0 > > > Please double-check that the build and tests pass after each commit (for bisectability). I'm not familiar with the details of the QAPI code generator but in overall this looks like a nice step: Reviewed-by: Stefan Hajnoczi