LuaLS / LuaLS/lua-language-server

@overload not as expected check param in class instance

Ouverte
#2,576 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Lua
Étoiles
4.4k
Forks
442
Métriques de merge des PR
Aucune PR mergée en 30 j

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_

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par la reproduction Lua fournie et examinez comment le serveur de langage résout @overload sur les métaméthodes __call et les appels avec deux-points par rapport aux appels avec un point. C’est terminé lorsque l’appel avec deux-points signale l’argument self supplémentaire tandis que l’appel avec un point reste valide, avec une couverture des deux formes.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
lua
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.