Skip to content

meta:support metatable #2106

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 17 commits into from
Jun 1, 2023
Merged

meta:support metatable #2106

merged 17 commits into from
Jun 1, 2023

Conversation

fesily
Copy link
Contributor

@fesily fesily commented May 11, 2023

No description provided.

@fesily
Copy link
Contributor Author

fesily commented May 11, 2023

好像没有办法添加__index字段,查找属性的时候直接就去找类定义中的‘table’类型,其实应该去找赋值__index字段的对象

@fesily fesily marked this pull request as draft May 13, 2023 00:43
@sumneko
Copy link
Collaborator

sumneko commented May 16, 2023

晚点看一下,最近没空

@fesily
Copy link
Contributor Author

fesily commented May 16, 2023

晚点看一下,最近没空

嗯,这个需要你帮助,我也看不太清楚里面的流程

现在的流程变成了优先查找setmetatable参数的doc节点,而不是comment节点.
但是我尝试修改了使用comment节点之后,eachnode的时候还是使用了doc节点.
所以我猜测使用的comment的节点还是不正确,可能还需要回溯到真正定义的位置,这个我就看不太明白了

@sumneko
Copy link
Collaborator

sumneko commented May 22, 2023

这个PR的目的是什么

@fesily
Copy link
Contributor Author

fesily commented May 22, 2023

这个PR的目的是什么

纯粹希望对metatable的字段 有智能提示,emmylua有,我也想加一个.

@sumneko
Copy link
Collaborator

sumneko commented May 22, 2023

image

我测试了一下可以提示出 __index

@fesily
Copy link
Contributor Author

fesily commented May 22, 2023

image

我测试了一下可以提示出 __index

出错的是这个

local _mt = { a=1}

local m = setmetable({},{__index=_mt})

m.a不能提示

代码里不是对__index 进行了特殊处理

@sumneko
Copy link
Collaborator

sumneko commented May 22, 2023

因为按照目前的规则,显性申明了 ---@field __index 以后我搜索时就不会再去看你传入的那张表里的 __index 字段了。可能得想办法特殊做了。

@fesily
Copy link
Contributor Author

fesily commented May 22, 2023

因为按照目前的规则,显性申明了 ---@field __index 以后我搜索时就不会再去看你传入的那张表里的 __index 字段了。可能得想办法特殊做了。

是的.优先级上doc更高

sumneko added a commit that referenced this pull request May 22, 2023
@sumneko
Copy link
Collaborator

sumneko commented May 22, 2023

解决了,拉一下最新版本吧。
另外你之前的PR产生了很多警告,尽量修复一下。

@fesily fesily marked this pull request as ready for review May 22, 2023 07:48
@fesily
Copy link
Contributor Author

fesily commented May 22, 2023

解决了,拉一下最新版本吧。 另外你之前的PR产生了很多警告,尽量修复一下。

诊断警告么

@sumneko
Copy link
Collaborator

sumneko commented May 22, 2023

对的

@fesily
Copy link
Contributor Author

fesily commented May 22, 2023

对的

好的,我尽快

@fesily
Copy link
Contributor Author

fesily commented May 25, 2023

你的修改跟我之前强制优先comment一样的结果

vm.compileNode(src):eachObject()

返回的仍然只有doc.class节点,这个才是我不太明白的地方,为什么同样的comment的节点在compileNode函数中compileByNode(source)这个调用返回不同的结果,不知道这里这么改.
你现在修改之后添加的测试用例和我上面的代码有一些不同.我使用的是local mt,测试里直接内嵌的table

@sumneko
Copy link
Collaborator

sumneko commented May 25, 2023

你的修改跟我之前强制优先comment一样的结果

vm.compileNode(src):eachObject()

返回的仍然只有doc.class节点,这个才是我不太明白的地方,为什么同样的comment的节点在compileNode函数中compileByNode(source)这个调用返回不同的结果,不知道这里这么改. 你现在修改之后添加的测试用例和我上面的代码有一些不同.我使用的是local mt,测试里直接内嵌的table

给个演示?

@fesily
Copy link
Contributor Author

fesily commented May 25, 2023

你的修改跟我之前强制优先comment一样的结果

vm.compileNode(src):eachObject()

返回的仍然只有doc.class节点,这个才是我不太明白的地方,为什么同样的comment的节点在compileNode函数中compileByNode(source)这个调用返回不同的结果,不知道这里这么改. 你现在修改之后添加的测试用例和我上面的代码有一些不同.我使用的是local mt,测试里直接内嵌的table

给个演示?


TEST 'integer' [[
---@class metatable : table
---@field __index table

---@param table      table
---@param metatable? metatable
---@return table
function setmetatable(table, metatable) end

local mt = {a = 1 }
local m = setmetatable({},{ __index = mt })

m.<?a?>
]]

你直接把测试用例改成这个,应该跑不过去

sumneko added a commit that referenced this pull request May 25, 2023
@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

现在还有问题吗?

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

有,现在的诊断,因为我改成了class metatable,诊断基本都失效了.

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

给个例子?

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

文件是test/diagnostic/type-check.lua
已知失效的诊断

无法把class A赋值给metatable
TEST [[
---@class A
local a = {}
a.__index = a

---@class B: A
local b = setmetatable({}, a) 
]]

TEST [[
---@class A
local a = {}

---@class B: A
local b = setmetatable({}, {__index = a})
]]

TEST [[
无法将metatable转化成B
---@class A
local a = {}

---@class B
local <!b!> = setmetatable({}, {__index = a})
]]

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

第二个参数的类型试试 metatable|table ?

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

还有
hover/init.lua

TEST[[
local mt = {}
mt.a = 1
mt.b = 2
mt.c = 3
local <?obj?> = setmetatable({}, {__index = mt})
]]
[[
local obj: {
    a: integer = 1,
    b: integer = 2,
    c: integer = 3,
}
]]

这是最后一个测试错误了

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

这个hover会显示什么?如果包含 metatable 的话,可以去 setmetatable 的特殊处理的地方,把返回值里的 metatable 类型删掉。

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

好了,他返回的是 local obj : table | nil {...}
你看下测试文件修改的两处

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

感觉不对,为什么会有 nil ?

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

感觉不对,为什么会有 nil ?

因为每个字段我都加了nil类型

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

setmetatable 的返回值怎么会有 nil

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

setmetatable 的返回值怎么会有 nil

很有道理,不应该有nil

@fesily
Copy link
Contributor Author

fesily commented May 31, 2023

我调试了一下,getReturnOfSetMetaTable这个函数对于__index这个字段 返回了两个node

{
cate='type',
name='nil'
},
{
cate='type',
name='table',
}

@sumneko
Copy link
Collaborator

sumneko commented May 31, 2023

嗯,应该是因为 setmetatable 的返回类型是把参数1的类型与参数2的 __index 字段类型合并的原因。你改成合并后移除 nil 类型把。

@fesily
Copy link
Contributor Author

fesily commented Jun 1, 2023

好了,可以合并了.

@sumneko sumneko merged commit f8f04e7 into LuaLS:master Jun 1, 2023
@fesily fesily deleted the meta-support-metable branch June 1, 2023 02:36
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants