summaryrefslogtreecommitdiff
path: root/script/vm/field.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/vm/field.lua')
-rw-r--r--script/vm/field.lua41
1 files changed, 41 insertions, 0 deletions
diff --git a/script/vm/field.lua b/script/vm/field.lua
new file mode 100644
index 00000000..0968df11
--- /dev/null
+++ b/script/vm/field.lua
@@ -0,0 +1,41 @@
+---@class vm
+local vm = require 'vm.vm'
+local util = require 'utility'
+local guide = require 'parser.guide'
+
+local searchByNodeSwitch = util.switch()
+ : case 'global'
+ ---@param global vm.global
+ : call(function (suri, global, pushResult)
+ for _, set in ipairs(global:getSets(suri)) do
+ pushResult(set)
+ end
+ end)
+ : default(function (suri, source, pushResult)
+ pushResult(source)
+ end)
+
+local function searchByNode(source, pushResult)
+ local uri = guide.getUri(source)
+ vm.compileByParentNode(source, nil, function (field)
+ searchByNodeSwitch(field.type, uri, field, pushResult)
+ end)
+end
+
+---@param source parser.object
+---@return parser.object[]
+function vm.getFields(source)
+ local results = {}
+ local mark = {}
+
+ local function pushResult(src)
+ if not mark[src] then
+ mark[src] = true
+ results[#results+1] = src
+ end
+ end
+
+ searchByNode(source, pushResult)
+
+ return results
+end