aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-05-30 09:56:16 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-05-31 14:05:54 +0000
commit3ab87d496f569af7eebaf5c670f95eea032ccc3b (patch)
tree0ecba1f26e9dd2319206b741583c4cf3c2fbf320
parentbe920de29af70012dcb78ae6f9694c375508431d (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>
-rw-r--r--sources/pyside-tools/metaobjectdump.py42
-rw-r--r--sources/pyside6/tests/tools/metaobjectdump/baseline_property_happybirthdaysong.json1
-rw-r--r--sources/pyside6/tests/tools/metaobjectdump/test_metaobjectdump.py3
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 = []