LuaLS / LuaLS/lua-language-server
Generics don't expand alias types/don't work with other parameters
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Lua
- Estrelas
- 4.4k
- Forks
- 442
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Descrição
How are you using the lua-language-server?
Visual Studio Code Extension (sumneko.lua)
Which OS are you using?
Windows
What is the issue affecting?
Type Checking
Expected Behaviour
With a code sample like this:
---@alias TestFunction fun(abc: string): integer
---@generic T
---@param name `T`
---@param func T
local function testSecond(name, func) end
testSecond("TestFunction", function(abc) end)
I would expect abc to have a type of string, and the function to be type checked and require a return.
Actual Behaviour
Instead, abc has the any type and the function requires no return.
I further tested with a different code sample:
---@alias TestFunction fun(abc: string): integer
---@generic T
---@param name `T`
---@return T
local function testSecond(name, func) return function(abc) end end
local cool = testSecond("TestFunction", function(abc) end)
cool()
This shows no warnings and does not require me to pass any arguments to cool(), which is incorrect. Hovering over cool provides a type of 'TestFunction' and does not show the full expanded type of the alias, unlike other variables with a type of an alias. That rings the same with this code sample I also tested:
---@alias TestFunction fun(abc: string): integer
---@generic T
---@param name `T`
---@param func fun(cool: T)
local function testSecond(name, func) end
testSecond("TestFunction", function(abc) end)
where hovering over abc provides me with a 'TestFunction' unexpanded type.
However, correct behavior is seen with the following code sample using the base string type;
---@alias TestFunction fun(abc: string): integer
---@generic T
---@param name `T`
---@param func fun(cool: T)
---@return T
local function testSecond(name, func) end
local cool = testSecond("string", function(abc) abc.cool = "hi" end)
local testfind = cool:find("test")
Autocomplete is provided for :find() and abc.cool = "hi" throws the correct warning for field injection.
And most confusing of all, this code sample behaves in line with expected behavior, and the alias is fully expanded.
---@alias TestFunction fun(abc: string): integer
---@generic T
---@param name `T`
---@param func fun(cool: T)
---@return T
local function testSecond(name, func) end
local cool = testSecond("TestFunction",
---@param abc TestFunction
function(abc)
abc()
end
)
This also doesn't work, which I kind of expected. (no warnings)
Reproduction steps
- Paste code into project with Lua LSP on, see issue
Additional Notes
No response
Log File
No response
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece reproduzindo os exemplos na Visual Studio Code Extension com LuaLS, concentrando-se na verificação de tipos para parâmetros genéricos e aliased function types. Compare os casos que usam TestFunction com aqueles que usam o tipo base string. A tarefa estará concluída quando os aliases forem expandidos de forma consistente, os parâmetros de callback receberem os tipos esperados e chamadas inválidas ou retornos ausentes produzirem avisos.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- lua
- Domínio
- devtools
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 38/100