From 91af86cca23a3c66320c3e3389a1e9150741bcac Mon Sep 17 00:00:00 2001 From: Sasial <44125644+sasial-dev@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:02:15 +1000 Subject: [PATCH] `IsA`, `ClassName` & `Parent` should work if an instance is already destroyed (#271) --- crates/lune-roblox/src/instance/base.rs | 12 ++++++------ crates/lune-roblox/src/instance/mod.rs | 5 +---- tests/roblox/instance/methods/ClearAllChildren.luau | 8 ++------ tests/roblox/instance/methods/Destroy.luau | 12 +++--------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/crates/lune-roblox/src/instance/base.rs b/crates/lune-roblox/src/instance/base.rs index 58a2ae78..4b737d3f 100644 --- a/crates/lune-roblox/src/instance/base.rs +++ b/crates/lune-roblox/src/instance/base.rs @@ -113,7 +113,6 @@ pub fn add_methods<'lua, M: LuaUserDataMethods<'lua, Instance>>(m: &mut M) { }, ); m.add_method("IsA", |_, this, class_name: String| { - ensure_not_destroyed(this)?; Ok(class_is_a(&this.class_name, class_name).unwrap_or(false)) }); m.add_method( @@ -217,19 +216,20 @@ fn instance_property_get<'lua>( this: &Instance, prop_name: String, ) -> LuaResult> { - ensure_not_destroyed(this)?; - match prop_name.as_str() { "ClassName" => return this.get_class_name().into_lua(lua), - "Name" => { - return this.get_name().into_lua(lua); - } "Parent" => { return this.get_parent().into_lua(lua); } _ => {} } + ensure_not_destroyed(this)?; + + if prop_name.as_str() == "Name" { + return this.get_name().into_lua(lua); + } + if let Some(info) = find_property_info(&this.class_name, &prop_name) { if let Some(prop) = this.get_property(&prop_name) { if let DomValue::Enum(enum_value) = prop { diff --git a/crates/lune-roblox/src/instance/mod.rs b/crates/lune-roblox/src/instance/mod.rs index 3397e095..120a5140 100644 --- a/crates/lune-roblox/src/instance/mod.rs +++ b/crates/lune-roblox/src/instance/mod.rs @@ -302,10 +302,7 @@ impl Instance { pub fn get_parent(&self) -> Option { let dom = INTERNAL_DOM.lock().expect("Failed to lock document"); - let parent_ref = dom - .get_by_ref(self.dom_ref) - .expect("Failed to find instance in document") - .parent(); + let parent_ref = dom.get_by_ref(self.dom_ref)?.parent(); if parent_ref == dom.root_ref() { None diff --git a/tests/roblox/instance/methods/ClearAllChildren.luau b/tests/roblox/instance/methods/ClearAllChildren.luau index ed6ec22d..01bd6b58 100644 --- a/tests/roblox/instance/methods/ClearAllChildren.luau +++ b/tests/roblox/instance/methods/ClearAllChildren.luau @@ -20,14 +20,10 @@ assert(not pcall(function() return child1.Name end)) -assert(not pcall(function() - return child1.Parent -end)) +assert(not child1.Parent) assert(not pcall(function() return child2.Name end)) -assert(not pcall(function() - return child2.Parent -end)) +assert(not child2.Parent) diff --git a/tests/roblox/instance/methods/Destroy.luau b/tests/roblox/instance/methods/Destroy.luau index aa18344d..bbffa07c 100644 --- a/tests/roblox/instance/methods/Destroy.luau +++ b/tests/roblox/instance/methods/Destroy.luau @@ -14,22 +14,16 @@ assert(not pcall(function() return root.Name end)) -assert(not pcall(function() - return root.Parent -end)) +assert(not root.Parent) assert(not pcall(function() return child.Name end)) -assert(not pcall(function() - return child.Parent -end)) +assert(not child.Parent) assert(not pcall(function() return descendant.Name end)) -assert(not pcall(function() - return descendant.Parent -end)) +assert(not descendant.Parent)