扫描 Lua 文件中的无效函数名称(魔兽世界)

Scan Lua file for invalid function names (World of Warcraft)

所以我有一个 Wow 插件,它有很多很多行。有时,暴雪会从游戏中删除 Lua 函数,而我并不总是确定我在插件中调用的函数是否仍然有效。

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

我知道我可以做这样的事情:

if not RemovedFunction then print("Function does not exist") end

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

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

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

一个好的 API 会在他们的变更日志中列出删除的函数名称。只需在您的脚本中搜索这些名称即可。

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

或者您在脚本中搜索函数调用并在现有函数名称列表中搜索该名称。或者您检查此名称在您的环境中是否为 nil。函数调用是后跟可选空格和 ("{ 之一的任何名称。 对于函数,这是微不足道的,对于其他变量,它变得有点复杂,您最终将编写自己的 linter,因此您也可以使用现有的 linter。

您可以在此处找到更新日志

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

您还可以将 zip 上传到 Globe,它会告诉您任何已删除的 API,例如

如果函数名是nil则扫描

function isFunctionExist(functionName) --Function name in string
  local func = load("return "..functionName")
  if func == nil then
    error("Invalid function name!") --There an invalid letter in your function name that cause load unable to load
  end

  return type(func()) == "function"
end

它也适用于任何 lua 解释器,不仅在魔兽世界插件中 Lua 会导致 attempt to call nil value 或类似的 所以在 运行 之前我们检查它是 nil 还是函数

load("return "..functionName) 将 return functionName 变量内容即使它为 nil 然后我们用 type 检查它是否存在函数它 return "function"

type(func()) == "function" 这一行做检查