@@ -192,16 +192,23 @@ end
192192--- @param uri uri
193193--- @param tnode vm.node
194194--- @param knode vm.node | string
195+ --- @param inversion ? boolean
195196--- @return vm.node ?
196- function vm .getTableValue (uri , tnode , knode )
197+ function vm .getTableValue (uri , tnode , knode , inversion )
197198 local result = vm .createNode ()
198199 for tn in tnode :eachObject () do
199200 if tn .type == ' doc.type.table' then
200201 for _ , field in ipairs (tn .fields ) do
201202 if field .name .type ~= ' doc.field.name'
202- and vm .isSubType (uri , vm .compileNode (field .name ), knode ) then
203- if field .extends then
204- result :merge (vm .compileNode (field .extends ))
203+ and field .extends then
204+ if inversion then
205+ if vm .isSubType (uri , vm .compileNode (field .name ), knode ) then
206+ result :merge (vm .compileNode (field .extends ))
207+ end
208+ else
209+ if vm .isSubType (uri , knode , vm .compileNode (field .name )) then
210+ result :merge (vm .compileNode (field .extends ))
211+ end
205212 end
206213 end
207214 end
@@ -211,21 +218,31 @@ function vm.getTableValue(uri, tnode, knode)
211218 end
212219 if tn .type == ' table' then
213220 for _ , field in ipairs (tn ) do
214- if field .type == ' tableindex' then
215- if field .value then
216- result :merge (vm .compileNode (field .value ))
217- end
221+ if field .type == ' tableindex'
222+ and field .value then
223+ result :merge (vm .compileNode (field .value ))
218224 end
219- if field .type == ' tablefield' then
220- if vm .isSubType (uri , knode , ' string' ) then
221- if field .value then
225+ if field .type == ' tablefield'
226+ and field .value then
227+ if inversion then
228+ if vm .isSubType (uri , ' string' , knode ) then
229+ result :merge (vm .compileNode (field .value ))
230+ end
231+ else
232+ if vm .isSubType (uri , knode , ' string' ) then
222233 result :merge (vm .compileNode (field .value ))
223234 end
224235 end
225236 end
226- if field .type == ' tableexp' then
227- if vm .isSubType (uri , knode , ' integer' ) and field .tindex == 1 then
228- if field .value then
237+ if field .type == ' tableexp'
238+ and field .value
239+ and field .tindex == 1 then
240+ if inversion then
241+ if vm .isSubType (uri , ' integer' , knode ) then
242+ result :merge (vm .compileNode (field .value ))
243+ end
244+ else
245+ if vm .isSubType (uri , knode , ' integer' ) then
229246 result :merge (vm .compileNode (field .value ))
230247 end
231248 end
@@ -242,16 +259,23 @@ end
242259--- @param uri uri
243260--- @param tnode vm.node
244261--- @param vnode vm.node | string | vm.object
262+ --- @param inversion ? boolean
245263--- @return vm.node ?
246- function vm .getTableKey (uri , tnode , vnode )
264+ function vm .getTableKey (uri , tnode , vnode , inversion )
247265 local result = vm .createNode ()
248266 for tn in tnode :eachObject () do
249267 if tn .type == ' doc.type.table' then
250268 for _ , field in ipairs (tn .fields ) do
251269 if field .name .type ~= ' doc.field.name'
252270 and field .extends then
253- if vm .isSubType (uri , vm .compileNode (field .extends ), vnode ) then
254- result :merge (vm .compileNode (field .name ))
271+ if inversion then
272+ if vm .isSubType (uri , vm .compileNode (field .extends ), vnode ) then
273+ result :merge (vm .compileNode (field .name ))
274+ end
275+ else
276+ if vm .isSubType (uri , vnode , vm .compileNode (field .extends )) then
277+ result :merge (vm .compileNode (field .name ))
278+ end
255279 end
256280 end
257281 end
0 commit comments