Skip to content

Commit 114c88c

Browse files
committed
check that the shape of the table corresponds to the class
1 parent f221eb3 commit 114c88c

File tree

1 file changed

+60
-3
lines changed

1 file changed

+60
-3
lines changed

script/vm/type.lua

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,20 @@ function vm.isSubType(uri, child, parent, mark, errs)
325325
return true
326326
else
327327
local weakNil = config.get(uri, 'Lua.type.weakNilCheck')
328+
local iscomplextype
329+
for i = #child, 1, -1 do
330+
local name = vm.getNodeName(child[i])
331+
if name then
332+
iscomplextype = not guide.isBasicType(name)
333+
if iscomplextype then
334+
break
335+
end
336+
end
337+
end
328338
for n in child:eachObject() do
329339
local nodeName = vm.getNodeName(n)
330340
if nodeName
331-
and not (nodeName == 'nil' and weakNil)
341+
and not (nodeName == 'nil' and weakNil)
332342
and vm.isSubType(uri, n, parent, mark, errs) == false then
333343
if errs then
334344
errs[#errs+1] = 'TYPE_ERROR_UNION_DISMATCH'
@@ -463,7 +473,53 @@ function vm.isSubType(uri, child, parent, mark, errs)
463473
return true
464474
end
465475
if childName == 'table' and not guide.isBasicType(parentName) then
466-
return true
476+
-------------------------------------------------------------------------
477+
local requiresKeys = {}
478+
local t = parent
479+
local set = {}
480+
vm.getClassFields(uri, parent, vm.ANY, function (field, isMark)
481+
if not set[field] then
482+
set[field] = true
483+
set[#set+1] = field
484+
end
485+
end)
486+
print('set', set)
487+
for i, field in ipairs(set) do
488+
if not field.optional
489+
and not vm.compileNode(field):isNullable() then
490+
local key = vm.getKeyName(field)
491+
local node = vm.compileNode(field)
492+
if key and not requiresKeys[key] then
493+
requiresKeys[key] = node
494+
requiresKeys[#requiresKeys+1] = key
495+
end
496+
end
497+
end
498+
if #requiresKeys == 0 then
499+
return
500+
end
501+
local refkey = {}
502+
for _, field in ipairs(child) do
503+
local name = vm.getKeyName(field)
504+
local node = vm.compileNode(field)
505+
if name then
506+
refkey[name] = node
507+
end
508+
end
509+
local ok
510+
for _, key in ipairs(requiresKeys) do
511+
if refkey[key] then
512+
ok = vm.isSubType(uri, refkey[key], requiresKeys[key], mark, errs)
513+
else
514+
return false
515+
end
516+
if not ok then
517+
return false
518+
end
519+
end
520+
521+
-------------------------------
522+
return true --true
467523
end
468524

469525
-- check class parent
@@ -692,6 +748,7 @@ function vm.canCastType(uri, defNode, refNode, errs)
692748
return true
693749
end
694750

751+
695752
return false
696753
end
697754

@@ -753,7 +810,7 @@ function vm.viewTypeErrorMessage(uri, errs)
753810
lparams[paramName] = vm.viewKey(value, uri)
754811
else
755812
lparams[paramName] = vm.getInfer(value):view(uri)
756-
or vm.getInfer(value):view(uri)
813+
or vm.getInfer(value):view(uri)
757814
end
758815
end
759816
index = index + 1

0 commit comments

Comments
 (0)