CppCXY / EmmyLuaAnalyzer

a new EmmyLua Language Server
MIT License
39 stars 6 forks source link

全局变量分析问题 #20

Closed 37wjy closed 2 weeks ago

37wjy commented 1 month ago

程序启动时会声明

---@type UIManager
UIMgr = require("UIManager").New()

在程序关闭时,会在特定方法里执行

UIMgr = nil

一旦写了后面的赋值代码后, 就会提示UIMgr是nil

截屏2024-05-27 20 10 57 截屏2024-05-27 20 10 47
CppCXY commented 1 month ago

这里面的主要问题是, lua的全局变量声明和赋值没有明显的区分, 当前采用的策略是, 以遍历顺序中的首次出现的类型为准

37wjy commented 1 month ago

好吧, 主要是在上面标注了type, 要是提示 UIManager|nil 感觉也会比无视---@type会好点

CppCXY commented 1 month ago

当前为了欺骗插件 ,你可以在置nil的地方再写上---@type

37wjy commented 1 month ago

有个比较特殊的情况, 有一些只会在特定情况下产生的local变量会被标记为全局变量, A前面的local去了就不会报错了

local DEBUG = true

if DEBUG then
    local A = {}
end

function B(...)
    if DEBUG then
        A.a = 1
    end
end
截屏2024-06-06 11 22 48
CppCXY commented 1 month ago

lua中不存在预处理器, 所以这个local 在通常情况下都是无法被访问的, 另一个办法是:

local DEBUG = true

if DEBUG then
    local A = {}
    function B(...)
            A.a = 1
    end
else
    function B(...)

    end
end