LuaLS / LuaLS/lua-language-server

Class inheriting a generic class with specified type not recognized as inherited class (assign-type-mismatch)

Abierto
#3,345 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Lua
Estrellas
4.4k
Forks
442
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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

The type of a class inheriting a generic class (when specifying the type) should be recognized as the same type as the class it inherits.
If that generic class inherits another class, that should also be recognized.
As such, the following code should have no problems.

--- @class Test_Base
--- @field Str_A string
local Test_Base = {}

--- @generic T
--- @class Test_Generic<T> : Test_Base
--- @field Gen_T T
local Test_Generic = {}

--- @class Test_Class : Test_Generic<string>
local Test_Class = {}

--- @type Test_Base[]
local testArray = {
    Test_Base,
    Test_Generic,
    Test_Class,
}
Actual Behaviour

"Test_Class" isn't recognized as either "Test_Generic" or "Test_Base", therefore showing as an "assign-type-mismatch" error.

Image

However, inheriting the generic class without specifying the type is completely fine.

--- @class Test_Base
--- @field Str_A string
local Test_Base = {}

--- @generic T
--- @class Test_Generic<T> : Test_Base
--- @field Gen_T T
local Test_Generic = {}

--- @class Test_Class : Test_Generic
local Test_Class = {}

--- @type Test_Base[]
local testArray = {
    Test_Base,
    Test_Generic,
    Test_Class,
}
Reproduction steps
--- @class Test_Base
--- @field Str_A string
local Test_Base = {}

--- @generic T
--- @class Test_Generic<T> : Test_Base
--- @field Gen_T T
local Test_Generic = {}

--- @class Test_Class1 : Test_Generic<string>
local Test_Class1 = {}

--- @class Test_Class2 : Test_Generic
local Test_Class2 = {}

--- @type Test_Base[]
local testArray = {
    Test_Base,
    Test_Generic,
    Test_Class1,
    Test_Class2,
}
Additional Notes

This problem showed up after the release of version 3.17.0

I know that the implementation of generics is complicated, and I've already found a workaround for my use-case by casting the inheriting classes to the type of the underlying base class. But that may not work for others.

Log File

No response

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza con la reproducción en Lua del issue y pásala por la comprobación de tipos de la extensión de Visual Studio Code para observar el diagnóstico assign-type-mismatch. Rastrea el manejo de la herencia de clases genéricas y, a continuación, verifica que Test_Class1 se acepta tanto como Test_Generic como como Test_Base, incluido el caso de herencia transitiva, mientras el comportamiento existente de Test_Class2 sigue siendo válido.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
lua
Área
tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.