From: Marc-André Lureau <marcandre.lur...@redhat.com> 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) thanks v7: after Markus review - use is_present() in introspect too - drop now needless "qapi: _make_enum_members() to work with pre-built QAPISchemaIfCond" - add tests to cover more error cases - indentation updates - commit message updates - rebased v6: after Markus review - drop the predicate tree, QAPISchemaIfCond simply holds the original object - introduce the dict operations ('all', 'any', 'not') in multiple patches - split QAPISchemaIfCond introduction in multiple patches - replace __bool__ usage with is_present() - removed __eq__ - move cgen/docgen implementation to common.py - doc & commit message updates - rebased v5: - drop the [ COND, ... ] sugar form - move documentation update as first patch - documentation and commit message tweaks v4: - keep gen_if/gen_endif in common.py, reducing C codegen in schema.py - raise NotImplemented instead of False for unhandled __eq__ - change check_if() to keep the json/raw form, add _make_if() to build a QAPISchemaIfCond - improve __repr__ usage - drop ABC usage - tweaks here and there - add various commit tags 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 (10): docs: update the documentation upfront about schema configuration qapi: wrap Sequence[str] in an object qapi: add QAPISchemaIfCond.is_present() qapi: introduce QAPISchemaIfCond.cgen() qapidoc: introduce QAPISchemaIfCond.docgen() qapi: replace if condition list with dict {'all': [...]} qapi: add 'any' condition qapi: Use 'if': { 'any': ... } where appropriate qapi: add 'not' condition operation qapi: make 'if' condition strings simple identifiers docs/devel/qapi-code-gen.txt | 30 ++++--- docs/sphinx/qapidoc.py | 22 ++--- qapi/block-core.json | 34 ++++---- qapi/block-export.json | 6 +- qapi/char.json | 12 +-- qapi/machine-target.json | 28 +++++-- qapi/migration.json | 10 +-- qapi/misc-target.json | 40 +++++---- qapi/qom.json | 10 +-- qapi/sockets.json | 6 +- qapi/tpm.json | 18 ++--- qapi/ui.json | 66 +++++++-------- qga/qapi-schema.json | 8 +- tests/unit/test-qmp-cmds.c | 1 + scripts/qapi/commands.py | 4 +- scripts/qapi/common.py | 58 ++++++++++--- scripts/qapi/events.py | 5 +- scripts/qapi/expr.py | 55 ++++++++----- scripts/qapi/gen.py | 14 ++-- scripts/qapi/introspect.py | 30 +++---- scripts/qapi/schema.py | 81 +++++++++++++------ scripts/qapi/types.py | 33 ++++---- scripts/qapi/visit.py | 23 +++--- .../alternate-branch-if-invalid.err | 2 +- tests/qapi-schema/bad-if-all.err | 2 + tests/qapi-schema/bad-if-all.json | 3 + tests/qapi-schema/bad-if-all.out | 0 tests/qapi-schema/bad-if-empty-list.json | 2 +- tests/qapi-schema/bad-if-empty.err | 2 +- tests/qapi-schema/bad-if-key.err | 3 + tests/qapi-schema/bad-if-key.json | 3 + tests/qapi-schema/bad-if-key.out | 0 tests/qapi-schema/bad-if-keys.err | 2 + tests/qapi-schema/bad-if-keys.json | 3 + tests/qapi-schema/bad-if-keys.out | 0 tests/qapi-schema/bad-if-list.err | 2 +- tests/qapi-schema/bad-if-list.json | 2 +- tests/qapi-schema/bad-if.err | 2 +- tests/qapi-schema/bad-if.json | 2 +- tests/qapi-schema/doc-good.json | 16 ++-- tests/qapi-schema/doc-good.out | 14 ++-- tests/qapi-schema/doc-good.txt | 21 ++++- 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/meson.build | 3 + tests/qapi-schema/qapi-schema-test.json | 61 +++++++------- tests/qapi-schema/qapi-schema-test.out | 67 ++++++++------- .../qapi-schema/struct-member-if-invalid.err | 2 +- tests/qapi-schema/test-qapi.py | 4 +- tests/qapi-schema/union-branch-if-invalid.err | 2 +- .../qapi-schema/union-branch-if-invalid.json | 2 +- 52 files changed, 493 insertions(+), 330 deletions(-) create mode 100644 tests/qapi-schema/bad-if-all.err create mode 100644 tests/qapi-schema/bad-if-all.json create mode 100644 tests/qapi-schema/bad-if-all.out create mode 100644 tests/qapi-schema/bad-if-key.err create mode 100644 tests/qapi-schema/bad-if-key.json create mode 100644 tests/qapi-schema/bad-if-key.out create mode 100644 tests/qapi-schema/bad-if-keys.err create mode 100644 tests/qapi-schema/bad-if-keys.json create mode 100644 tests/qapi-schema/bad-if-keys.out -- 2.32.0.264.g75ae10bc75