LuaLS / LuaLS/lua-language-server

[Bug] Union when combine table with classified type. Attributes of table are hidden.

Aberta
#2,414 0 comentários 0 reações 0 responsáveis Ver no GitHub

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
local data = {}
function data:set(k, v)
  rawset(self, k, v)
end

--- @class Person
local Person = {}
function Person:speak() end

--- @generic T
--- @param t T
--- @return T|Person
function merge(t, p)
-- ...
end

local m = merge(data, Person)
m:set -- Completion should show [set(k, v)] 应该提示 set(k,v),对应 data:set(k,v)
Actual Behaviour
local data = {}
function data:set()
end

--- @class Person
local Person = {}
function Person:speak() end

--- @generic T
--- @param t T
--- @return T|Person
function merge(t, p)
-- ...
end

local m = merge(data, Person)
m:set -- doesn't complete this method, 没显示,只有一个单纯的文本补全

But .... 但是... 你换成 {} 而不去声明 @class Person 倒是会有的

local data = {}
function data:set()
end

local Person = {}
function Person:speak() end

--- @generic T
--- @param t T
--- @return T|{speak: function}  !!!!! See here !!! 看这里,换成纯粹的 table 到会有  
function merge(t, p)
-- ...
end

local m = merge(data, Person)
m:set -- Completion is right and show [set(k,v)],补全正常显示

I guess the @class Person hides the origin type.

我认为 @class Person 把原本的 data 表 属性都给给覆盖掉了。

而且还有个诡异现象,如果 data 给一些 默认值:

local data = {value = 123}

不管哪种方式 都能把 默认属性 给补出来。

这很明显这个 luals 的 union 组合有 bug!

Reproduction steps

See obove

Additional Notes

No response

Log File

No response

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Reproduza o problema na extensão do Visual Studio Code usando os exemplos de Lua fornecidos, comparando a união com @class Person com o tipo de tabela inline. Rastreie a verificação de tipos e o tratamento de completion para o resultado de merge quando m:set for consultado. Considera-se concluído quando a completion inclui data:set, mantendo os membros de Person, como speak.

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

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.