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