diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-09-01 21:01:25 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-09-02 16:07:23 +0000 |
commit | d74d2ed4c2a06197a95e8bf090f3140921729970 (patch) | |
tree | 0cfcb4b2603ecb3d7cf255749c5c4484cd39e2e5 | |
parent | 5358728bd93a6582f98023ba8cf9b6f7783d92af (diff) |
snippets_translate: Refactor handling of casts
Use one non-greedy regexp instead of several ones.
Change-Id: I192476b5f184d22227fdd0e26ec9408098114b0e
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
(cherry picked from commit 6be651a994f1e6564441d8aa51c5c3ed3303b341)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | tools/snippets_translate/handlers.py | 31 | ||||
-rw-r--r-- | tools/snippets_translate/tests/test_converter.py | 4 |
2 files changed, 15 insertions, 20 deletions
diff --git a/tools/snippets_translate/handlers.py b/tools/snippets_translate/handlers.py index 72c70eef8..47307de3b 100644 --- a/tools/snippets_translate/handlers.py +++ b/tools/snippets_translate/handlers.py @@ -46,6 +46,7 @@ from parse_utils import (dstrip, get_indent, get_qt_module_class, IF_PATTERN = re.compile(r'^\s*if\s*\(') ELSE_IF_PATTERN = re.compile(r'^\s*}?\s*else if\s*\(') WHILE_PATTERN = re.compile(r'^\s*while\s*\(') +CAST_PATTERN = re.compile(r"[a-z]+_cast<(.*?)>\((.*?)\)") # Non greedy match of <> def handle_condition(x, name): @@ -93,26 +94,16 @@ def handle_inc_dec(x, operator): def handle_casts(x): - re_type = re.compile(r"<(.*)>") - re_data = re.compile(r"_cast<.*>\((.*)\)") - type_name = re_type.search(x) - data_name = re_data.search(x) - - if type_name and data_name: - type_name = type_name.group(1).replace("*", "") - data_name = data_name.group(1) - new_value = f"{type_name}({data_name})" - - if "static_cast" in x: - x = re.sub(r"static_cast<.*>\(.*\)", new_value, x) - elif "dynamic_cast" in x: - x = re.sub(r"dynamic_cast<.*>\(.*\)", new_value, x) - elif "const_cast" in x: - x = re.sub(r"const_cast<.*>\(.*\)", new_value, x) - elif "reinterpret_cast" in x: - x = re.sub(r"reinterpret_cast<.*>\(.*\)", new_value, x) - elif "qobject_cast" in x: - x = re.sub(r"qobject_cast<.*>\(.*\)", new_value, x) + while True: + match = CAST_PATTERN.search(x) + if not match: + break + type_name = match.group(1).strip() + while type_name.endswith("*") or type_name.endswith("&") or type_name.endswith(" "): + type_name = type_name[:-1] + data_name = match.group(2).strip() + python_cast = f"{type_name}({data_name})" + x = x[0:match.start(0)] + python_cast + x[match.end(0):] return x diff --git a/tools/snippets_translate/tests/test_converter.py b/tools/snippets_translate/tests/test_converter.py index 2c127a7ba..0057159c3 100644 --- a/tools/snippets_translate/tests/test_converter.py +++ b/tools/snippets_translate/tests/test_converter.py @@ -127,6 +127,10 @@ def test_cast(): st("elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;") == "elapsed = (elapsed + QTimer(sender()).interval()) % 1000" ) + assert ( + st("a = qobject_cast<type*>(data) * 9 + static_cast<int>(42)") + == "a = type(data) * 9 + int(42)" + ) def test_double_colon(): |