diff options
Diffstat (limited to 'core/object/script_language_extension.h')
-rw-r--r-- | core/object/script_language_extension.h | 85 |
1 files changed, 79 insertions, 6 deletions
diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h index 1a0ec29479..00ab1cd6c0 100644 --- a/core/object/script_language_extension.h +++ b/core/object/script_language_extension.h @@ -77,6 +77,7 @@ public: EXBIND1R(Error, reload, bool) GDVIRTUAL0RC(TypedArray<Dictionary>, _get_documentation) + GDVIRTUAL0RC(String, _get_class_icon_path) #ifdef TOOLS_ENABLED virtual Vector<DocData::ClassDoc> get_documentation() const override { TypedArray<Dictionary> doc; @@ -89,9 +90,16 @@ public: return class_doc; } + + virtual String get_class_icon_path() const override { + String ret; + GDVIRTUAL_CALL(_get_class_icon_path, ret); + return ret; + } #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 { @@ -103,6 +111,12 @@ public: EXBIND0RC(bool, is_tool) EXBIND0RC(bool, is_valid) + virtual bool is_abstract() const override { + bool abst; + return GDVIRTUAL_CALL(_is_abstract, abst) && abst; + } + GDVIRTUAL0RC(bool, _is_abstract) + EXBIND0RC(ScriptLanguage *, get_language) EXBIND1RC(bool, has_script_signal, const StringName &) @@ -227,6 +241,16 @@ public: } } + GDVIRTUAL0RC(Vector<String>, _get_doc_comment_delimiters) + + virtual void get_doc_comment_delimiters(List<String> *p_words) const override { + Vector<String> ret; + GDVIRTUAL_CALL(_get_doc_comment_delimiters, ret); + for (int i = 0; i < ret.size(); i++) { + p_words->push_back(ret[i]); + } + } + GDVIRTUAL0RC(Vector<String>, _get_string_delimiters) virtual void get_string_delimiters(List<String> *p_words) const override { @@ -289,6 +313,9 @@ public: ERR_CONTINUE(!err.has("message")); ScriptError serr; + if (err.has("path")) { + serr.path = err["path"]; + } serr.line = err["line"]; serr.column = err["column"]; serr.message = err["message"]; @@ -337,7 +364,9 @@ public: GDVIRTUAL_REQUIRED_CALL(_create_script, ret); return Object::cast_to<Script>(ret); } +#ifndef DISABLE_DEPRECATED EXBIND0RC(bool, has_named_classes) +#endif EXBIND0RC(bool, supports_builtin_mode) EXBIND0RC(bool, supports_documentation) EXBIND0RC(bool, can_inherit_from_file) @@ -623,7 +652,12 @@ VARIANT_ENUM_CAST(ScriptLanguageExtension::CodeCompletionLocation) class ScriptInstanceExtension : public ScriptInstance { public: - const GDExtensionScriptInstanceInfo *native_info; + const GDExtensionScriptInstanceInfo2 *native_info; + bool free_native_info = false; + struct { + GDExtensionScriptInstanceNotification notification_func = nullptr; + } deprecated_native_info; + GDExtensionScriptInstanceDataPtr instance = nullptr; // There should not be warnings on explicit casts. @@ -650,9 +684,18 @@ public: const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount); #ifdef TOOLS_ENABLED - Ref<Script> script = get_script(); - if (script.is_valid() && pcount > 0) { - p_list->push_back(script->get_class_category()); + if (pcount > 0) { + if (native_info->get_class_category_func) { + GDExtensionPropertyInfo gdext_class_category; + if (native_info->get_class_category_func(instance, &gdext_class_category)) { + p_list->push_back(PropertyInfo(gdext_class_category)); + } + } else { + Ref<Script> script = get_script(); + if (script.is_valid()) { + p_list->push_back(script->get_class_category()); + } + } } #endif // TOOLS_ENABLED @@ -675,6 +718,28 @@ public: } return Variant::NIL; } + virtual void validate_property(PropertyInfo &p_property) const override { + if (native_info->validate_property_func) { + // GDExtension uses a StringName rather than a String for property name. + StringName prop_name = p_property.name; + GDExtensionPropertyInfo gdext_prop = { + (GDExtensionVariantType)p_property.type, + &prop_name, + &p_property.class_name, + (uint32_t)p_property.hint, + &p_property.hint_string, + p_property.usage, + }; + if (native_info->validate_property_func(instance, &gdext_prop)) { + p_property.type = (Variant::Type)gdext_prop.type; + p_property.name = *reinterpret_cast<StringName *>(gdext_prop.name); + p_property.class_name = *reinterpret_cast<StringName *>(gdext_prop.class_name); + p_property.hint = (PropertyHint)gdext_prop.hint; + p_property.hint_string = *reinterpret_cast<String *>(gdext_prop.hint_string); + p_property.usage = gdext_prop.usage; + } + } + } virtual bool property_can_revert(const StringName &p_name) const override { if (native_info->property_can_revert_func) { @@ -736,11 +801,16 @@ public: return ret; } - virtual void notification(int p_notification) override { + virtual void notification(int p_notification, bool p_reversed = false) override { if (native_info->notification_func) { - native_info->notification_func(instance, p_notification); + native_info->notification_func(instance, p_notification, p_reversed); +#ifndef DISABLE_DEPRECATED + } else if (deprecated_native_info.notification_func) { + deprecated_native_info.notification_func(instance, p_notification); +#endif // DISABLE_DEPRECATED } } + virtual String to_string(bool *r_valid) override { if (native_info->to_string_func) { GDExtensionBool valid; @@ -812,6 +882,9 @@ public: if (native_info->free_func) { native_info->free_func(instance); } + if (free_native_info) { + memfree(const_cast<GDExtensionScriptInstanceInfo2 *>(native_info)); + } } #if defined(__GNUC__) && !defined(__clang__) |