From d2fd93ce3238a85a5887dab0951296b266d92c52 Mon Sep 17 00:00:00 2001 From: Jovan Gerodetti Date: Fri, 17 Jan 2025 00:46:29 +0100 Subject: [PATCH] Provide safe way for implementing IScriptExtension::instance_has --- .../special_cases/codegen_special_cases.rs | 2 + godot-core/src/obj/script.rs | 31 +++- itest/godot/ScriptInstanceTests.gd | 56 +++++-- .../script/script_instance_tests.rs | 144 +++++++++++++++++- 4 files changed, 211 insertions(+), 22 deletions(-) diff --git a/godot-codegen/src/special_cases/codegen_special_cases.rs b/godot-codegen/src/special_cases/codegen_special_cases.rs index 7e0eadfa5..a05352382 100644 --- a/godot-codegen/src/special_cases/codegen_special_cases.rs +++ b/godot-codegen/src/special_cases/codegen_special_cases.rs @@ -173,7 +173,9 @@ const SELECTED_CLASSES: &[&str] = &[ "SceneTreeTimer", "Script", "ScriptExtension", + "ScriptNameCasing", "ScriptLanguage", + "ScriptLanguageExtension", "Sprite2D", "SpriteFrames", "TextServer", diff --git a/godot-core/src/obj/script.rs b/godot-core/src/obj/script.rs index bbbfe3527..28ec9b52a 100644 --- a/godot-core/src/obj/script.rs +++ b/godot-core/src/obj/script.rs @@ -25,9 +25,9 @@ use godot_cell::panicking::{GdCell, MutGuard, RefGuard}; use godot_cell::blocking::{GdCell, MutGuard, RefGuard}; use crate::builtin::{GString, StringName, Variant, VariantType}; -use crate::classes::{Script, ScriptLanguage}; +use crate::classes::{Object, Script, ScriptLanguage}; use crate::meta::{MethodInfo, PropertyInfo}; -use crate::obj::{Base, Gd, GodotClass}; +use crate::obj::{Base, Gd, GodotClass, Inherits}; use crate::sys; #[cfg(before_api = "4.3")] @@ -337,6 +337,33 @@ pub unsafe fn create_script_instance( } } +/// Checks if a script instance exists for a given object. +/// +/// The engine does not expose the [`ScriptLanguage`] of a [`Script`] (as of 4.3) and it's therefore necessary to pass the expected +/// language as well. +/// +/// Use this function to implement [`IScriptExtension::instance_has`](crate::classes::IScriptExtension::instance_has). +#[cfg(since_api = "4.2")] +pub fn script_instance_exists(object: &Gd, script: &Gd, language: &Gd) -> bool +where + O: Inherits, + S: Inherits