@@ -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
696753end
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