Skip to content

Commit 15fa116

Browse files
committed
improve type infer of recursion alias
1 parent 158a758 commit 15fa116

File tree

9 files changed

+34
-42
lines changed

9 files changed

+34
-42
lines changed

script/cli/doc.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ local function collect(global)
160160
if source.field.type == 'doc.field.name' then
161161
field.name = source.field[1]
162162
else
163-
field.name = ('[%s]'):format(vm.viewObject(source.field, rootUri))
163+
field.name = ('[%s]'):format(vm.getInfer(source.field):view(rootUri))
164164
end
165165
field.type = source.type
166166
field.file = guide.getUri(source)

script/core/completion/completion.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ local function insertEnum(state, pos, src, enums, isInArray, mark)
12161216
or src.type == 'doc.type.boolean' then
12171217
---@cast src parser.object
12181218
enums[#enums+1] = {
1219-
label = vm.viewObject(src, state.uri),
1219+
label = vm.getInfer(src):view(state.uri),
12201220
description = src.comment,
12211221
kind = define.CompletionItemKind.EnumMember,
12221222
}

script/core/hover/description.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ local function buildEnumChunk(docType, name, uri)
263263
(enum.default and '->')
264264
or (enum.additional and '+>')
265265
or ' |',
266-
vm.viewObject(enum, uri)
266+
vm.getInfer(enum):view(uri)
267267
)
268268
if enum.comment then
269269
local first = true

script/vm/compiler.lua

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,11 @@ local compilerSwitch = util.switch()
17771777
return
17781778
end
17791779
end)
1780+
: case 'global'
1781+
: case 'generic'
1782+
: call(function (source)
1783+
vm.setNode(source, source)
1784+
end)
17801785

17811786
---@param source parser.object
17821787
local function compileByNode(source)
@@ -1850,7 +1855,7 @@ local function compileByParentNode(source)
18501855
end)
18511856
end
18521857

1853-
---@param source vm.object | vm.variable
1858+
---@param source vm.node.object | vm.variable
18541859
---@return vm.node
18551860
function vm.compileNode(source)
18561861
if not source then
@@ -1866,13 +1871,6 @@ function vm.compileNode(source)
18661871
return cache
18671872
end
18681873

1869-
if source.type == 'generic' then
1870-
vm.setNode(source, source)
1871-
local node = vm.getNode(source)
1872-
---@cast node -?
1873-
return node
1874-
end
1875-
18761874
---@cast source parser.object
18771875
vm.setNode(source, vm.createNode(), true)
18781876
if not vm.compileByGlobal(source) then

script/vm/infer.lua

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ local guide = require 'parser.guide'
55
local vm = require 'vm.vm'
66

77
---@class vm.infer
8+
---@field node vm.node
89
---@field views table<string, boolean>
9-
---@field cachedView? string
10-
---@field node? vm.node
1110
---@field _drop table
1211
local mt = {}
1312
mt.__index = mt
@@ -137,7 +136,8 @@ local viewNodeSwitch;viewNodeSwitch = util.switch()
137136
local node = vm.compileNode(source)
138137
for c in node:eachObject() do
139138
if guide.isLiteral(c) then
140-
local view = vm.viewObject(c, uri)
139+
---@cast c parser.object
140+
local view = vm.getInfer(c):view(uri)
141141
if view then
142142
infer._drop[view] = true
143143
end
@@ -239,7 +239,7 @@ local viewNodeSwitch;viewNodeSwitch = util.switch()
239239
---@class vm.node
240240
---@field lastInfer? vm.infer
241241

242-
---@param source vm.object | vm.node
242+
---@param source vm.node.object | vm.node
243243
---@return vm.infer
244244
function vm.getInfer(source)
245245
---@type vm.node
@@ -289,6 +289,13 @@ end
289289

290290
---@param uri uri
291291
function mt:_eraseAlias(uri)
292+
local count = 0
293+
for _ in pairs(self.views) do
294+
count = count + 1
295+
end
296+
if count <= 1 then
297+
return
298+
end
292299
local expandAlias = config.get(uri, 'Lua.hover.expandAlias')
293300
for n in self.node:eachObject() do
294301
if n.type == 'global' and n.cate == 'type' then
@@ -447,23 +454,6 @@ function mt:eachView(uri)
447454
return next, self.views
448455
end
449456

