Skip to content

Commit ea1c519

Browse files
committed
fix #1218 don't compile for in local
would prevent compiling for other keys
1 parent 2dd1bdb commit ea1c519

File tree

5 files changed

+90
-38
lines changed

5 files changed

+90
-38
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* `FIX` [#1213](https://github.com/sumneko/lua-language-server/issues/1213)
55
* `FIX` [#1215](https://github.com/sumneko/lua-language-server/issues/1215)
66
* `FIX` [#1217](https://github.com/sumneko/lua-language-server/issues/1217)
7+
* `FIX` [#1218](https://github.com/sumneko/lua-language-server/issues/1218)
78

89
## 3.3.0
910
`2022-6-15`

script/parser/guide.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ local type = type
1313
---@field args parser.object[]
1414
---@field locals parser.object[]
1515
---@field returns parser.object[]
16+
---@field exps parser.object[]
17+
---@field keys parser.object[]
1618
---@field uri uri
1719
---@field start integer
1820
---@field finish integer

script/vm/compiler.lua

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,44 @@ function vm.compileCallArg(arg, call, index)
846846
return vm.getNode(arg)
847847
end
848848

849+
---@class parser.object
850+
---@field _iterator? table
851+
---@field _iterArgs? table
852+
---@field _iterVars? table<parser.object, vm.node>
853+
854+
---@param source parser.object
855+
local function compileForVars(source)
856+
if source._iterator then
857+
return
858+
end
859+
-- for k, v in pairs(t) do
860+
--> for k, v in iterator, status, initValue do
861+
--> local k, v = iterator(status, initValue)
862+
source._iterator = {
863+
type = 'dummyfunc',
864+
parent = source,
865+
}
866+
source._iterArgs = {{},{}}
867+
source._iterVars = {}
868+
-- iterator
869+
selectNode(source._iterator, source.exps, 1)
870+
-- status
871+
selectNode(source._iterArgs[1], source.exps, 2)
872+
-- initValue
873+
selectNode(source._iterArgs[2], source.exps, 3)
874+
if source.keys then
875+
for i, loc in ipairs(source.keys) do
876+
local node = getReturn(source._iterator, i, source._iterArgs)
877+
if node then
878+
if i == 1 then
879+
node:removeOptional()
880+
end
881+
source._iterVars[loc] = node
882+
end
883+
end
884+
end
885+
end
886+
849887
---@param source parser.object
850888
---@return vm.node
851889
local function compileLocal(source)
@@ -917,12 +955,18 @@ local function compileLocal(source)
917955
end
918956
-- for x in ... do
919957
if source.parent.type == 'in' then
920-
vm.compileNode(source.parent)
958+
compileForVars(source.parent)
959+
local keyNode = source.parent._iterVars[source]
960+
if keyNode then
961+
vm.setNode(source, keyNode)
962+
end
921963
end
922964

923965
-- for x = ... do
924966
if source.parent.type == 'loop' then
925-
vm.compileNode(source.parent)
967+
if source.parent.loc == source then
968+
vm.setNode(source, vm.declareGlobal('type', 'integer'))
969+
end
926970
end
927971

928972
vm.getNode(source):setData('hasDefined', hasMarkDoc or hasMarkParam or hasMarkValue)
@@ -1411,42 +1455,6 @@ local compilerSwitch = util.switch()
14111455
end
14121456
vm.setNode(source, node)
14131457
end)
1414-
: case 'in'
1415-
: call(function (source)
1416-
if not source._iterator then
1417-
-- for k, v in pairs(t) do
1418-
--> for k, v in iterator, status, initValue do
1419-
--> local k, v = iterator(status, initValue)
1420-
source._iterator = {
1421-
type = 'dummyfunc',
1422-
parent = source,
1423-
}
1424-
source._iterArgs = {{},{}}
1425-
end
1426-
-- iterator
1427-
selectNode(source._iterator, source.exps, 1)
1428-
-- status
1429-
selectNode(source._iterArgs[1], source.exps, 2)
1430-
-- initValue
1431-
selectNode(source._iterArgs[2], source.exps, 3)
1432-
if source.keys then
1433-
for i, loc in ipairs(source.keys) do
1434-
local node = getReturn(source._iterator, i, source._iterArgs)
1435-
if node then
1436-
if i == 1 then
1437-
node:removeOptional()
1438-
end
1439-
vm.setNode(loc, node)
1440-
end
1441-
end
1442-
end
1443-
end)
1444-
: case 'loop'
1445-
: call(function (source)
1446-
if source.loc then
1447-
vm.setNode(source.loc, vm.declareGlobal('type', 'integer'))
1448-
end
1449-
end)
14501458
: case 'doc.type'
14511459
: call(function (source)
14521460
for _, typeUnit in ipairs(source.types) do

test/tclient/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ require 'tclient.tests.load-library'
66
require 'tclient.tests.files-associations'
77
require 'tclient.tests.resolve-completion'
88
require 'tclient.tests.performance-jass-common'
9+
require 'tclient.tests.hover-pairs'

test/tclient/tests/hover-pairs.lua

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
local lclient = require 'lclient'
2+
local ws = require 'workspace'
3+
local await = require 'await'
4+
5+
---@async
6+
lclient():start(function (client)
7+
client:registerFakers()
8+
client:initialize()
9+
10+
client:notify('textDocument/didOpen', {
11+
textDocument = {
12+
uri = 'file://test.lua',
13+
languageId = 'lua',
14+
version = 0,
15+
text = [[
16+
local t ---@type table<string, number>
17+
for key, value in pairs(t) do
18+
print(key, value) --key or value is unknown
19+
end
20+
]]
21+
}
22+
})
23+
24+
ws.awaitReady()
25+
26+
await.sleep(0.1)
27+
28+
local hover1 = client:awaitRequest('textDocument/hover', {
29+
textDocument = { uri = 'file://test.lua' },
30+
position = { line = 2, character = 11 },
31+
})
32+
33+
local hover2 = client:awaitRequest('textDocument/hover', {
34+
textDocument = { uri = 'file://test.lua' },
35+
position = { line = 2, character = 17 },
36+
})
37+
38+
assert(hover1.contents.value:find 'string')
39+
assert(hover2.contents.value:find 'number')
40+
end)

0 commit comments

Comments
 (0)