forked from rojo-rbx/rojo
* Mostly mechanical port bits * Almost there * It builds again! * Turn on all the code again * Tests compiling but not passing * Stub work for value resolution * Implement resolution minus enums and derived properties * Implement property descriptor resolution * Update referent snapshots * Update unions test project Using a place file instead of a model yields better error messages in Roblox Studio. * Add easy shortcut to testing with local rbx-dom * Update rbx-dom * Add enum resolution * Update init.meta.json to use UnresolvedValue * Expand value resolution support, add test * Filter SharedString values from web API * Add 'property' builder method to InstanceSnapshot * Change InstanceSnapshot/InstanceBuilder boundary * Fix remove_file crash * rustfmt * Update to latest rbx_dom_lua * Update dependencies, including rbx_dom_weak * Update to latest rbx-dom * Update dependencies * Update rbx-dom, fixing more bugs * Remove experimental warning on binary place builds * Remove unused imports
69 lines
1.8 KiB
Lua
69 lines
1.8 KiB
Lua
local database = require(script.database)
|
|
local Error = require(script.Error)
|
|
local PropertyDescriptor = require(script.PropertyDescriptor)
|
|
|
|
local function findCanonicalPropertyDescriptor(className, propertyName)
|
|
local currentClassName = className
|
|
|
|
repeat
|
|
local currentClass = database.Classes[currentClassName]
|
|
|
|
if currentClass == nil then
|
|
return currentClass
|
|
end
|
|
|
|
local propertyData = currentClass.Properties[propertyName]
|
|
if propertyData ~= nil then
|
|
local canonicalData = propertyData.Kind.Canonical
|
|
if canonicalData ~= nil then
|
|
return PropertyDescriptor.fromRaw(propertyData, currentClassName, propertyName)
|
|
end
|
|
|
|
local aliasData = propertyData.Kind.Alias
|
|
if aliasData ~= nil then
|
|
return PropertyDescriptor.fromRaw(
|
|
currentClass.properties[aliasData.AliasFor],
|
|
currentClassName,
|
|
aliasData.AliasFor)
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
currentClassName = currentClass.Superclass
|
|
until currentClassName == nil
|
|
|
|
return nil
|
|
end
|
|
|
|
local function readProperty(instance, propertyName)
|
|
local descriptor = findCanonicalPropertyDescriptor(instance.ClassName, propertyName)
|
|
|
|
if descriptor == nil then
|
|
local fullName = ("%s.%s"):format(instance.className, propertyName)
|
|
|
|
return false, Error.new(Error.Kind.UnknownProperty, fullName)
|
|
end
|
|
|
|
return descriptor:read(instance)
|
|
end
|
|
|
|
local function writeProperty(instance, propertyName, value)
|
|
local descriptor = findCanonicalPropertyDescriptor(instance.ClassName, propertyName)
|
|
|
|
if descriptor == nil then
|
|
local fullName = ("%s.%s"):format(instance.className, propertyName)
|
|
|
|
return false, Error.new(Error.Kind.UnknownProperty, fullName)
|
|
end
|
|
|
|
return descriptor:write(instance, value)
|
|
end
|
|
|
|
return {
|
|
readProperty = readProperty,
|
|
writeProperty = writeProperty,
|
|
findCanonicalPropertyDescriptor = findCanonicalPropertyDescriptor,
|
|
Error = Error,
|
|
EncodedValue = require(script.EncodedValue),
|
|
} |