450-
---@param other vm.infer
451-
---@return vm.infer
452-
function mt:merge(other)
453-
if self == vm.NULL then
454-
return other
455-
end
456-
if other == vm.NULL then
457-
return self
458-
end
459-
460-
local infer = setmetatable({
461-
node = vm.createNode(self.node, other.node),
462-
}, mt)
463-
464-
return infer
465-
end
466-
467457
---@return string?
468458
function mt:viewLiterals()
469459
if not self.node then
@@ -539,7 +529,7 @@ function vm.viewKey(source, uri)
539529
if #source.types == 1 then
540530
return vm.viewKey(source.types[1], uri)
541531
else
542-
local key = vm.viewObject(source, uri)
532+
local key = vm.getInfer(source):view(uri)
543533
return '[' .. key .. ']'
544534
end
545535
end

script/vm/node.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ function mt:copy()
397397
return vm.createNode(self)
398398
end
399399

400-
---@param source vm.object | vm.variable
400+
---@param source vm.node.object | vm.generic
401401
---@param node vm.node | vm.node.object
402402
---@param cover? boolean
403403
---@return vm.node
@@ -428,7 +428,7 @@ function vm.setNode(source, node, cover)
428428
return me
429429
end
430430

431-
---@param source vm.object | vm.variable
431+
---@param source vm.node.object
432432
---@return vm.node?
433433
function vm.getNode(source)
434434
return vm.nodeCache[source]

script/vm/sign.lua

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,11 @@ function mt:resolve(uri, args)
193193
goto CONTINUE
194194
end
195195
end
196-
local view = vm.viewObject(obj, uri)
196+
if obj.type == 'variable'
197+
or obj.type == 'local' then
198+
goto CONTINUE
199+
end
200+
local view = vm.getInfer(obj):view(uri)
197201
if view then
198202
knownTypes[view] = true
199203
end
@@ -219,7 +223,7 @@ function mt:resolve(uri, args)
219223
goto CONTINUE
220224
end
221225
end
222-
local view = vm.viewObject(n, uri)
226+
local view = vm.getInfer(n):view(uri)
223227
if knownTypes[view] then
224228
goto CONTINUE
225229
end

script/vm/type.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,14 +724,14 @@ function vm.viewTypeErrorMessage(uri, errs)
724724
lparams[paramName] = 'table'
725725
elseif value.type == 'generic' then
726726
---@cast value vm.generic
727-
lparams[paramName] = vm.viewObject(value, uri)
727+
lparams[paramName] = vm.getInfer(value):view(uri)
728728
elseif value.type == 'variable' then
729729
else
730730
---@cast value -string, -vm.global, -vm.node, -vm.generic, -vm.variable
731731
if paramName == 'key' then
732732
lparams[paramName] = vm.viewKey(value, uri)
733733
else
734-
lparams[paramName] = vm.viewObject(value, uri)
734+
lparams[paramName] = vm.getInfer(value):view(uri)
735735
or vm.getInfer(value):view(uri)
736736
end
737737
end

test/type_inference/init.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2552,21 +2552,21 @@ end
25522552
print(<?x?>)
25532553
]]
25542554

2555-
TEST 'table<unknown, true>' [[
2555+
TEST 'table<xxx, true>' [[
25562556
---@alias xxx table<xxx, true>
25572557
25582558
---@type xxx
25592559
local <?t?>
25602560
]]
25612561

2562-
TEST 'unknown[][]' [[
2562+
TEST 'xxx[][]' [[
25632563
---@alias xxx xxx[]
25642564
25652565
---@type xxx
25662566
local <?t?>
25672567
]]
25682568

2569-
TEST 'fun(x: fun(x: unknown))' [[
2569+
TEST 'fun(x: fun(x: xxx))' [[
25702570
---@alias xxx fun(x: xxx)
25712571
25722572
---@type xxx

0 commit comments

Comments
 (0)