summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--script/core/hover/label.lua5
-rw-r--r--script/core/hover/table.lua7
-rw-r--r--script/gc.lua1
-rw-r--r--script/vm/getLinks.lua63
-rw-r--r--script/vm/infer.lua5
-rw-r--r--script/vm/init.lua4
-rw-r--r--script/vm/library.lua (renamed from script/vm/getLibrary.lua)0
-rw-r--r--script/vm/sign.lua11
-rw-r--r--script/vm/type.lua45
-rw-r--r--test/hover/init.lua22
10 files changed, 72 insertions, 91 deletions
diff --git a/script/core/hover/label.lua b/script/core/hover/label.lua
index 995c3294..c2239344 100644
--- a/script/core/hover/label.lua
+++ b/script/core/hover/label.lua
@@ -45,10 +45,7 @@ local function asValue(source, title)
local ifr = infer.getInfer(source)
local type = ifr:view()
local literal = ifr:viewLiterals()
- local cont
- if not ifr:hasType 'string' then
- cont = buildTable(source)
- end
+ local cont = buildTable(source)
local pack = {}
pack[#pack+1] = title
pack[#pack+1] = name .. ':'
diff --git a/script/core/hover/table.lua b/script/core/hover/table.lua
index 88808daa..8f9beefe 100644
--- a/script/core/hover/table.lua
+++ b/script/core/hover/table.lua
@@ -163,6 +163,13 @@ return function (source)
return nil
end
+ for view in infer.getInfer(source):eachView() do
+ if view == 'string'
+ or vm.isSubType(view, 'string') then
+ return nil
+ end
+ end
+
local fields = vm.getFields(source)
local keys, map = getKeyMap(fields)
if #keys == 0 then
diff --git a/script/gc.lua b/script/gc.lua
index 24a72f15..7bb81569 100644
--- a/script/gc.lua
+++ b/script/gc.lua
@@ -5,6 +5,7 @@ local util = require 'utility'
local mt = {}
mt.__index = mt
mt.type = 'gc'
+mt._removed = false
mt._max = 10
diff --git a/script/vm/getLinks.lua b/script/vm/getLinks.lua
deleted file mode 100644
index 8571fb46..00000000
--- a/script/vm/getLinks.lua
+++ /dev/null
@@ -1,63 +0,0 @@
-local guide = require 'parser.guide'
----@class vm
-local vm = require 'vm.vm'
-local files = require 'files'
-local rpath = require 'workspace.require-path'
-
-local function getFileLinks(uri)
- local links = {}
- local state = files.getState(uri)
- if not state then
- return links
- end
- tracy.ZoneBeginN('getFileLinks')
- guide.eachSpecialOf(state.ast, 'require', function (source)
- local call = source.parent
- if not call or call.type ~= 'call' then
- return
- end
- local args = call.args
- if not args or not args[1] or args[1].type ~= 'string' then
- return
- end
- local uris = rpath.findUrisByRequirePath(uri, args[1][1])
- for _, u in ipairs(uris) do
- if not links[u] then
- links[u] = {}
- end
- links[u][#links[u]+1] = call
- end
- end)
- tracy.ZoneEnd()
- return links
-end
-
-local function getFileLinksOrCache(uri)
- local cache = files.getCache(uri)
- cache.links = cache.links or getFileLinks(uri)
- return cache.links
-end
-
-local function getLinksTo(uri)
- local links = {}
- for u in files.eachFile(uri) do
- local ls = getFileLinksOrCache(u)
- if ls[uri] then
- for _, l in ipairs(ls[uri]) do
- links[#links+1] = l
- end
- end
- end
- return links
-end
-
--- 获取所有 require(uri) 的文件
-function vm.getLinksTo(uri)
- local cache = vm.getCache('getLinksTo')[uri]
- if cache ~= nil then
- return cache
- end
- cache = getLinksTo(uri)
- vm.getCache('getLinksTo')[uri] = cache
- return cache
-end
diff --git a/script/vm/infer.lua b/script/vm/infer.lua
index 853bd7de..1ccc54aa 100644
--- a/script/vm/infer.lua
+++ b/script/vm/infer.lua
@@ -309,6 +309,11 @@ function mt:view(default, uri)
end
end
+function mt:eachView()
+ self:_computeViews()
+ return next, self.views
+end
+
---@param other vm.infer
---@return vm.infer
function mt:merge(other)
diff --git a/script/vm/init.lua b/script/vm/init.lua
index aa1b908f..4f527930 100644
--- a/script/vm/init.lua
+++ b/script/vm/init.lua
@@ -4,6 +4,6 @@ require 'vm.def'
require 'vm.ref'
require 'vm.field'
require 'vm.doc'
-require 'vm.getLibrary'
-require 'vm.getLinks'
+require 'vm.type'
+require 'vm.library'
return vm
diff --git a/script/vm/getLibrary.lua b/script/vm/library.lua
index 1a8d8ffd..1a8d8ffd 100644
--- a/script/vm/getLibrary.lua
+++ b/script/vm/library.lua
diff --git a/script/vm/sign.lua b/script/vm/sign.lua
index 2c440902..eae549e4 100644
--- a/script/vm/sign.lua
+++ b/script/vm/sign.lua
@@ -1,5 +1,7 @@
local guide = require 'parser.guide'
local nodeMgr = require 'vm.node'
+---@class vm
+local vm = require 'vm.vm'
---@class vm.sign
---@field parent parser.object
@@ -19,7 +21,6 @@ function mt:resolve(argNodes)
if not argNodes then
return nil
end
- local typeMgr = require 'vm.type'
local compiler = require 'vm.compiler'
local globalMgr = require 'vm.global-manager'
local resolved = {}
@@ -56,18 +57,18 @@ function mt:resolve(argNodes)
local uvalueNode = compiler.compileNode(ufield.extends)
if ufieldNode.type == 'doc.generic.name' and uvalueNode.type == 'doc.generic.name' then
-- { [number]: number} -> { [K]: V }
- local tfieldNode = typeMgr.getTableKey(node, 'any')
- local tvalueNode = typeMgr.getTableValue(node, 'any')
+ local tfieldNode = vm.getTableKey(node, 'any')
+ local tvalueNode = vm.getTableValue(node, 'any')
resolve(ufieldNode, tfieldNode)
resolve(uvalueNode, tvalueNode)
else
if ufieldNode.type == 'doc.generic.name' then
-- { [number]: number}|number[] -> { [K]: number }
- local tnode = typeMgr.getTableKey(node, uvalueNode)
+ local tnode = vm.getTableKey(node, uvalueNode)
resolve(ufieldNode, tnode)
else
-- { [number]: number}|number[] -> { [number]: V }
- local tnode = typeMgr.getTableValue(node, ufieldNode)
+ local tnode = vm.getTableValue(node, ufieldNode)
resolve(uvalueNode, tnode)
end
end
diff --git a/script/vm/type.lua b/script/vm/type.lua
index 8b80d4f3..4cac9723 100644
--- a/script/vm/type.lua
+++ b/script/vm/type.lua
@@ -1,14 +1,14 @@
local nodeMgr = require 'vm.node'
local compiler = require 'vm.compiler'
local globalMgr = require 'vm.global-manager'
+---@class vm
+local vm = require 'vm.vm'
----@class vm.type-manager
-local m = {}
-
----@param child vm.node
----@param parent vm.node
+---@param child vm.node|string
+---@param parent vm.node|string
+---@param mark? table
---@return boolean
-function m.isSubType(child, parent, mark)
+function vm.isSubType(child, parent, mark)
if type(parent) == 'string' then
parent = globalMgr.getGlobal('type', parent)
end
@@ -16,13 +16,17 @@ function m.isSubType(child, parent, mark)
child = globalMgr.getGlobal('type', child)
end
+ if not child or not parent then
+ return false
+ end
+
if parent.type == 'global' and parent.cate == 'type' and parent.name == 'any' then
return true
end
if child.type == 'doc.type' then
for _, typeUnit in ipairs(child.types) do
- if not m.isSubType(typeUnit, parent) then
+ if not vm.isSubType(typeUnit, parent) then
return false
end
end
@@ -36,7 +40,7 @@ function m.isSubType(child, parent, mark)
if child.type == 'global' and child.cate == 'type' then
if parent.type == 'doc.type' then
for _, typeUnit in ipairs(parent.types) do
- if m.isSubType(child, typeUnit) then
+ if vm.isSubType(child, typeUnit) then
return true
end
end
@@ -58,7 +62,16 @@ function m.isSubType(child, parent, mark)
for _, set in ipairs(child:getSets()) do
if set.type == 'doc.class' and set.extends then
for _, ext in ipairs(set.extends) do
- if m.isSubType(globalMgr.getGlobal('type', ext[1]), parent, mark) then
+ if ext.type == 'doc.extends.name'
+ and vm.isSubType(globalMgr.getGlobal('type', ext[1]), parent, mark) then
+ return true
+ end
+ end
+ end
+ if set.type == 'doc.alias' and set.extends then
+ for _, ext in ipairs(set.extends.types) do
+ if ext.type == 'doc.type.name'
+ and vm.isSubType(globalMgr.getGlobal('type', ext[1]), parent, mark) then
return true
end
end
@@ -72,18 +85,18 @@ end
---@param tnode vm.node
---@param knode vm.node
-function m.getTableValue(tnode, knode)
+function vm.getTableValue(tnode, knode)
local result
for tn in nodeMgr.eachNode(tnode) do
if tn.type == 'doc.type.table' then
for _, field in ipairs(tn.fields) do
- if m.isSubType(field.name, knode) then
+ if vm.isSubType(field.name, knode) then
result = nodeMgr.mergeNode(result, compiler.compileNode(field.extends))
end
end
end
if tn.type == 'doc.type.array' then
- if m.isSubType(globalMgr.getGlobal('type', 'integer'), knode) then
+ if vm.isSubType(globalMgr.getGlobal('type', 'integer'), knode) then
result = nodeMgr.mergeNode(result, compiler.compileNode(tn.node))
end
end
@@ -106,18 +119,18 @@ end
---@param tnode vm.node
---@param vnode vm.node
-function m.getTableKey(tnode, vnode)
+function vm.getTableKey(tnode, vnode)
local result
for tn in nodeMgr.eachNode(tnode) do
if tn.type == 'doc.type.table' then
for _, field in ipairs(tn.fields) do
- if m.isSubType(field.extends, vnode) then
+ if vm.isSubType(field.extends, vnode) then
result = nodeMgr.mergeNode(result, compiler.compileNode(field.name))
end
end
end
if tn.type == 'doc.type.array' then
- if m.isSubType(tn.node, vnode) then
+ if vm.isSubType(tn.node, vnode) then
result = nodeMgr.mergeNode(result, globalMgr.getGlobal('type', 'integer'))
end
end
@@ -137,5 +150,3 @@ function m.getTableKey(tnode, vnode)
end
return result
end
-
-return m
diff --git a/test/hover/init.lua b/test/hover/init.lua
index 61ba392e..5ee4db51 100644
--- a/test/hover/init.lua
+++ b/test/hover/init.lua
@@ -1787,3 +1787,25 @@ local <?x?> = 1 // 2
local x: integer = 1
]]
config.set(nil, 'Lua.runtime.nonstandardSymbol', {})
+
+config.set(nil, 'Lua.hover.expandAlias', false)
+TEST [[
+---@alias uri string
+
+---@type uri
+local <?uri?>
+]]
+[[
+local uri: uri
+]]
+
+config.set(nil, 'Lua.hover.expandAlias', true)
+TEST [[
+---@alias uri string
+
+---@type uri
+local <?uri?>
+]]
+[[
+local uri: string
+]]