From c94e80cbed782064ce323c3820b2512318c01bec Mon Sep 17 00:00:00 2001 From: makspll Date: Sat, 25 Jan 2025 14:41:09 +0000 Subject: [PATCH 1/2] make sure to call custom get and set functions first --- .../src/bindings/function/namespace.rs | 48 ------------------- .../src/bindings/reference.rs | 5 +- .../tests/data/set/set_primitives_works.lua | 28 +++++++++++ .../src/bindings/reference.rs | 3 +- .../tests/data/set/set_primitives_works.rhai | 28 +++++++++++ 5 files changed, 61 insertions(+), 51 deletions(-) create mode 100644 crates/languages/bevy_mod_scripting_lua/tests/data/set/set_primitives_works.lua create mode 100644 crates/languages/bevy_mod_scripting_rhai/tests/data/set/set_primitives_works.rhai diff --git a/crates/bevy_mod_scripting_core/src/bindings/function/namespace.rs b/crates/bevy_mod_scripting_core/src/bindings/function/namespace.rs index 4eb9a7961a..66288ffa00 100644 --- a/crates/bevy_mod_scripting_core/src/bindings/function/namespace.rs +++ b/crates/bevy_mod_scripting_core/src/bindings/function/namespace.rs @@ -97,54 +97,6 @@ impl Namespace { } } -// impl RegisterNamespacedFunction for ScriptFunctionRegistry { -// fn register_namespaced_function(&mut self, name: N, function: F) -// where -// N: Into>, -// S: IntoNamespace, -// F: ScriptFunction<'static, M>, -// { -// self.register(S::into_namespace(), name, function); -// } -// } - -// impl GetNamespacedFunction for ScriptFunctionRegistry { -// fn iter_overloads_namespaced( -// &self, -// name: N, -// namespace: Namespace, -// ) -> impl Iterator -// where -// N: Into>, -// { -// let cow: Cow<'static, str> = name.into(); -// let function_name = namespace.function_name(cow); -// self.iter_overloads(function_name) -// } - -// fn get_namespaced_function( -// &self, -// name: N, -// namespace: Namespace, -// ) -> Option<&DynamicScriptFunction> -// where -// N: Into>, -// { -// let cow: Cow<'static, str> = name.into(); -// let function_name = namespace.function_name(cow); -// self.get_first(&function_name) -// } - -// fn has_namespaced_function(&self, name: N, namespace: Namespace) -> bool -// where -// N: Into>, -// { -// let cow: Cow<'static, str> = name.into(); -// let function_name = namespace.function_name(cow); -// self.contains(&function_name) -// } -// } - pub struct NamespaceBuilder<'a, N> { namespace: PhantomData, pub world: &'a mut World, diff --git a/crates/languages/bevy_mod_scripting_lua/src/bindings/reference.rs b/crates/languages/bevy_mod_scripting_lua/src/bindings/reference.rs index d2e6c17b22..116d317d87 100644 --- a/crates/languages/bevy_mod_scripting_lua/src/bindings/reference.rs +++ b/crates/languages/bevy_mod_scripting_lua/src/bindings/reference.rs @@ -57,7 +57,7 @@ impl UserData for LuaReflectReference { }; let func = world - .lookup_function([TypeId::of::()], "get") + .lookup_function([type_id, TypeId::of::()], "get") .map_err(|f| { InteropError::missing_function(TypeId::of::(), f) })?; @@ -76,9 +76,10 @@ impl UserData for LuaReflectReference { let self_: ReflectReference = self_.into(); let key: ScriptValue = key.into(); let value: ScriptValue = value.into(); + let type_id = self_.tail_type_id(world.clone())?.or_fake_id(); let func = world - .lookup_function([TypeId::of::()], "set") + .lookup_function([type_id, TypeId::of::()], "set") .map_err(|f| { InteropError::missing_function(TypeId::of::(), f) })?; diff --git a/crates/languages/bevy_mod_scripting_lua/tests/data/set/set_primitives_works.lua b/crates/languages/bevy_mod_scripting_lua/tests/data/set/set_primitives_works.lua new file mode 100644 index 0000000000..a01e3a4599 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_lua/tests/data/set/set_primitives_works.lua @@ -0,0 +1,28 @@ +local Resource = world.get_type_by_name("TestResourceWithVariousFields") +local resource = world.get_resource(Resource) + +resource.string = "Hello, World!" +resource.bool = true +resource.int = 42 +resource.float = 3.0 +resource.vec_usize = { 1, 2 } + +assert(resource.string == "Hello, World!", "Expected 'Hello, World!', got " .. resource.string) +assert(resource.bool == true, "Expected true, got " .. tostring(resource.bool)) +assert(resource.int == 42, "Expected 42, got " .. resource.int) +assert(resource.float == 3.0, "Expected 3.14, got " .. resource.float) +assert(resource.vec_usize[1] == 1, "Expected 1, got " .. resource.vec_usize[1]) + +resource.string = "Goodbye, World!" +resource.bool = false +resource.int = 24 +resource.float = 1.0 +resource.vec_usize = { 3, 4 } + +assert(resource.string == "Goodbye, World!", "Expected 'Goodbye, World!', got " .. resource.string) +assert(resource.bool == false, "Expected false, got " .. tostring(resource.bool)) +assert(resource.int == 24, "Expected 24, got " .. resource.int) +assert(resource.float == 1.0, "Expected 1.41, got " .. resource.float) +assert(resource.vec_usize[1] == 3, "Expected 3, got " .. resource.vec_usize[1]) + + diff --git a/crates/languages/bevy_mod_scripting_rhai/src/bindings/reference.rs b/crates/languages/bevy_mod_scripting_rhai/src/bindings/reference.rs index 1b942e7e89..1618ecb24e 100644 --- a/crates/languages/bevy_mod_scripting_rhai/src/bindings/reference.rs +++ b/crates/languages/bevy_mod_scripting_rhai/src/bindings/reference.rs @@ -320,9 +320,10 @@ impl CustomType for RhaiReflectReference { let self_ = self_.0.clone(); let key = ScriptValue::from_dynamic(_index)?; let value = ScriptValue::from_dynamic(_value)?; + let type_id = self_.tail_type_id(world.clone())?.or_fake_id(); let func = world - .lookup_function([TypeId::of::()], "set") + .lookup_function([type_id, TypeId::of::()], "set") .map_err(|f| { InteropError::missing_function(TypeId::of::(), f) })?; diff --git a/crates/languages/bevy_mod_scripting_rhai/tests/data/set/set_primitives_works.rhai b/crates/languages/bevy_mod_scripting_rhai/tests/data/set/set_primitives_works.rhai new file mode 100644 index 0000000000..8ae0d6d4e8 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_rhai/tests/data/set/set_primitives_works.rhai @@ -0,0 +1,28 @@ +let Resource = world.get_type_by_name.call("TestResourceWithVariousFields"); +let resource = world.get_resource.call(Resource); + +resource.string = "Hello, World!"; +resource.bool = true; +resource.int = 42; +resource.float = 3.0; +resource.vec_usize = [ 1, 2 ]; + +assert(resource.string == "Hello, World!", "Expected 'Hello, World!', got " + resource.string); +assert(resource.bool == true, "Expected true, got " + resource.bool); +assert(resource.int == 42, "Expected 42, got " + resource.int); +assert(resource.float == 3.0, "Expected 3.14, got " + resource.float); +assert(resource.vec_usize[0] == 1, "Expected 1, got " + resource.vec_usize[1]); + +resource.string = "Goodbye, World!"; +resource.bool = false; +resource.int = 24; +resource.float = 1.0; +resource.vec_usize = [ 3, 4 ]; + +assert(resource.string == "Goodbye, World!", "Expected 'Goodbye, World!', got " + resource.string); +assert(resource.bool == false, "Expected false, got " + resource.bool); +assert(resource.int == 24, "Expected 24, got " + resource.int); +assert(resource.float == 1.0, "Expected 1.41, got " + resource.float); +assert(resource.vec_usize[0] == 3, "Expected 3, got " + resource.vec_usize[1]); + + From ccf8461215a0a90bb388992a5457c610a8d2e305 Mon Sep 17 00:00:00 2001 From: makspll Date: Sat, 25 Jan 2025 14:51:20 +0000 Subject: [PATCH 2/2] shorten CI name --- .github/workflows/bevy_mod_scripting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bevy_mod_scripting.yml b/.github/workflows/bevy_mod_scripting.yml index a9b6968d60..e47b23c42d 100644 --- a/.github/workflows/bevy_mod_scripting.yml +++ b/.github/workflows/bevy_mod_scripting.yml @@ -7,7 +7,7 @@ on: - 'docs/**' -name: Check and Lint - bevy_mod_scripting +name: CI env: