最近写Lua的时候偶然发现可以通过文档注释然后为拟定成Class的Table进行补全。
比如说GameObject:Find(string)
这个函数,要填一个string,正常情况下是不会返回table的,如果使用了lua-ls的annotation就可以使得language server补全所要返回的东西。
---Make a GameObject
---@generic T
---@param class `T`
---@return T
function M:New(class)
---@class GameObject
local obj = { x = 0, y = 0, zIndex = 0, width = 0, height = 0, class = class, keep = false, id = M.currentID };
使用以上代码在创建Class的时候annotation里使用泛型,参数标记泛型并且使用`(backticks),具体可以参考这篇:
https://luals.github.io/wiki/annotations/#generic
在我自己写的代码中会使得class添加到一个table里:
table.insert(M.instanceList, obj);
创建实例后,在Find函数调用便能返回补全
---Find an instance by name
---@generic T
---@param name `T` # the type is captured using `T`
---@return T
function M:Find(name)
for key, value in pairs(M.instanceList) do
if (value.class == name) then
return value
end
end
return nil
end
之后只需在创建class前加上---@class
的注释标记就行了
function M:New()
---@class Circle: GameObject
local o = utility.gameObject:New("Circle")
像这样,以下代码便能用过lua-ls补全
local player = utility.gameObject:Find("Player");