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 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 (11): docs: update the documentation upfront about schema configuration qapi: wrap Sequence[str] in an object qapi: add QAPISchemaIfCond.is_present() qapi: _make_enum_members() to work with pre-built QAPISchemaIfCond qapi: introduce QAPISchemaIfCond.cgen() qapidoc: introduce QAPISchemaIfCond.docgen() qapi: replace if condition list with dict {'all': [...]} qapi: add 'any' condition qapi: convert 'if' C-expressions to the new syntax tree 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 | 16 ++-- 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 | 48 +++++------ 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 | 26 +++--- scripts/qapi/schema.py | 85 +++++++++++++------ scripts/qapi/types.py | 33 +++---- scripts/qapi/visit.py | 23 ++--- .../alternate-branch-if-invalid.err | 2 +- tests/qapi-schema/bad-if-empty-list.json | 2 +- tests/qapi-schema/bad-if-empty.err | 2 +- tests/qapi-schema/bad-if-list.err | 2 +- tests/qapi-schema/bad-if-list.json | 2 +- tests/qapi-schema/bad-if.err | 3 +- tests/qapi-schema/bad-if.json | 2 +- tests/qapi-schema/doc-good.json | 15 ++-- 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/qapi-schema-test.json | 60 +++++++------ 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 +- 42 files changed, 458 insertions(+), 309 deletions(-) -- 2.29.0