扫描 Lua 文件以查找无效函数名称 (魔兽世界)

所以我有一个魔兽世界的插件,有很多很多行代码。有时候,暴雪会从游戏中移除 Lua 函数,我不确定我在插件中调用的函数是否依然有效。

有没有办法可以扫描整个 Lua 文件以查找不再存在的函数?

我知道我可以像这样做:

if not RemovedFunction then print("函数不存在") end

但这需要我一个一个地检查每个函数名,所以这不现实(有数百个函数)。

我希望能够扫描整个 Lua 文件,并在任何我调用的函数名称不再出现在魔兽世界 API 中时警告我。

解决方案可以用任何语言编写(不必是 Lua 脚本,尽管这是更好的选择)。

点赞
用户2858170
用户2858170

一个好的 API 应该在它们的变更日志中列出已删除的函数名称。只要在脚本中搜索这些名称即可。

您可以使用 linter,如 luacheck,在您的脚本中查找未定义的内容。这需要您维护一个现有函数名称列表。 这也适用于其他全局变量。

或者,您可以搜索您的脚本中的函数调用,并在现有函数名称列表中搜索该名称。或者,您可以检查该名称在您的环境中是否为 nil。函数调用是指后跟可选空格和("{的任何名称。 对于函数来说,这很简单,对于其他变量来说会变得更加复杂,您最终将编写自己的 linter,因此您可能会选择使用现有的一个。

2020-10-15 12:52:11
用户1297035
用户1297035

你可以在这里找到更新日志:

GitHub 项目展示了如何扫描这些函数,它本质上只是扫描_G[]和暴雪的 FrameXML 代码。

你也可以上传一个压缩包到Globe,它会告诉你任何已删除的 API,例如:

2020-10-15 20:30:36
用户13447666
用户13447666

扫描函数名是否为nil

function isFunctionExist(functionName) --函数名以字符串形式 
  local func = load("return "..functionName") --将函数名的内容放入变量func中
  if func == nil then  --如果函数名为nil,则无法加载导致无效的字符
    error("无效的函数名!") 
  end

  return type(func()) == "function" --判断该函数是否存在
end

该代码不仅适用于“魔兽世界”的插件,而且适用于任何Lua解释器。 如果不运行,则Lua会出现'尝试调用空值'或类似的错误。 因此,在运行之前,我们检查它是否为nil或函数。

load("return "..functionName)将返回函数名变量的内容,即使它为nil,然后我们使用type进行检查。如果它是存在的函数,则返回“function”。

type(func()) == "function"这行代码就是进行检查的。

2020-11-27 02:47:26