lua-language-server icon indicating copy to clipboard operation
lua-language-server copied to clipboard

The class is not defined if the table is called as a function

Open RomanSpector opened this issue 3 years ago • 3 comments

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?

Type Checking

Expected Behaviour

image

Actual Behaviour

image

Reproduction steps

---@class flag96
flag96 =
{
    part = { 0, 0, 0 };
}
setmetatable(flag96, flag96);

---@param p1? integer
---@param p2? integer
---@param p3? integer
---@return flag96
function flag96:__call( p1, p2, p3)
    local part = {};
    part[1] = p1 or 0;
    part[2] = p2 or 0;
    part[3] = p3 or 0;
    return setmetatable(part, { __index = self });
end

local flags = flag96(1, 2, 3);

Additional Notes

No response

Log File

No response

RomanSpector avatar Aug 19 '22 21:08 RomanSpector

Use:

---@class flag96
---@overload fun(p1?: integer, p2?: integer, p3?: integer):flag96

sumneko avatar Aug 20 '22 07:08 sumneko

image

---@class AAA
---@field value boolean
---@overload fun(): boolean
local AAA = {};

---@class BBB
local BBB = {};

---@return BBB
function BBB:new() end

---@return AAA
function BBB:add() end

local bbb = BBB:new();
local aaa = bbb:add();

local result = aaa();

RomanSpector avatar Sep 05 '22 17:09 RomanSpector

I have an even more odd workaround:

---@class AAA
---@field value boolean
---@operator call:boolean
local AAA = {};

---@class BBB
local BBB = {};

---@return BBB
function BBB:new() end

---@return AAA
function BBB:add() end

local bbb = BBB:new();
local aaa = bbb:add();

local result = aaa();

I set the __call metamethod to return a boolean by using @operator. ~~It seems that @operator requires at least one parameter so I just set it to _~~ Turns out you don't need the () at all 🥴

carsakiller avatar Sep 13 '22 01:09 carsakiller