@@ -133,8 +133,8 @@ local function checkValue(parent, child, mark, err)
133
133
or child .type == ' number' then
134
134
if parent [1 ] ~= child [1 ] then
135
135
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 ]
138
138
return false
139
139
end
140
140
end
@@ -148,8 +148,8 @@ local function checkValue(parent, child, mark, err)
148
148
or child .type == ' doc.field.name' then
149
149
if parent [1 ] ~= child [1 ] then
150
150
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 ]
153
153
return false
154
154
end
155
155
end
@@ -161,8 +161,8 @@ local function checkValue(parent, child, mark, err)
161
161
or child .type == ' doc.type.boolean' then
162
162
if parent [1 ] ~= child [1 ] then
163
163
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 ]
166
166
return false
167
167
end
168
168
end
@@ -234,19 +234,21 @@ function vm.isSubType(uri, child, parent, mark, err)
234
234
child = global
235
235
elseif child .type == ' vm.node' then
236
236
if config .get (uri , ' Lua.type.weakUnionCheck' ) then
237
- local hasKnownType
237
+ local hasKnownType = 0
238
238
for n in child :eachObject () do
239
239
if getNodeName (n ) then
240
- hasKnownType = true
240
+ hasKnownType = hasKnownType + 1
241
241
if vm .isSubType (uri , n , parent , mark , err ) == true then
242
242
return true , err
243
243
end
244
244
end
245
245
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
250
252
return false , err
251
253
end
252
254
return true , err
@@ -293,10 +295,10 @@ function vm.isSubType(uri, child, parent, mark, err)
293
295
end
294
296
parent = global
295
297
elseif parent .type == ' vm.node' then
296
- local hasKnownType
298
+ local hasKnownType = 0
297
299
for n in parent :eachObject () do
298
300
if getNodeName (n ) then
299
- hasKnownType = true
301
+ hasKnownType = hasKnownType + 1
300
302
if vm .isSubType (uri , child , n , mark , err ) == true then
301
303
return true , err
302
304
end
@@ -307,7 +309,15 @@ function vm.isSubType(uri, child, parent, mark, err)
307
309
return true , err
308
310
end
309
311
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
311
321
end
312
322
313
323
--- @cast parent vm.node.object
@@ -342,7 +352,7 @@ function vm.isSubType(uri, child, parent, mark, err)
342
352
and child [1 ]
343
353
and not math.tointeger (child [1 ]) then
344
354
err [# err + 1 ] = ' TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER'
345
- err [# err + 1 ] = child
355
+ err [# err + 1 ] = child [ 1 ]
346
356
return false , err
347
357
end
348
358
if child .type == ' global'
@@ -604,7 +614,8 @@ local ErrorMessageMap = {
604
614
TYPE_ERROR_BOOLEAN_DISMATCH = {' child' , ' parent' },
605
615
TYPE_ERROR_TABLE_NO_FIELD = {' key' },
606
616
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' },
608
619
TYPE_ERROR_UNION_DISMATCH = {' child' , ' parent' },
609
620
TYPE_ERROR_OPTIONAL_DISMATCH = {' parent' },
610
621
TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER = {' child' },
0 commit comments