LuaLS / LuaLS/lua-language-server
@overload not as expected check param in class instance
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?
Annotations
Expected Behaviour
当一个类通过@overload定义了__call元方法。
当它的一个实例以__call的形式被调用,应该检测参数是否正确。
When a class defines a __call metamethod via @overload.
When one of its instances is called as __call, the argument should be checked to see if it is correct.
Actual Behaviour
被正确地识别为了一个函数,但是没有检测其参数是否正确。
Is correctly identified as a function, but its arguments are not checked for correctness.
Reproduction steps
---@class Callable
---@overload fun(tbl:table)
local Callable = {}
Callable.__index = Callable
---@return Callable
function Callable:extend()
return setmetatable({ __index = self, __call = self.__call }, self)
return
function Callable:__call(tbl)
for key, value in pairs(tbl) do
print(key)
end
end
-- other lua file
local instance = { }
instance.callable = Callable:extend()
instance:callable { a=1, b=2 } -- A warning should be thrown here because `instance` is passed in as the first argument (self).
instance.callable { a=1, b=2 } -- Correct call.
Additional Notes
一个临时的解决方法:再次进行类型的声明。
Temporary workaround: Type declaration again.
local instance = { }
---@overload fun(tbl:table)
instance.callable = Callable:extend() --[[@as function]]
instance:callable { a=1, b=2 } -- A warning.
instance.callable { a=1, b=2 } -- Correct call.
我是在实现一个C#风格的Seter和Geter时发现的,我定义了一个Property类,子类会继承父类的Property。
为了使代码更加简洁,我定义了Property类的__call元方法,使得我可以以这样的风格进行声明:
I discovered this when implementing a C# style Seter and Geter, and I defined a Property class where subclasses inherit the Property of the parent class.
To make the code more concise, I define the __call metamethod of the Property class so that I can declare it in this style:
MyClass.property {
name = {
get = function(self)
return self._name
end,
set = function(self, value)
self._name = value
end,
}
}
Log File
No response
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza con la reproducción de Lua proporcionada e inspecciona cómo el servidor de lenguaje resuelve @overload en metamétodos __call y las llamadas con dos puntos frente a las llamadas con punto. Está terminado cuando la llamada con dos puntos informe del argumento self adicional, mientras la llamada con punto siga siendo válida, con cobertura para ambas formas.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- lua
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100