Skip to content

Commit f732640

Browse files
committed
fix #1273
1 parent 1b23b28 commit f732640

File tree

4 files changed

+73
-22
lines changed

4 files changed

+73
-22
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* `FIX` [#1256](https://github.com/sumneko/lua-language-server/issues/1256)
77
* `FIX` [#1257](https://github.com/sumneko/lua-language-server/issues/1257)
88
* `FIX` [#1269](https://github.com/sumneko/lua-language-server/issues/1269)
9+
* `FIX` [#1273](https://github.com/sumneko/lua-language-server/issues/1273)
910
* `FIX` [#1275](https://github.com/sumneko/lua-language-server/issues/1275)
1011

1112
## 3.4.0

script/vm/sign.lua

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function mt:resolve(uri, args, removeGeneric)
5151
end
5252
if n.type == 'doc.type.table' then
5353
-- { [integer]: number } -> T[]
54-
local tvalueNode = vm.getTableValue(uri, node, 'integer')
54+
local tvalueNode = vm.getTableValue(uri, node, 'integer', true)
5555
if tvalueNode then
5656
resolve(object.node, tvalueNode)
5757
end
@@ -76,8 +76,8 @@ function mt:resolve(uri, args, removeGeneric)
7676
end
7777
if firstField.type == 'doc.generic.name' and firstValue.type == 'doc.generic.name' then
7878
-- { [number]: number} -> { [K]: V }
79-
local tfieldNode = vm.getTableKey(uri, node, 'any')
80-
local tvalueNode = vm.getTableValue(uri, node, 'any')
79+
local tfieldNode = vm.getTableKey(uri, node, 'any', true)
80+
local tvalueNode = vm.getTableValue(uri, node, 'any', true)
8181
if tfieldNode then
8282
resolve(firstField, tfieldNode)
8383
end
@@ -87,13 +87,13 @@ function mt:resolve(uri, args, removeGeneric)
8787
else
8888
if ufieldNode:get(1).type == 'doc.generic.name' then
8989
-- { [number]: number}|number[] -> { [K]: number }
90-
local tnode = vm.getTableKey(uri, node, uvalueNode)
90+
local tnode = vm.getTableKey(uri, node, uvalueNode, true)
9191
if tnode then
9292
resolve(firstField, tnode)
9393
end
9494
elseif uvalueNode:get(1).type == 'doc.generic.name' then
9595
-- { [number]: number}|number[] -> { [number]: V }
96-
local tnode = vm.getTableValue(uri, node, ufieldNode)
96+
local tnode = vm.getTableValue(uri, node, ufieldNode, true)
9797
if tnode then
9898
resolve(firstValue, tnode)
9999
end

script/vm/type.lua

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,23 @@ end
192192
---@param uri uri
193193
---@param tnode vm.node
194194
---@param knode vm.node|string
195+
---@param inversion? boolean
195196
---@return vm.node?
196-
function vm.getTableValue(uri, tnode, knode)
197+
function vm.getTableValue(uri, tnode, knode, inversion)
197198
local result = vm.createNode()
198199
for tn in tnode:eachObject() do
199200
if tn.type == 'doc.type.table' then
200201
for _, field in ipairs(tn.fields) do
201202
if field.name.type ~= 'doc.field.name'
202-
and vm.isSubType(uri, vm.compileNode(field.name), knode) then
203-
if field.extends then
204-
result:merge(vm.compileNode(field.extends))
203+
and field.extends then
204+
if inversion then
205+
if vm.isSubType(uri, vm.compileNode(field.name), knode) then
206+
result:merge(vm.compileNode(field.extends))
207+
end
208+
else
209+
if vm.isSubType(uri, knode, vm.compileNode(field.name)) then
210+
result:merge(vm.compileNode(field.extends))
211+
end
205212
end
206213
end
207214
end
@@ -211,21 +218,31 @@ function vm.getTableValue(uri, tnode, knode)
211218
end
212219
if tn.type == 'table' then
213220
for _, field in ipairs(tn) do
214-
if field.type == 'tableindex' then
215-
if field.value then
216-
result:merge(vm.compileNode(field.value))
217-
end
221+
if field.type == 'tableindex'
222+
and field.value then
223+
result:merge(vm.compileNode(field.value))
218224
end
219-
if field.type == 'tablefield' then
220-
if vm.isSubType(uri, knode, 'string') then
221-
if field.value then
225+
if field.type == 'tablefield'
226+
and field.value then
227+
if inversion then
228+
if vm.isSubType(uri, 'string', knode) then
229+
result:merge(vm.compileNode(field.value))
230+
end
231+
else
232+
if vm.isSubType(uri, knode, 'string') then
222233
result:merge(vm.compileNode(field.value))
223234
end
224235
end
225236
end
226-
if field.type == 'tableexp' then
227-
if vm.isSubType(uri, knode, 'integer') and field.tindex == 1 then
228-
if field.value then
237+
if field.type == 'tableexp'
238+
and field.value
239+
and field.tindex == 1 then
240+
if inversion then
241+
if vm.isSubType(uri, 'integer', knode) then
242+
result:merge(vm.compileNode(field.value))
243+
end
244+
else
245+
if vm.isSubType(uri, knode, 'integer') then
229246
result:merge(vm.compileNode(field.value))
230247
end
231248
end
@@ -242,16 +259,23 @@ end
242259
---@param uri uri
243260
---@param tnode vm.node
244261
---@param vnode vm.node|string|vm.object
262+
---@param inversion? boolean
245263
---@return vm.node?
246-
function vm.getTableKey(uri, tnode, vnode)
264+
function vm.getTableKey(uri, tnode, vnode, inversion)
247265
local result = vm.createNode()
248266
for tn in tnode:eachObject() do
249267
if tn.type == 'doc.type.table' then
250268
for _, field in ipairs(tn.fields) do
251269
if field.name.type ~= 'doc.field.name'
252270
and field.extends then
253-
if vm.isSubType(uri, vm.compileNode(field.extends), vnode) then
254-
result:merge(vm.compileNode(field.name))
271+
if inversion then
272+
if vm.isSubType(uri, vm.compileNode(field.extends), vnode) then
273+
result:merge(vm.compileNode(field.name))
274+
end
275+
else
276+
if vm.isSubType(uri, vnode, vm.compileNode(field.extends)) then
277+
result:merge(vm.compileNode(field.name))
278+
end
255279
end
256280
end
257281
end

test/type_inference/init.lua

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3324,3 +3324,29 @@ _, x = pcall(f)
33243324
33253325
print(<?x?>)
33263326
]]
3327+
3328+
TEST 'string' [[
3329+
---@type table<string|number, string>
3330+
local t
3331+
3332+
---@type number
3333+
local n
3334+
---@type string
3335+
local s
3336+
3337+
local <?test?> = t[n]
3338+
local test2 = t[s] --test and test2 are unknow
3339+
]]
3340+
3341+
TEST 'string' [[
3342+
---@type table<string|number, string>
3343+
local t
3344+
3345+
---@type number
3346+
local n
3347+
---@type string
3348+
local s
3349+
3350+
local test = t[n]
3351+
local <?test2?> = t[s] --test and test2 are unknow
3352+
]]

0 commit comments

Comments
 (0)