From 4ca61ec457822dd14966afa0752340ae8ce180a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Fri, 20 Nov 2020 21:57:09 +0800 Subject: no longer beta --- script/vm/getClass.lua | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 script/vm/getClass.lua (limited to 'script/vm/getClass.lua') diff --git a/script/vm/getClass.lua b/script/vm/getClass.lua new file mode 100644 index 00000000..a8bd7e40 --- /dev/null +++ b/script/vm/getClass.lua @@ -0,0 +1,62 @@ +local vm = require 'vm.vm' +local guide = require 'parser.guide' + +local function lookUpDocClass(source) + local infers = vm.getInfers(source, 'deep') + for _, infer in ipairs(infers) do + if infer.source.type == 'doc.class' + or infer.source.type == 'doc.type' then + return infer.type + end + end +end + +local function getClass(source, classes, depth, deep) + local docClass = lookUpDocClass(source) + if docClass then + classes[#classes+1] = docClass + return + end + if depth > 3 then + return + end + local value = guide.getObjectValue(source) or source + if not deep then + if value and value.type == 'string' then + classes[#classes+1] = value[1] + end + else + for _, src in ipairs(vm.getFields(value)) do + local key = vm.getKeyName(src) + if not key then + goto CONTINUE + end + local lkey = key:lower() + if lkey == 's|type' + or lkey == 's|__name' + or lkey == 's|name' + or lkey == 's|class' then + local value = guide.getObjectValue(src) + if value and value.type == 'string' then + classes[#classes+1] = value[1] + end + end + ::CONTINUE:: + end + end + if #classes ~= 0 then + return + end + vm.eachMeta(source, function (mt) + getClass(mt, classes, depth + 1, deep) + end) +end + +function vm.getClass(source, deep) + local classes = {} + getClass(source, classes, 1, deep) + if #classes == 0 then + return nil + end + return guide.mergeTypes(classes) +end -- cgit v1.2.3