@@ -133,8 +133,8 @@ local function checkValue(parent, child, mark, err)
133133 or child .type == ' number' then
134134 if parent [1 ] ~= child [1 ] then
135135 err [# err + 1 ] = ' TYPE_ERROR_INTEGER_DISMATCH'
136- err [# err + 1 ] = child
137- err [# err + 1 ] = parent
136+ err [# err + 1 ] = child [ 1 ]
137+ err [# err + 1 ] = parent [ 1 ]
138138 return false
139139 end
140140 end
@@ -148,8 +148,8 @@ local function checkValue(parent, child, mark, err)
148148 or child .type == ' doc.field.name' then
149149 if parent [1 ] ~= child [1 ] then
150150 err [# err + 1 ] = ' TYPE_ERROR_STRING_DISMATCH'
151- err [# err + 1 ] = child
152- err [# err + 1 ] = parent
151+ err [# err + 1 ] = child [ 1 ]
152+ err [# err + 1 ] = parent [ 1 ]
153153 return false
154154 end
155155 end
@@ -161,8 +161,8 @@ local function checkValue(parent, child, mark, err)
161161 or child .type == ' doc.type.boolean' then
162162 if parent [1 ] ~= child [1 ] then
163163 err [# err + 1 ] = ' TYPE_ERROR_BOOLEAN_DISMATCH'
164- err [# err + 1 ] = child
165- err [# err + 1 ] = parent
164+ err [# err + 1 ] = child [ 1 ]
165+ err [# err + 1 ] = parent [ 1 ]
166166 return false
167167 end
168168 end
@@ -234,19 +234,21 @@ function vm.isSubType(uri, child, parent, mark, err)
234234 child = global
235235 elseif child .type == ' vm.node' then
236236 if config .get (uri , ' Lua.type.weakUnionCheck' ) then
237- local hasKnownType
237+ local hasKnownType = 0
238238 for n in child :eachObject () do
239239 if getNodeName (n ) then
240- hasKnownType = true
240+ hasKnownType = hasKnownType + 1
241241 if vm .isSubType (uri , n , parent , mark , err ) == true then
242242 return true , err
243243 end
244244 end
245245 end
246- if hasKnownType then
247- err [# err + 1 ] = ' TYPE_ERROR_UNION_ALL_DISMATCH'
248- err [# err + 1 ] = child
249- err [# err + 1 ] = parent
246+ if hasKnownType > 0 then
247+ if hasKnownType > 1 then
248+ err [# err + 1 ] = ' TYPE_ERROR_CHILD_ALL_DISMATCH'
249+ err [# err + 1 ] = child
250+ err [# err + 1 ] = parent
251+ end
250252 return false , err
251253 end
252254 return true , err
@@ -293,10 +295,10 @@ function vm.isSubType(uri, child, parent, mark, err)
293295 end
294296 parent = global
295297 elseif parent .type == ' vm.node' then
296- local hasKnownType
298+ local hasKnownType = 0
297299 for n in parent :eachObject () do
298300 if getNodeName (n ) then
299- hasKnownType = true
301+ hasKnownType = hasKnownType + 1
300302 if vm .isSubType (uri , child , n , mark , err ) == true then
301303 return true , err
302304 end
@@ -307,7 +309,15 @@ function vm.isSubType(uri, child, parent, mark, err)
307309 return true , err
308310 end
309311 end
310- return not hasKnownType , err
312+ if hasKnownType > 0 then
313+ if hasKnownType > 1 then
314+ err [# err + 1 ] = ' TYPE_ERROR_PARENT_ALL_DISMATCH'
315+ err [# err + 1 ] = child
316+ err [# err + 1 ] = parent
317+ end
318+ return false , err
319+ end
320+ return true , err
311321 end
312322
313323 --- @cast parent vm.node.object
@@ -342,7 +352,7 @@ function vm.isSubType(uri, child, parent, mark, err)
342352 and child [1 ]
343353 and not math.tointeger (child [1 ]) then
344354 err [# err + 1 ] = ' TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER'
345- err [# err + 1 ] = child
355+ err [# err + 1 ] = child [ 1 ]
346356 return false , err
347357 end
348358 if child .type == ' global'
@@ -604,7 +614,8 @@ local ErrorMessageMap = {
604614 TYPE_ERROR_BOOLEAN_DISMATCH = {' child' , ' parent' },
605615 TYPE_ERROR_TABLE_NO_FIELD = {' key' },
606616 TYPE_ERROR_TABLE_FIELD_DISMATCH = {' key' , ' child' , ' parent' },
607- TYPE_ERROR_UNION_ALL_DISMATCH = {' child' , ' parent' },
617+ TYPE_ERROR_CHILD_ALL_DISMATCH = {' child' , ' parent' },
618+ TYPE_ERROR_PARENT_ALL_DISMATCH = {' child' , ' parent' },
608619 TYPE_ERROR_UNION_DISMATCH = {' child' , ' parent' },
609620 TYPE_ERROR_OPTIONAL_DISMATCH = {' parent' },
610621 TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER = {' child' },
0 commit comments