EmmyLua / IntelliJ-EmmyLua

Lua IDE/Debugger Plugin for IntelliJ IDEA
https://emmylua.github.io
Apache License 2.0
1.72k stars 287 forks source link

可否对标准库的模块, 加上 @class 注解 #521

Open aceyin opened 1 year ago

aceyin commented 1 year ago

以 math.lua 举例:

emmy-lua 中的 math 模块源码如下:

math = {}

function math.abs(x) return 0 end
....

因为没有给 math = {} 加上 @class 申明, 因此当我想扩展lua标准库的 math 模块的时候,例如:

我想写一个 libs.math 库,用来在原有 std.match 基础上扩充一些功能: file: libs/math.lua

--- @class libs.math : <因为标准库的 math 没有申明 class, 所以我这里就没法继承>
local m = setmetatable({}, {__index=math})

return m

当我使用上述模块时,IDE 就没法提示出标准库的 math 模块的函数.

建议给标准库中的一些模块, 如: math, table, string 什么的, 都加上 @class 注解, 如: @class std.match, @class std.table, @class std.string 这样的话, 对于想扩展标准库的时候, 就能享受 std 库里面的 IDE 语法提示

CppCXY commented 1 year ago

直接写 function math.XXX() end

aceyin commented 1 year ago

可以是可以, 但是如果 后续版本的 Lua 的 math 模块也增加了一个 XXX 方法, 那修改现有代码中调用 XXX 的地方就会很麻烦了, 就没法简单通过 rename XXX 成 XXX2 的方式来进行重构了。因为我不知道调用 XXX 的地方, 到底是想调用 官方的 XXX 还是我的 libs.math 里面的 XXX。

CppCXY commented 1 year ago

调用的一定是你自己的XXX, lua的所有自有函数都可以被覆盖和重写,你覆盖了这个实现以后无论lua本身是否提供都会是你自己的实现

aceyin commented 1 year ago

调用的一定是你自己的XXX, lua的所有自有函数都可以被覆盖和重写,你覆盖了这个实现以后无论lua本身是否提供都会是你自己的实现

哎, 不好说。。 程序是工作在一个多 Lua 虚拟机的环境里面的 (skynet) 假设我在 libs.math 里面定义了 XXX , 覆盖了 Lua 官方的 math.XXX 但是如果我一些 Lua 虚拟机, 没有 require 'lib.math' 这时调用的 math.XXX() 就是官方的 但假设哪天别的同事 require 了 libs.math 或者其他模块间接 require 了 libs.math 那以前调用 math.XXX() 的那些代码, 就出 bug 了。

CppCXY commented 1 year ago

math 和require 'math'是同一张表