aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-09-19 14:40:37 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-09-21 10:01:15 +0200
commit68883026da79c4f380411237731d761429760c23 (patch)
treec8e79f30cf02350eb983ab1898964eb276566a3a /tools
parent2a3c2d88940e44c658e1a54e9834765683c127ff (diff)
snippets_translate: Fix handling of operator new, take 2
Change e48dce39c1450e73f7cdef58cfeba29e1c3b8be3 introduced a bug appending "()" to member initalizer lists "m_member(new X()),". Fix that by using a regexp to loop through the expressions. Pick-to: 6.3 Change-Id: I6ce095749bcab74e92fb6dd630f25fb9fd517cc5 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'tools')
-rw-r--r--tools/snippets_translate/converter.py5
-rw-r--r--tools/snippets_translate/handlers.py18
-rw-r--r--tools/snippets_translate/tests/test_converter.py4
3 files changed, 24 insertions, 3 deletions
diff --git a/tools/snippets_translate/converter.py b/tools/snippets_translate/converter.py
index 1586d7d41..93aab199f 100644
--- a/tools/snippets_translate/converter.py
+++ b/tools/snippets_translate/converter.py
@@ -10,6 +10,7 @@ from handlers import (handle_array_declarations, handle_casts, handle_class,
handle_inc_dec, handle_include, handle_keywords,
handle_methods_return_type, handle_negate,
handle_type_var_declaration, handle_useless_qt_classes,
+ handle_new,
handle_void_functions, handle_qt_connects)
from parse_utils import dstrip, get_indent, remove_ref
@@ -93,9 +94,7 @@ def snippet_translate(x):
# This contains an extra whitespace because of some variables
# that include the string 'new'
if "new " in x:
- x = x.replace("new ", "")
- if not x.endswith(")"): # "new Foo" -> "new Foo()"
- x += "()"
+ x = handle_new(x)
# Handle 'const'
# Some variables/functions have the word 'const' so we explicitly
diff --git a/tools/snippets_translate/handlers.py b/tools/snippets_translate/handlers.py
index 05c3cfba1..57b00e9da 100644
--- a/tools/snippets_translate/handlers.py
+++ b/tools/snippets_translate/handlers.py
@@ -39,6 +39,7 @@ COUT_ENDL_PATTERN = re.compile(r"cout *<<(.*)<< *.*endl")
COUT1_PATTERN = re.compile(r" *<< *")
COUT2_PATTERN = re.compile(r".*cout *<<")
COUT_ENDL2_PATTERN = re.compile(r"<< +endl")
+NEW_PATTERN = re.compile(r"new +([a-zA-Z][a-zA-Z0-9_]*)")
def handle_condition(x, name):
@@ -512,6 +513,23 @@ def handle_useless_qt_classes(x):
return x
+def handle_new(x):
+ """Parse operator new() and add parentheses were needed:
+ func(new Foo, new Bar(x))" -> "func(Foo(), Bar(x))"""
+ result = ""
+ last_pos = 0
+ for match in NEW_PATTERN.finditer(x):
+ end = match.end(0)
+ parentheses_needed = end >= len(x) or x[end] != "("
+ type_name = match.group(1)
+ result += x[last_pos:match.start(0)] + type_name
+ if parentheses_needed:
+ result += "()"
+ last_pos = end
+ result += x[last_pos:]
+ return result
+
+
# The code below handles pairs of instance/pointer to member functions (PMF)
# which appear in Qt in connect statements like:
# "connect(fontButton, &QAbstractButton::clicked, this, &Dialog::setFont)".
diff --git a/tools/snippets_translate/tests/test_converter.py b/tools/snippets_translate/tests/test_converter.py
index cf313749d..a1f9fe834 100644
--- a/tools/snippets_translate/tests/test_converter.py
+++ b/tools/snippets_translate/tests/test_converter.py
@@ -65,6 +65,10 @@ def test_else():
def test_new():
assert st("a = new Something(...);") == "a = Something(...)"
assert st("a = new Something") == "a = Something()"
+ assert st("foo(new X, new Y(b), new Z)") == "foo(X(), Y(b), Z())"
+ # Class member initialization list
+ assert st("m_mem(new Something(p)),") == "m_mem(Something(p)),"
+ assert st("m_mem(new Something),") == "m_mem(Something()),"
def test_semicolon():