summaryrefslogtreecommitdiff
path: root/script/vm/getDocs.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/vm/getDocs.lua')
-rw-r--r--script/vm/getDocs.lua175
1 files changed, 175 insertions, 0 deletions
diff --git a/script/vm/getDocs.lua b/script/vm/getDocs.lua
new file mode 100644
index 00000000..c06efc11
--- /dev/null
+++ b/script/vm/getDocs.lua
@@ -0,0 +1,175 @@
+local files = require 'files'
+local util = require 'utility'
+local guide = require 'parser.guide'
+local vm = require 'vm.vm'
+local config = require 'config'
+
+local function getTypesOfFile(uri)
+ local types = {}
+ local ast = files.getAst(uri)
+ if not ast or not ast.ast.docs then
+ return types
+ end
+ guide.eachSource(ast.ast.docs, function (src)
+ if src.type == 'doc.type.name'
+ or src.type == 'doc.class.name'
+ or src.type == 'doc.extends.name'
+ or src.type == 'doc.alias.name' then
+ local name = src[1]
+ if name then
+ if not types[name] then
+ types[name] = {}
+ end
+ types[name][#types[name]+1] = src
+ end
+ end
+ end)
+ return types
+end
+
+local function getDocTypes(name)
+ local results = {}
+ for uri in files.eachFile() do
+ local cache = files.getCache(uri)
+ cache.classes = cache.classes or getTypesOfFile(uri)
+ if name == '*' then
+ for _, sources in util.sortPairs(cache.classes) do
+ for _, source in ipairs(sources) do
+ results[#results+1] = source
+ end
+ end
+ else
+ if cache.classes[name] then
+ for _, source in ipairs(cache.classes[name]) do
+ results[#results+1] = source
+ end
+ end
+ end
+ end
+ return results
+end
+
+function vm.getDocEnums(doc, mark, results)
+ mark = mark or {}
+ if mark[doc] then
+ return nil
+ end
+ mark[doc] = true
+ results = results or {}
+ for _, enum in ipairs(doc.enums) do
+ results[#results+1] = enum
+ end
+ for _, resume in ipairs(doc.resumes) do
+ results[#results+1] = resume
+ end
+ for _, unit in ipairs(doc.types) do
+ if unit.type == 'doc.type.name' then
+ for _, other in ipairs(vm.getDocTypes(unit[1])) do
+ if other.type == 'doc.alias.name' then
+ vm.getDocEnums(other.parent.extends, mark, results)
+ end
+ end
+ end
+ end
+ return results
+end
+
+function vm.getDocTypes(name)
+ local cache = vm.getCache('getDocTypes')[name]
+ if cache ~= nil then
+ return cache
+ end
+ cache = getDocTypes(name)
+ vm.getCache('getDocTypes')[name] = cache
+ return cache
+end
+
+function vm.isMetaFile(uri)
+ local status = files.getAst(uri)
+ if not status then
+ return false
+ end
+ local cache = files.getCache(uri)
+ if cache.isMeta ~= nil then
+ return cache.isMeta
+ end
+ cache.isMeta = false
+ if not status.ast.docs then
+ return false
+ end
+ for _, doc in ipairs(status.ast.docs) do
+ if doc.type == 'doc.meta' then
+ cache.isMeta = true
+ return true
+ end
+ end
+ return false
+end
+
+function vm.getValidVersions(doc)
+ if doc.type ~= 'doc.version' then
+ return
+ end
+ local valids = {
+ ['Lua 5.1'] = false,
+ ['Lua 5.2'] = false,
+ ['Lua 5.3'] = false,
+ ['Lua 5.4'] = false,
+ ['LuaJIT'] = false,
+ }
+ for _, version in ipairs(doc.versions) do
+ if version.ge and type(version.version) == 'number' then
+ for ver in pairs(valids) do
+ local verNumber = tonumber(ver:sub(-3))
+ if verNumber and verNumber >= version.version then
+ valids[ver] = true
+ end
+ end
+ elseif version.le and type(version.version) == 'number' then
+ for ver in pairs(valids) do
+ local verNumber = tonumber(ver:sub(-3))
+ if verNumber and verNumber <= version.version then
+ valids[ver] = true
+ end
+ end
+ elseif type(version.version) == 'number' then
+ valids[('Lua %.1f'):format(version.version)] = true
+ elseif 'JIT' == version.version then
+ valids['LuaJIT'] = true
+ end
+ end
+ if valids['Lua 5.1'] then
+ valids['LuaJIT'] = true
+ end
+ return valids
+end
+
+local function isDeprecated(value)
+ if not value.bindDocs then
+ return false
+ end
+ for _, doc in ipairs(value.bindDocs) do
+ if doc.type == 'doc.deprecated' then
+ return true
+ elseif doc.type == 'doc.version' then
+ local valids = vm.getValidVersions(doc)
+ if not valids[config.config.runtime.version] then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+function vm.isDeprecated(value)
+ local defs = vm.getDefs(value, 'deep')
+ if #defs == 0 then
+ return false
+ end
+ for _, def in ipairs(defs) do
+ if not isDeprecated(def) then
+ return false
+ end
+ end
+ return true
+end