Skip to content

Commit 702b592

Browse files
committed
named varargs
1 parent 7158935 commit 702b592

File tree

13 files changed

+110
-19
lines changed

13 files changed

+110
-19
lines changed

locale/en-us/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ PARSER_MISS_METHOD =
247247
'<method> expected.'
248248
PARSER_ARGS_AFTER_DOTS =
249249
'`...` should be the last arg.'
250+
PARSER_UNSUPPORT_NAMED_VARARG =
251+
'`(...name)` syntax is supported in {version}.'
250252
PARSER_KEYWORD =
251253
'<keyword> cannot be used as name.'
252254
PARSER_EXP_IN_ACTION =

locale/es-419/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ PARSER_MISS_METHOD =
241241
'Se esperaba <method>.'
242242
PARSER_ARGS_AFTER_DOTS =
243243
'`...` should be the last arg.'
244+
PARSER_UNSUPPORT_NAMED_VARARG =
245+
'La sintaxis `(...name)` es compatible con {version}.'
244246
PARSER_KEYWORD =
245247
'<keyword> cannot be used as name.'
246248
PARSER_EXP_IN_ACTION =

locale/ja-jp/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ PARSER_MISS_METHOD =
243243
'メソッド名が不足しています。'
244244
PARSER_ARGS_AFTER_DOTS =
245245
'`...` は最後の引数でなければなりません。'
246+
PARSER_UNSUPPORT_NAMED_VARARG =
247+
'`(...name)` 構文は {version} でサポートされています。'
246248
PARSER_KEYWORD =
247249
'キーワードは名前として使用できません。'
248250
PARSER_EXP_IN_ACTION =

locale/pt-br/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ PARSER_MISS_METHOD =
243243
'<method> esperado.'
244244
PARSER_ARGS_AFTER_DOTS =
245245
'`...` deve ser o último argumento.'
246+
PARSER_UNSUPPORT_NAMED_VARARG =
247+
'A sintaxe `(...name)` é suportada em {version}.'
246248
PARSER_KEYWORD =
247249
'<keyword> não pode ser usado como nome.'
248250
PARSER_EXP_IN_ACTION =

locale/zh-cn/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ PARSER_MISS_METHOD =
247247
'缺少方法名。'
248248
PARSER_ARGS_AFTER_DOTS =
249249
'`...`必须是最后一个参数。'
250+
PARSER_UNSUPPORT_NAMED_VARARG =
251+
'{version} 开始支持 `(...name)` 语法。'
250252
PARSER_KEYWORD =
251253
'关键字无法作为名称。'
252254
PARSER_EXP_IN_ACTION =

locale/zh-tw/script.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ PARSER_MISS_METHOD =
243243
'缺少方法名。'
244244
PARSER_ARGS_AFTER_DOTS =
245245
'`...` 必須是最後一個引數。'
246+
PARSER_UNSUPPORT_NAMED_VARARG =
247+
'{version} 開始支援 `(...name)` 語法。'
246248
PARSER_KEYWORD =
247249
'關鍵字無法作為名稱。'
248250
PARSER_EXP_IN_ACTION =

script/core/hover/args.lua

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,39 @@ local function asFunction(source)
1717
if arg.type == 'self' then
1818
goto CONTINUE
1919
end
20-
local name = arg.name or guide.getKeyName(arg)
21-
if name then
22-
local argNode = vm.compileNode(arg)
23-
local optional
24-
if argNode:isOptional() then
25-
optional = true
26-
argNode = argNode:copy()
27-
argNode:removeOptional()
20+
if arg.type == '...' then
21+
-- Lua 5.5: check for named vararg (...args)
22+
if arg.name then
23+
local varargName = guide.getKeyName(arg.name)
24+
args[#args+1] = ('%s%s: %s'):format(
25+
'...',
26+
varargName,
27+
vm.getInfer(arg):view(guide.getUri(source), 'any')
28+
)
29+
else
30+
args[#args+1] = ('%s%s'):format(
31+
'...',
32+
vm.getInfer(arg):view(guide.getUri(source), 'any')
33+
)
2834
end
29-
args[#args+1] = ('%s%s: %s'):format(
30-
name,
31-
optional and '?' or '',
32-
vm.getInfer(argNode):view(guide.getUri(source), 'any')
33-
)
34-
elseif arg.type == '...' then
35-
args[#args+1] = ('%s%s'):format(
36-
'...',
37-
vm.getInfer(arg):view(guide.getUri(source), 'any')
38-
)
3935
else
40-
args[#args+1] = ('%s'):format(vm.getInfer(arg):view(guide.getUri(source), 'any'))
36+
local name = arg.name or guide.getKeyName(arg)
37+
if name then
38+
local argNode = vm.compileNode(arg)
39+
local optional
40+
if argNode:isOptional() then
41+
optional = true
42+
argNode = argNode:copy()
43+
argNode:removeOptional()
44+
end
45+
args[#args+1] = ('%s%s: %s'):format(
46+
name,
47+
optional and '?' or '',
48+
vm.getInfer(argNode):view(guide.getUri(source), 'any')
49+
)
50+
else
51+
args[#args+1] = ('%s'):format(vm.getInfer(arg):view(guide.getUri(source), 'any'))
52+
end
4153
end
4254
::CONTINUE::
4355
end

script/parser/compile.lua

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,31 @@ local function parseParams(params, isLambda)
24052405
end
24062406
hasDots = true
24072407
Index = Index + 2
2408+
2409+
-- Lua 5.5: check for (...args) syntax
2410+
skipSpace()
2411+
local nextToken = Tokens[Index + 1]
2412+
if nextToken and CharMapWord[ssub(nextToken, 1, 1)] then
2413+
if State.version ~= 'Lua 5.5' then
2414+
pushError {
2415+
type = 'UNSUPPORT_NAMED_VARARG',
2416+
start = getPosition(Tokens[Index], 'left'),
2417+
finish = getPosition(Tokens[Index] + #nextToken - 1, 'right'),
2418+
version = 'Lua 5.5',
2419+
}
2420+
end
2421+
-- Create local variable for vararg
2422+
local varargName = createLocal {
2423+
start = getPosition(Tokens[Index], 'left'),
2424+
finish = getPosition(Tokens[Index] + #nextToken - 1, 'right'),
2425+
parent = params,
2426+
[1] = nextToken,
2427+
}
2428+
varargName.varargRef = vararg
2429+
vararg.name = varargName
2430+
Index = Index + 2
2431+
end
2432+
24082433
goto CONTINUE
24092434
end
24102435
if CharMapWord[ssub(token, 1, 1)] then

script/parser/guide.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ local type = type
7878
---@field dot { type: string, start: integer, finish: integer }
7979
---@field colon { type: string, start: integer, finish: integer }
8080
---@field declare? boolean
81+
---@field varargRef? boolean
8182
---@field package _root parser.object
8283
---@field package _eachCache? parser.object[]
8384
---@field package _isGlobal? boolean

script/vm/compiler.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,13 @@ end
13671367
local function compileLocal(source)
13681368
local myNode = vm.setNode(source, source)
13691369

1370+
-- Lua 5.5: named vararg (...args) -> args is table
1371+
if source.varargRef then
1372+
vm.setNode(source, vm.declareGlobal('type', 'table'))
1373+
myNode.hasDefined = true
1374+
return
1375+
end
1376+
13701377
local hasMarkDoc
13711378
if source.bindDocs then
13721379
hasMarkDoc = vm.bindDocs(source)

0 commit comments

Comments
 (0)