summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2024-08-22 16:45:18 -0500
committerGitHub <noreply@github.com>2024-08-22 16:45:18 -0500
commit265412cc5359f2c23286377305a993e1daf75c1f (patch)
tree9ddc24b7cb97a178b6b15afaf8b235cfaf19c38e
parent62305943a7d756ec8e93babb143dff618ca7adb0 (diff)
parent9949d09f3eb43827595e8eab8ada0628da77782a (diff)
downloadredot-cpp-265412cc5359f2c23286377305a993e1daf75c1f.tar.gz
Merge pull request #1557 from mihe/cpp-operators
Fix incorrect generation of some C++ operators
-rw-r--r--binding_generator.py44
1 files changed, 38 insertions, 6 deletions
diff --git a/binding_generator.py b/binding_generator.py
index 32d7508..febaaa8 100644
--- a/binding_generator.py
+++ b/binding_generator.py
@@ -872,14 +872,14 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
if "operators" in builtin_api:
for operator in builtin_api["operators"]:
- if operator["name"] not in ["in", "xor"]:
+ if is_valid_cpp_operator(operator["name"]):
if "right_type" in operator:
result.append(
- f'\t{correct_type(operator["return_type"])} operator{operator["name"]}({type_for_parameter(operator["right_type"])}p_other) const;'
+ f'\t{correct_type(operator["return_type"])} operator{get_operator_cpp_name(operator["name"])}({type_for_parameter(operator["right_type"])}p_other) const;'
)
else:
result.append(
- f'\t{correct_type(operator["return_type"])} operator{operator["name"].replace("unary", "")}() const;'
+ f'\t{correct_type(operator["return_type"])} operator{get_operator_cpp_name(operator["name"])}() const;'
)
# Copy assignment.
@@ -1316,10 +1316,10 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
if "operators" in builtin_api:
for operator in builtin_api["operators"]:
- if operator["name"] not in ["in", "xor"]:
+ if is_valid_cpp_operator(operator["name"]):
if "right_type" in operator:
result.append(
- f'{correct_type(operator["return_type"])} {class_name}::operator{operator["name"]}({type_for_parameter(operator["right_type"])}p_other) const {{'
+ f'{correct_type(operator["return_type"])} {class_name}::operator{get_operator_cpp_name(operator["name"])}({type_for_parameter(operator["right_type"])}p_other) const {{'
)
(encode, arg_name) = get_encoded_arg("other", operator["right_type"], None)
result += encode
@@ -1329,7 +1329,7 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
result.append("}")
else:
result.append(
- f'{correct_type(operator["return_type"])} {class_name}::operator{operator["name"].replace("unary", "")}() const {{'
+ f'{correct_type(operator["return_type"])} {class_name}::operator{get_operator_cpp_name(operator["name"])}() const {{'
)
result.append(
f'\treturn internal::_call_builtin_operator_ptr<{get_gdextension_type(correct_type(operator["return_type"]))}>(_method_bindings.operator_{get_operator_id_name(operator["name"])}, (GDExtensionConstTypePtr)&opaque, (GDExtensionConstTypePtr) nullptr);'
@@ -2881,6 +2881,38 @@ def get_operator_id_name(op):
return op_id_map[op]
+def get_operator_cpp_name(op):
+ op_cpp_map = {
+ "==": "==",
+ "!=": "!=",
+ "<": "<",
+ "<=": "<=",
+ ">": ">",
+ ">=": ">=",
+ "+": "+",
+ "-": "-",
+ "*": "*",
+ "/": "/",
+ "unary-": "-",
+ "unary+": "+",
+ "%": "%",
+ "<<": "<<",
+ ">>": ">>",
+ "&": "&",
+ "|": "|",
+ "^": "^",
+ "~": "~",
+ "and": "&&",
+ "or": "||",
+ "not": "!",
+ }
+ return op_cpp_map[op]
+
+
+def is_valid_cpp_operator(op):
+ return op not in ["**", "xor", "in"]
+
+
def get_default_value_for_type(type_name):
if type_name == "int":
return "0"