Skip to content

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants