SyntaxGameServer/RCCService2018/content/LuaPackages/RoactImpl/getDefaultPropertyValue.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