summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/object/object.cpp10
-rw-r--r--core/object/script_language.h3
-rw-r--r--core/object/script_language_extension.cpp1
-rw-r--r--core/object/script_language_extension.h1
-rw-r--r--doc/classes/ScriptExtension.xml6
-rw-r--r--modules/gdscript/gdscript.cpp4
-rw-r--r--modules/gdscript/gdscript.h1
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd12
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out3
9 files changed, 40 insertions, 1 deletions
diff --git a/core/object/object.cpp b/core/object/object.cpp
index f62b93d0ff..eb645b3a92 100644
--- a/core/object/object.cpp
+++ b/core/object/object.cpp
@@ -666,8 +666,16 @@ bool Object::has_method(const StringName &p_method) const {
}
MethodBind *method = ClassDB::get_method(get_class_name(), p_method);
+ if (method != nullptr) {
+ return true;
+ }
- return method != nullptr;
+ const Script *scr = Object::cast_to<Script>(this);
+ if (scr != nullptr) {
+ return scr->has_static_method(p_method);
+ }
+
+ return false;
}
Variant Object::getvar(const Variant &p_key, bool *r_valid) const {
diff --git a/core/object/script_language.h b/core/object/script_language.h
index ca08e9837a..5ff7cd8582 100644
--- a/core/object/script_language.h
+++ b/core/object/script_language.h
@@ -145,7 +145,10 @@ public:
virtual PropertyInfo get_class_category() const;
#endif // TOOLS_ENABLED
+ // TODO: In the next compat breakage rename to `*_script_*` to disambiguate from `Object::has_method()`.
virtual bool has_method(const StringName &p_method) const = 0;
+ virtual bool has_static_method(const StringName &p_method) const { return false; }
+
virtual MethodInfo get_method_info(const StringName &p_method) const = 0;
virtual bool is_tool() const = 0;
diff --git a/core/object/script_language_extension.cpp b/core/object/script_language_extension.cpp
index ce1109781a..a07bf63a02 100644
--- a/core/object/script_language_extension.cpp
+++ b/core/object/script_language_extension.cpp
@@ -55,6 +55,7 @@ void ScriptExtension::_bind_methods() {
GDVIRTUAL_BIND(_get_class_icon_path);
GDVIRTUAL_BIND(_has_method, "method");
+ GDVIRTUAL_BIND(_has_static_method, "method");
GDVIRTUAL_BIND(_get_method_info, "method");
GDVIRTUAL_BIND(_is_tool);
diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h
index beb8064a33..89bba80b90 100644
--- a/core/object/script_language_extension.h
+++ b/core/object/script_language_extension.h
@@ -99,6 +99,7 @@ public:
#endif // TOOLS_ENABLED
EXBIND1RC(bool, has_method, const StringName &)
+ EXBIND1RC(bool, has_static_method, const StringName &)
GDVIRTUAL1RC(Dictionary, _get_method_info, const StringName &)
virtual MethodInfo get_method_info(const StringName &p_method) const override {
diff --git a/doc/classes/ScriptExtension.xml b/doc/classes/ScriptExtension.xml
index 9e96a81f7b..51958a2a2a 100644
--- a/doc/classes/ScriptExtension.xml
+++ b/doc/classes/ScriptExtension.xml
@@ -123,6 +123,12 @@
<description>
</description>
</method>
+ <method name="_has_static_method" qualifiers="virtual const">
+ <return type="bool" />
+ <param index="0" name="method" type="StringName" />
+ <description>
+ </description>
+ </method>
<method name="_inherits_script" qualifiers="virtual const">
<return type="bool" />
<param index="0" name="script" type="Script" />
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index f10ed0df29..a0213f05dd 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -346,6 +346,10 @@ bool GDScript::has_method(const StringName &p_method) const {
return member_functions.has(p_method);
}
+bool GDScript::has_static_method(const StringName &p_method) const {
+ return member_functions.has(p_method) && member_functions[p_method]->is_static();
+}
+
MethodInfo GDScript::get_method_info(const StringName &p_method) const {
HashMap<StringName, GDScriptFunction *>::ConstIterator E = member_functions.find(p_method);
if (!E) {
diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h
index 50ccfabcc1..eb8e95025a 100644
--- a/modules/gdscript/gdscript.h
+++ b/modules/gdscript/gdscript.h
@@ -266,6 +266,7 @@ public:
virtual void get_script_method_list(List<MethodInfo> *p_list) const override;
virtual bool has_method(const StringName &p_method) const override;
+ virtual bool has_static_method(const StringName &p_method) const override;
virtual MethodInfo get_method_info(const StringName &p_method) const override;
virtual void get_script_property_list(List<PropertyInfo> *p_list) const override;
diff --git a/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd
new file mode 100644
index 0000000000..f6aa58737f
--- /dev/null
+++ b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd
@@ -0,0 +1,12 @@
+# GH-79521
+
+class_name TestStaticMethodAsCallable
+
+static func static_func() -> String:
+ return "Test"
+
+func test():
+ var a: Callable = TestStaticMethodAsCallable.static_func
+ var b: Callable = static_func
+ prints(a.call(), a.is_valid())
+ prints(b.call(), b.is_valid())
diff --git a/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out
new file mode 100644
index 0000000000..e6d461b8f9
--- /dev/null
+++ b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out
@@ -0,0 +1,3 @@
+GDTEST_OK
+Test true
+Test true