diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-05-30 09:56:16 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-05-31 14:05:54 +0000 |
commit | 3ab87d496f569af7eebaf5c670f95eea032ccc3b (patch) | |
tree | 0ecba1f26e9dd2319206b741583c4cf3c2fbf320 | |
parent | be920de29af70012dcb78ae6f9694c375508431d (diff) |
metaobjectdump.py: Implement slots
Extract helper functions from the Signal handling code to parse @Slot.
Fixes: PYSIDE-2347
Change-Id: I1c12becad43e7915a63bd3068c7ec71d498c380f
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
(cherry picked from commit 909c375f86dac0e4b743cbd43e81ad97e5b1dedf)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 36 insertions, 10 deletions
diff --git a/sources/pyside-tools/metaobjectdump.py b/sources/pyside-tools/metaobjectdump.py index 147a99f60..bc84708cb 100644 --- a/sources/pyside-tools/metaobjectdump.py +++ b/sources/pyside-tools/metaobjectdump.py @@ -46,9 +46,10 @@ ClassList = List[dict] PropertyEntry = Dict[str, Union[str, int, bool]] -SignalArgument = Dict[str, str] -SignalArguments = List[SignalArgument] -Signal = Dict[str, Union[str, SignalArguments]] +Argument = Dict[str, str] +Arguments = List[Argument] +Signal = Dict[str, Union[str, Arguments]] +Slot = Dict[str, Union[str, Arguments]] def _decorator(name: str, value: str) -> Dict[str, str]: @@ -95,6 +96,28 @@ def _parse_assignment(node: ast.Assign) -> Tuple[Optional[str], Optional[ast.AST return (None, None) +def _parse_call_args(call: ast.Call): + """Parse arguments of a Signal call/Slot decorator (type list).""" + result: Arguments = [] + for n, arg in enumerate(call.args): + par_name = f"a{n+1}" + par_type = _python_to_cpp_type(_name(arg)) + result.append({"name": par_name, "type": par_type}) + return result + + +def _parse_slot(func_name: str, call: ast.Call) -> Slot: + """Parse a 'Slot' decorator.""" + return_type = "void" + for kwarg in call.keywords: + if kwarg.arg == "result": + return_type = _python_to_cpp_type(_name(kwarg.value)) + break + return {"access": "public", "name": func_name, + "arguments": _parse_call_args(call), + "returnType": return_type} + + class VisitorContext: """Stores a list of QObject-derived classes encountered in order to find out which classes inherit QObject.""" @@ -157,6 +180,7 @@ class MetaObjectDumpVisitor(ast.NodeVisitor): """Visit a class definition""" self._properties = [] self._signals = [] + self._slots = [] self._within_class = True qualified_name = node.name last_dot = qualified_name.rfind('.') @@ -201,6 +225,9 @@ class MetaObjectDumpVisitor(ast.NodeVisitor): if self._signals: data["signals"] = self._signals + if self._slots: + data["slots"] = self._slots + self._json_class_list.append(data) self._within_class = False @@ -291,7 +318,7 @@ class MetaObjectDumpVisitor(ast.NodeVisitor): _parse_property_kwargs(node.keywords, prop) self._properties.append(prop) elif name == "Slot": - pass + self._slots.append(_parse_slot(func_name, node)) else: print('Unknown decorator with parameters:', name, file=sys.stderr) @@ -303,13 +330,8 @@ class MetaObjectDumpVisitor(ast.NodeVisitor): return func_name = _func_name(call) if func_name == "Signal" or func_name == "QtCore.Signal": - arguments: SignalArguments = [] - for n, arg in enumerate(call.args): - par_name = f"a{n+1}" - par_type = _python_to_cpp_type(_name(arg)) - arguments.append({"name": par_name, "type": par_type}) signal: Signal = {"access": "public", "name": var_name, - "arguments": arguments, + "arguments": _parse_call_args(call), "returnType": "void"} self._signals.append(signal) elif func_name == "Property" or func_name == "QtCore.Property": diff --git a/sources/pyside6/tests/tools/metaobjectdump/baseline_property_happybirthdaysong.json b/sources/pyside6/tests/tools/metaobjectdump/baseline_property_happybirthdaysong.json new file mode 100644 index 000000000..c009111b7 --- /dev/null +++ b/sources/pyside6/tests/tools/metaobjectdump/baseline_property_happybirthdaysong.json @@ -0,0 +1 @@ +[{"classes": [{"className": "HappyBirthdaySong", "qualifiedClassName": "HappyBirthdaySong", "object": false, "superClasses": [{"access": "public", "name": "QPyQmlPropertyValueSource"}], "classInfos": [{"name": "QML.Element", "value": "auto"}], "properties": [{"name": "name", "type": "QString", "index": 0, "read": "name", "notify": "name_changed", "write": "name"}], "signals": [{"access": "public", "name": "name_changed", "arguments": [], "returnType": "void"}], "slots": [{"access": "public", "name": "advance", "arguments": [], "returnType": "void"}]}], "outputRevision": 68, "QML_IMPORT_NAME": "People", "QML_IMPORT_MAJOR_VERSION": 1, "QML_IMPORT_MINOR_VERSION": 0, "QT_MODULES": ["QtCore", "QtQml"]}]
\ No newline at end of file diff --git a/sources/pyside6/tests/tools/metaobjectdump/test_metaobjectdump.py b/sources/pyside6/tests/tools/metaobjectdump/test_metaobjectdump.py index 5234becc2..5e7412bf5 100644 --- a/sources/pyside6/tests/tools/metaobjectdump/test_metaobjectdump.py +++ b/sources/pyside6/tests/tools/metaobjectdump/test_metaobjectdump.py @@ -38,6 +38,9 @@ class TestMetaObjectDump(unittest.TestCase): example_dir = self._examples_dir / d examples.append(example_dir / "birthdayparty.py") examples.append(example_dir / "person.py") + # Example with slot + examples.append(self._examples_dir / "advanced6-Property-value-source" + / "happybirthdaysong.py") metaobjectdump_cmd_root = [sys.executable, os.fspath(self._metaobjectdump_tool), "-c", "-s"] self._examples = [] |