allow nesting parent property

This commit is contained in:
ewd3v 2025-02-05 16:19:25 +01:00
parent 7064489a36
commit 30d48b7d56
No known key found for this signature in database
GPG key ID: 18FF74D0F35B288C

View file

@ -23,6 +23,9 @@ type Cache = {
Array<(Instance) -> ()> -- action callbacks Array<(Instance) -> ()> -- action callbacks
>, >,
-- what to parent the instance to after running actions
parent: unknown,
-- cache to detect duplicate property setting at same nesting depth -- cache to detect duplicate property setting at same nesting depth
nested_debug: Map< nested_debug: Map<
number, -- depth number, -- depth
@ -47,6 +50,7 @@ local function borrow_cache(): Cache
actions = setmetatable({} :: any, { -- lazy init actions = setmetatable({} :: any, { -- lazy init
__index = function(self, i) self[i] = {}; return self[i] end __index = function(self, i) self[i] = {}; return self[i] end
}), }),
parent = nil,
nested_debug = setmetatable({} :: any, { nested_debug = setmetatable({} :: any, {
__index = function(self, i: number) self[i] = {}; return self[i] end __index = function(self, i: number) self[i] = {}; return self[i] end
}), }),
@ -61,8 +65,6 @@ end
local function process_properties(properties: Map<unknown, unknown>, instance: Instance, cache: Cache, depth: number) local function process_properties(properties: Map<unknown, unknown>, instance: Instance, cache: Cache, depth: number)
for property, value in properties do for property, value in properties do
if property == "Parent" then continue end
if type(property) == "string" then if type(property) == "string" then
if flags.strict then -- check for duplicate property assignment at nesting depth if flags.strict then -- check for duplicate property assignment at nesting depth
if cache.nested_debug[depth][property] then if cache.nested_debug[depth][property] then
@ -71,6 +73,11 @@ local function process_properties(properties: Map<unknown, unknown>, instance: I
cache.nested_debug[depth][property] = true cache.nested_debug[depth][property] = true
end end
if property == "Parent" then
cache.parent = value
continue
end
if type(value) == "function" then if type(value) == "function" then
if typeof((instance :: any)[property]) == "RBXScriptSignal" then if typeof((instance :: any)[property]) == "RBXScriptSignal" then
table.insert(cache.events, property) -- add event name to buffer table.insert(cache.events, property) -- add event name to buffer
@ -106,9 +113,6 @@ local function apply<T>(instance: T & Instance, properties: { [unknown]: unknown
error "attempt to call a constructor returned by create() with no properties" error "attempt to call a constructor returned by create() with no properties"
end end
-- queue parent assignment if any for last
local parent: unknown = properties.Parent
local caches = borrow_cache() local caches = borrow_cache()
local events = caches.events local events = caches.events
local actions = caches.actions local actions = caches.actions
@ -135,6 +139,7 @@ local function apply<T>(instance: T & Instance, properties: { [unknown]: unknown
end end
end end
local parent = caches.parent
if parent then if parent then
if type(parent) == "function" then if type(parent) == "function" then
implicit_effect.parent(instance, parent :: () -> Instance) implicit_effect.parent(instance, parent :: () -> Instance)
@ -145,6 +150,7 @@ local function apply<T>(instance: T & Instance, properties: { [unknown]: unknown
table.clear(events) table.clear(events)
for _, queued in next, actions do table.clear(queued) end for _, queued in next, actions do table.clear(queued) end
caches.parent = nil
if flags.strict then table.clear(nested_debug) end if flags.strict then table.clear(nested_debug) end
table.clear(nested_stack) table.clear(nested_stack)