LuaLS / LuaLS/lua-language-server

@overload not as expected check param in class instance

Đang mở
#2,576 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Lua
Star
4.4k
Fork
442
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu với bản tái hiện Lua được cung cấp và kiểm tra cách language server phân giải @overload trên các metamethod __call và các lệnh gọi dùng dấu hai chấm so với các lệnh gọi dùng dấu chấm. Hoàn tất khi lệnh gọi dùng dấu hai chấm báo cáo đối số self bổ sung, trong khi lệnh gọi dùng dấu chấm vẫn hợp lệ, với độ bao phủ cho cả hai dạng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
lua
Lĩnh vực
devtools
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
42/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.