54 lines
1.3 KiB
Lua
54 lines
1.3 KiB
Lua
--[[
|
|
Attempts to get the default value of a given property on a Roblox instance.
|
|
|
|
This is used by the reconciler in cases where a prop was previously set on a
|
|
primitive component, but is no longer present in a component's new props.
|
|
|
|
Eventually, Roblox might provide a nicer API to query the default property
|
|
of an object without constructing an instance of it.
|
|
]]
|
|
|
|
local Symbol = require(script.Parent.Symbol)
|
|
|
|
local Nil = Symbol.named("Nil")
|
|
local _cachedPropertyValues = {}
|
|
|
|
local function getDefaultPropertyValue(className, propertyName)
|
|
local classCache = _cachedPropertyValues[className]
|
|
|
|
if classCache then
|
|
local propValue = classCache[propertyName]
|
|
|
|
-- We have to use a marker here, because Lua doesn't distinguish
|
|
-- between 'nil' and 'not in a table'
|
|
if propValue == Nil then
|
|
return true, nil
|
|
end
|
|
|
|
if propValue ~= nil then
|
|
return true, propValue
|
|
end
|
|
else
|
|
classCache = {}
|
|
_cachedPropertyValues[className] = classCache
|
|
end
|
|
|
|
local created = Instance.new(className)
|
|
local ok, defaultValue = pcall(function()
|
|
return created[propertyName]
|
|
end)
|
|
|
|
created:Destroy()
|
|
|
|
if ok then
|
|
if defaultValue == nil then
|
|
classCache[propertyName] = Nil
|
|
else
|
|
classCache[propertyName] = defaultValue
|
|
end
|
|
end
|
|
|
|
return ok, defaultValue
|
|
end
|
|
|
|
return getDefaultPropertyValue |