LuaLS / LuaLS/lua-language-server

@overload not as expected check param in class instance

Open
#2,576 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Lua
Stars
4.4k
Forks
442
PR merge metrics
No merged PRs in 30d

Description

### 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

```lua
---@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.
```lua
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:
```lua
MyClass.property {
name = {
get = function(self)
return self._name
end,
set = function(self, value)
self._name = value
end,
}
}
```
### Log File

_No response_

Contributor guide

Open the contributing guide

Research direction

Start with the provided Lua reproduction and inspect how the language server resolves @overload on __call metamethods and colon-versus-dot calls. Done when the colon call reports the extra self argument while the dot call remains valid, with coverage for both forms.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.