nixos/lua-lsp/script/core/hover/name.lua

105 lines
2.6 KiB
Lua

local guide = require 'parser.guide'
local vm = require 'vm'
local buildName
local function asLocal(source)
local name = guide.getKeyName(source)
if not source.attrs then
return name
end
local label = {}
label[#label+1] = name
for _, attr in ipairs(source.attrs) do
label[#label+1] = ('<%s>'):format(attr[1])
end
return table.concat(label, ' ')
end
local function asField(source, oop)
local class
if source.node.type ~= 'getglobal' then
class = vm.getInfer(source.node):viewClass()
if class == 'any' or class == 'unknown' then
class = nil
end
end
local node = class
or buildName(source.node, false)
or guide.getKeyName(source.node)
or '?'
local method = guide.getKeyName(source)
if oop then
return ('%s:%s'):format(node, method)
else
return ('%s.%s'):format(node, method)
end
end
local function asTableField(source)
if not source.field then
return
end
return guide.getKeyName(source.field)
end
local function asGlobal(source)
return guide.getKeyName(source)
end
local function asDocFunction(source, oop)
local doc = guide.getParentType(source, 'doc.type')
or guide.getParentType(source, 'doc.overload')
if not doc or not doc.bindSource then
return ''
end
local name = buildName(doc.bindSource, oop)
if name ~= '' then
return name
end
return ''
end
local function asDocField(source)
return source.field[1]
end
function buildName(source, oop)
if source.type == 'local' then
return asLocal(source) or '', oop
end
if source.type == 'getlocal'
or source.type == 'setlocal' then
return asLocal(source.node) or '', oop
end
if source.type == 'setglobal'
or source.type == 'getglobal' then
return asGlobal(source) or '', oop
end
if source.type == 'setmethod'
or source.type == 'getmethod' then
return asField(source, oop) or '', oop
end
if source.type == 'setfield'
or source.type == 'getfield' then
return asField(source, oop) or '', oop
end
if source.type == 'tablefield' then
return asTableField(source) or '', oop
end
if source.type == 'doc.type.function' then
return asDocFunction(source, oop), oop
end
if source.type == 'doc.field' then
return asDocField(source), oop
end
if source.type == 'method'
or source.type == 'field'
or source.type == 'function' then
return buildName(source.parent, oop)
end
return nil, oop
end
return buildName