|
66 | 66 | local function searchFieldByLocalID(source, key, pushResult) |
67 | 67 | local fields |
68 | 68 | if key then |
69 | | - fields = vm.getLocalSourcesSets(source, key) |
| 69 | + fields = vm.getLocalSets(source, key) |
70 | 70 | else |
71 | 71 | fields = vm.getLocalFields(source, false) |
72 | 72 | end |
@@ -1234,42 +1234,72 @@ local compilerSwitch = util.switch() |
1234 | 1234 | if key == nil then |
1235 | 1235 | return |
1236 | 1236 | end |
1237 | | - if type(key) == 'table' then |
1238 | | - ---@cast key vm.node |
1239 | | - local uri = guide.getUri(source) |
1240 | | - local value = vm.getTableValue(uri, vm.compileNode(source.node), key) |
1241 | | - if value then |
1242 | | - vm.setNode(source, value) |
1243 | | - end |
1244 | | - for k in key:eachObject() do |
1245 | | - if k.type == 'global' and k.cate == 'type' then |
1246 | | - ---@cast k vm.global |
1247 | | - vm.compileByParentNode(source.node, k, function (src) |
1248 | | - vm.setNode(source, vm.compileNode(src)) |
1249 | | - if src.value then |
1250 | | - vm.setNode(source, vm.compileNode(src.value)) |
1251 | | - end |
1252 | | - end) |
| 1237 | + |
| 1238 | + ---@type vm.node, boolean |
| 1239 | + local cacheNode, needCompile |
| 1240 | + |
| 1241 | + do |
| 1242 | + local localInfo = vm.getLocalInfo(source) |
| 1243 | + if localInfo then |
| 1244 | + cacheNode = localInfo.node |
| 1245 | + if not cacheNode then |
| 1246 | + needCompile = true |
| 1247 | + cacheNode = vm.createNode() |
| 1248 | + localInfo.node = cacheNode |
| 1249 | + end |
| 1250 | + else |
| 1251 | + local parentNode = vm.compileNode(source.node) |
| 1252 | + if not parentNode.fields then |
| 1253 | + parentNode.fields = {} |
| 1254 | + end |
| 1255 | + cacheNode = parentNode.fields[key] |
| 1256 | + if not cacheNode then |
| 1257 | + needCompile = true |
| 1258 | + cacheNode = vm.createNode() |
| 1259 | + parentNode.fields[key] = cacheNode |
1253 | 1260 | end |
1254 | 1261 | end |
1255 | | - else |
1256 | | - ---@cast key string |
1257 | | - vm.compileByParentNode(source.node, key, function (src) |
1258 | | - if src.value then |
1259 | | - if bindDocs(src) then |
1260 | | - vm.setNode(source, vm.compileNode(src)) |
1261 | | - elseif src.value.type ~= 'nil' then |
1262 | | - vm.setNode(source, vm.compileNode(src.value)) |
1263 | | - local node = vm.getNode(src) |
1264 | | - if node then |
1265 | | - vm.setNode(source, node) |
1266 | | - end |
| 1262 | + end |
| 1263 | + |
| 1264 | + if needCompile then |
| 1265 | + if type(key) == 'table' then |
| 1266 | + ---@cast key vm.node |
| 1267 | + local uri = guide.getUri(source) |
| 1268 | + local value = vm.getTableValue(uri, vm.compileNode(source.node), key) |
| 1269 | + if value then |
| 1270 | + cacheNode:merge(value) |
| 1271 | + end |
| 1272 | + for k in key:eachObject() do |
| 1273 | + if k.type == 'global' and k.cate == 'type' then |
| 1274 | + ---@cast k vm.global |
| 1275 | + vm.compileByParentNode(source.node, k, function (src) |
| 1276 | + cacheNode:merge(vm.compileNode(src)) |
| 1277 | + if src.value then |
| 1278 | + cacheNode:merge(vm.compileNode(src.value)) |
| 1279 | + end |
| 1280 | + end) |
1267 | 1281 | end |
1268 | | - else |
1269 | | - vm.setNode(source, vm.compileNode(src)) |
1270 | 1282 | end |
1271 | | - end) |
| 1283 | + else |
| 1284 | + ---@cast key string |
| 1285 | + vm.compileByParentNode(source.node, key, function (src) |
| 1286 | + if src.value then |
| 1287 | + if bindDocs(src) then |
| 1288 | + cacheNode:merge(vm.compileNode(src)) |
| 1289 | + elseif src.value.type ~= 'nil' then |
| 1290 | + cacheNode:merge(vm.compileNode(src.value)) |
| 1291 | + local node = vm.getNode(src) |
| 1292 | + if node then |
| 1293 | + cacheNode:merge(node) |
| 1294 | + end |
| 1295 | + end |
| 1296 | + else |
| 1297 | + cacheNode:merge(vm.compileNode(src)) |
| 1298 | + end |
| 1299 | + end) |
| 1300 | + end |
1272 | 1301 | end |
| 1302 | + vm.setNode(source, cacheNode) |
1273 | 1303 | end) |
1274 | 1304 | : case 'setglobal' |
1275 | 1305 | : call(function (source) |
|
0 commit comments