105 lines
2.6 KiB
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
|