Skip to content

Commit 64bcd83

Browse files
authored
fix: 🐛 return detection (#515)
* fix: 🐛 return detection The current return detection relies on data from `method_list`, but if a method does not have a statically typed return value, the `return_prop_usage == 131072` check does not appear to catch all return cases. This fix introduces `is_method_returning`, which checks the `func_body_string` for an uncommented `return`. * refactor: ♻️ `return` has to stay alone * refactor: ♻️ return always? * fix: 🐛 missed * fix: 🐛 don't return if `_init()` * fix: 🐛 don't forget `get_hook_check_else_string()`
1 parent a223166 commit 64bcd83

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

addons/mod_loader/internal/mod_hook_preprocessor.gd

+10-11
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ func process_script(path: String, enable_hook_check := false) -> String:
8888
continue
8989

9090
var type_string := get_return_type_string(method.return)
91+
var is_constructor: bool = method.name == "_init"
9192
var is_static := true if method.flags == METHOD_FLAG_STATIC + METHOD_FLAG_NORMAL else false
9293

9394
var func_def: RegExMatch = match_func_with_whitespace(method.name, source_code)
@@ -132,7 +133,7 @@ func process_script(path: String, enable_hook_check := false) -> String:
132133
method_arg_string_names_only,
133134
method_arg_string_with_defaults_and_types,
134135
type_string,
135-
method.return.usage,
136+
is_constructor,
136137
is_static,
137138
is_async,
138139
hook_id,
@@ -346,37 +347,35 @@ static func build_mod_hook_string(
346347
method_arg_string_names_only: String,
347348
method_arg_string_with_defaults_and_types: String,
348349
method_type: String,
349-
return_prop_usage: int,
350+
is_constructor: bool,
350351
is_static: bool,
351352
is_async: bool,
352353
hook_id: int,
353354
method_prefix := METHOD_PREFIX,
354355
enable_hook_check := false,
355356
) -> String:
356357
var type_string := " -> %s" % method_type if not method_type.is_empty() else ""
358+
var return_string := "return " if not is_constructor else ""
357359
var static_string := "static " if is_static else ""
358360
var await_string := "await " if is_async else ""
359361
var async_string := "_async" if is_async else ""
360-
var return_var := "var %s = " % "return_var" if not method_type.is_empty() or return_prop_usage == 131072 else ""
361-
var method_return := "return " if not method_type.is_empty() or return_prop_usage == 131072 else ""
362362
var hook_check := "if ModLoaderStore.any_mod_hooked:\n\t\t" if enable_hook_check else ""
363363
var hook_check_else := get_hook_check_else_string(
364-
method_return, await_string, method_prefix, method_name, method_arg_string_names_only
364+
return_string, await_string, method_prefix, method_name, method_arg_string_names_only
365365
) if enable_hook_check else ""
366366

367367

368368
return """
369369
{STATIC}func {METHOD_NAME}({METHOD_PARAMS}){RETURN_TYPE_STRING}:
370-
{HOOK_CHECK}{METHOD_RETURN}{AWAIT}_ModLoaderHooks.call_hooks{ASYNC}({METHOD_PREFIX}_{METHOD_NAME}, [{METHOD_ARGS}], {HOOK_ID}){HOOK_CHECK_ELSE}
370+
{HOOK_CHECK}{RETURN}{AWAIT}_ModLoaderHooks.call_hooks{ASYNC}({METHOD_PREFIX}_{METHOD_NAME}, [{METHOD_ARGS}], {HOOK_ID}){HOOK_CHECK_ELSE}
371371
""".format({
372372
"METHOD_PREFIX": method_prefix,
373373
"METHOD_NAME": method_name,
374374
"METHOD_PARAMS": method_arg_string_with_defaults_and_types,
375375
"RETURN_TYPE_STRING": type_string,
376376
"METHOD_ARGS": method_arg_string_names_only,
377-
"METHOD_RETURN_VAR": return_var,
378-
"METHOD_RETURN": method_return,
379377
"STATIC": static_string,
378+
"RETURN": return_string,
380379
"AWAIT": await_string,
381380
"ASYNC": async_string,
382381
"HOOK_ID": hook_id,
@@ -472,15 +471,15 @@ func collect_getters_and_setters(text: String) -> Dictionary:
472471

473472

474473
static func get_hook_check_else_string(
475-
method_return: String,
474+
return_string: String,
476475
await_string: String,
477476
method_prefix: String,
478477
method_name: String,
479478
method_arg_string_names_only: String
480479
) -> String:
481-
return "\n\telse:\n\t\t{METHOD_RETURN}{AWAIT}{METHOD_PREFIX}_{METHOD_NAME}({METHOD_ARGS})".format(
480+
return "\n\telse:\n\t\t{RETURN}{AWAIT}{METHOD_PREFIX}_{METHOD_NAME}({METHOD_ARGS})".format(
482481
{
483-
"METHOD_RETURN": method_return,
482+
"RETURN": return_string,
484483
"AWAIT": await_string,
485484
"METHOD_PREFIX": method_prefix,
486485
"METHOD_NAME": method_name,

0 commit comments

Comments
 (0)