Skip to content

Commit 2896105

Browse files
committed
resolve #1112
only show signatures matching the entered parameters
1 parent 40f1c26 commit 2896105

File tree

4 files changed

+121
-41
lines changed

4 files changed

+121
-41
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
--![](image.png) --> will convert to `--![](file:///xxxx/image.png)`
4646
local x
4747
```
48+
* `CHG` signature: only show signatures matching the entered parameters
4849
* `FIX` [#880](https://github.com/sumneko/lua-language-server/issues/880)
4950
* `FIX` [#1284](https://github.com/sumneko/lua-language-server/issues/1284)
5051
* `FIX` [#1292](https://github.com/sumneko/lua-language-server/issues/1292)

script/core/signature.lua

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,27 +68,30 @@ local function makeOneSignature(source, oop, index)
6868
}
6969
end
7070
-- 不定参数
71-
if index > i and i > 0 then
71+
if index and index > i and i > 0 then
7272
local lastLabel = params[i].label
7373
local text = label:sub(lastLabel[1] + 1, lastLabel[2])
7474
if text:sub(1, 3) == '...' then
7575
index = i
7676
end
7777
end
78+
if #params < (index or 0) then
79+
return nil
80+
end
7881
return {
7982
label = label,
8083
params = params,
81-
index = index,
84+
index = index or 1,
8285
description = hoverDesc(source),
8386
}
8487
end
8588

8689
---@async
8790
local function makeSignatures(text, call, pos)
88-
local node = call.node
89-
local oop = node.type == 'method'
90-
or node.type == 'getmethod'
91-
or node.type == 'setmethod'
91+
local func = call.node
92+
local oop = func.type == 'method'
93+
or func.type == 'getmethod'
94+
or func.type == 'setmethod'
9295
local index
9396
if call.args then
9497
local args = {}
@@ -124,13 +127,13 @@ local function makeSignatures(text, call, pos)
124127
index = #args
125128
end
126129
end
127-
else
128-
index = 1
129130
end
130131
local signs = {}
131-
local defs = vm.getDefs(node)
132+
local node = vm.compileNode(func)
133+
---@type vm.node
134+
node = node:getData 'originNode' or node
132135
local mark = {}
133-
for _, src in ipairs(defs) do
136+
for src in node:eachObject() do
134137
if src.type == 'function'
135138
or src.type == 'doc.type.function' then
136139
if not mark[src] then
@@ -159,5 +162,8 @@ return function (uri, pos)
159162
if not signs or #signs == 0 then
160163
return nil
161164
end
165+
table.sort(signs, function (a, b)
166+
return #a.params < #b.params
167+
end)
162168
return signs
163169
end

script/vm/compiler.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@ local function matchCall(source)
559559
if needRemove then
560560
local newNode = myNode:copy()
561561
newNode:removeNode(needRemove)
562+
newNode:setData('originNode', myNode)
562563
vm.setNode(source, newNode, true)
563564
end
564565
end

test/signature/init.lua

Lines changed: 103 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@ rawset(_G, 'TEST', true)
88
function TEST(script)
99
return function (expect)
1010
local newScript, catched1 = catch(script, '?')
11-
local newExpect, catched2 = catch(expect or '', '!')
1211
files.setText('', newScript)
1312
local hovers = core('', catched1['?'][1][1])
1413
if hovers then
15-
assert(expect)
16-
local hover = hovers[#hovers]
17-
18-
local arg = hover.params[hover.index].label
19-
20-
assert(newExpect == hover.label)
21-
assert(catched2['!'][1][1] == arg[1])
22-
assert(catched2['!'][1][2] == arg[2])
14+
assert(#hovers == #expect)
15+
for i, hover in ipairs(hovers) do
16+
local newExpect, catched2 = catch(expect[i], '!')
17+
local arg = hover.params[hover.index]
18+
19+
assert(newExpect == hover.label)
20+
if arg then
21+
assert(catched2['!'][1] ~= nil)
22+
assert(catched2['!'][1][1] == arg.label[1])
23+
assert(catched2['!'][1][2] == arg.label[2])
24+
else
25+
assert(#catched2['!'] == 0)
26+
end
27+
end
2328
else
2429
assert(expect == nil)
2530
end
@@ -33,39 +38,39 @@ end
3338
3439
x(<??>
3540
]]
36-
'function x(<!a: any!>, b: any)'
41+
{'function x(<!a: any!>, b: any)'}
3742

3843
TEST [[
3944
local function x(a, b)
4045
end
4146
4247
x(<??>)
4348
]]
44-
'function x(<!a: any!>, b: any)'
49+
{'function x(<!a: any!>, b: any)'}
4550

4651
TEST [[
4752
local function x(a, b)
4853
end
4954
5055
x(xxx<??>)
5156
]]
52-
'function x(<!a: any!>, b: any)'
57+
{'function x(<!a: any!>, b: any)'}
5358

5459
TEST [[
5560
local function x(a, b)
5661
end
5762
5863
x(xxx, <??>)
5964
]]
60-
'function x(a: any, <!b: any!>)'
65+
{'function x(a: any, <!b: any!>)'}
6166

6267
TEST [[
6368
function mt:f(a)
6469
end
6570
6671
mt:f(<??>
6772
]]
68-
'(method) mt:f(<!a: any!>)'
73+
{'(method) mt:f(<!a: any!>)'}
6974

7075
TEST [[
7176
local function x(a, b)
@@ -74,7 +79,7 @@ end
7479
7580
x(<??>
7681
]]
77-
'function x(<!a: any!>, b: any)'
82+
{'function x(<!a: any!>, b: any)'}
7883

7984
TEST [[
8085
local function x(a, ...)
@@ -83,12 +88,12 @@ end
8388
8489
x(1, 2, 3, <??>
8590
]]
86-
'function x(a: any, <!...any!>)'
91+
{'function x(a: any, <!...any!>)'}
8792

8893
TEST [[
8994
(''):sub(<??>
9095
]]
91-
'(method) string:sub(<!i: integer!>, j?: integer)'
96+
{'(method) string:sub(<!i: integer!>, j?: integer)'}
9297

9398
TEST [[
9499
(''):sub(1)<??>
@@ -101,7 +106,7 @@ end
101106
102107
f(1, 'string<??>')
103108
]]
104-
'function f(a: any, <!b: any!>, c: any)'
109+
{'function f(a: any, <!b: any!>, c: any)'}
105110

106111
TEST [[
107112
pcall(function () <??> end)
@@ -118,7 +123,7 @@ TEST [[
118123
local zzzz
119124
zzzz(<??>)
120125
]]
121-
'function zzzz(<!x: number!>, y: number)'
126+
{'function zzzz(<!x: number!>, y: number)'}
122127

123128
TEST [[
124129
('abc'):format(f(<??>))
@@ -132,7 +137,7 @@ end
132137
133138
Foo(<??>)
134139
]]
135-
'function Foo(<!param01: any!>, param02: any)'
140+
{'function Foo(<!param01: any!>, param02: any)'}
136141

137142
TEST [[
138143
function f1(a, b)
@@ -143,29 +148,29 @@ end
143148
144149
f2(f1(),<??>)
145150
]]
146-
'function f2(c: any, <!d: any!>)'
151+
{'function f2(c: any, <!d: any!>)'}
147152

148153
TEST [[
149154
local function f(a, b, c)
150155
end
151156
152157
f({},<??>)
153158
]]
154-
'function f(a: any, <!b: any!>, c: any)'
159+
{'function f(a: any, <!b: any!>, c: any)'}
155160

156161
TEST [[
157162
for _ in pairs(<??>) do
158163
end
159164
]]
160-
'function pairs(<!t: <T>!>)'
165+
{'function pairs(<!t: <T>!>)'}
161166

162167
TEST [[
163168
function m:f()
164169
end
165170
166171
m.f(<??>)
167172
]]
168-
'function m.f(<!self: any!>)'
173+
{'function m.f(<!self: any!>)'}
169174

170175
TEST [[
171176
---@alias nnn table<number, string>
@@ -175,39 +180,39 @@ local function f(x, y, z) end
175180
176181
f(<??>)
177182
]]
178-
'function f(<!x: table<number, string>!>, y: any, z: any)'
183+
{'function f(<!x: table<number, string>!>, y: any, z: any)'}
179184

180185
TEST [[
181186
local function x(a, b)
182187
end
183188
184189
x( aaaa <??>, 2)
185190
]]
186-
"function x(<!a: any!>, b: any)"
191+
{"function x(<!a: any!>, b: any)"}
187192

188193
TEST [[
189194
local function x(a, b)
190195
end
191196
192197
x(<??> aaaa , 2)
193198
]]
194-
'function x(<!a: any!>, b: any)'
199+
{'function x(<!a: any!>, b: any)'}
195200

196201
TEST [[
197202
local function x(a, b)
198203
end
199204
200205
x(aaaa ,<??> 2)
201206
]]
202-
'function x(a: any, <!b: any!>)'
207+
{'function x(a: any, <!b: any!>)'}
203208

204209
TEST [[
205210
local function x(a, b)
206211
end
207212
208213
x(aaaa , 2 <??>)
209214
]]
210-
'function x(a: any, <!b: any!>)'
215+
{'function x(a: any, <!b: any!>)'}
211216

212217
TEST [[
213218
local fooC
@@ -221,10 +226,77 @@ fooC(function (x, s)
221226
222227
end,<??>)
223228
]]
224-
'function fooC(callback: fun(x: number, s: string):nil, <!par: number!>)'
229+
{'function fooC(callback: fun(x: number, s: string):nil, <!par: number!>)'}
225230

226231
TEST [[
227232
(function (a, b)
228233
end)(<??>)
229234
]]
230-
'function (<!a: any!>, b: any)'
235+
{'function (<!a: any!>, b: any)'}
236+
237+
TEST [[
238+
function X() end
239+
240+
---@param a number
241+
function X(a) end
242+
243+
---@param a number
244+
---@param b number
245+
function X(a, b) end
246+
247+
X(<??>)
248+
]]
249+
{
250+
'function X()',
251+
'function X(<!a: number!>)',
252+
'function X(<!a: number!>, b: number)',
253+
}
254+
255+
TEST [[
256+
function X() end
257+
258+
---@param a number
259+
function X(a) end
260+
261+
---@param a number
262+
---@param b number
263+
function X(a, b) end
264+
265+
X(<?1?>)
266+
]]
267+
{
268+
'function X(<!a: number!>)',
269+
'function X(<!a: number!>, b: number)',
270+
}
271+
272+
TEST [[
273+
function X() end
274+
275+
---@param a number
276+
function X(a) end
277+
278+
---@param a number
279+
---@param b number
280+
function X(a, b) end
281+
282+
X(1, <??>)
283+
]]
284+
{
285+
'function X(a: number, <!b: number!>)',
286+
}
287+
288+
TEST [[
289+
function X() end
290+
291+
---@param a number
292+
function X(a) end
293+
294+
---@param a number
295+
---@param b number
296+
function X(a, b) end
297+
298+
X(1, <?2?>)
299+
]]
300+
{
301+
'function X(a: number, <!b: number!>)',
302+
}

0 commit comments

Comments
 (0)