38 lines
1.0 KiB
Lua
38 lines
1.0 KiB
Lua
local files = require 'files'
|
|
local guide = require 'parser.guide'
|
|
local vm = require 'vm'
|
|
local reference = require 'core.reference'
|
|
local find = string.find
|
|
local remove = table.remove
|
|
|
|
local function getCdefSourcePosition(ffi_state)
|
|
local cdef_position = ffi_state.ast.returns[1][1]
|
|
local source = vm.getFields(cdef_position)
|
|
for index, value in ipairs(source) do
|
|
local name = guide.getKeyName(value)
|
|
if name == 'cdef' then
|
|
return value.field.start
|
|
end
|
|
end
|
|
end
|
|
|
|
---@async
|
|
return function ()
|
|
local ffi_state
|
|
for uri in files.eachFile() do
|
|
if find(uri, "ffi.lua", 0, true) and find(uri, "meta", 0, true) then
|
|
ffi_state = files.getState(uri)
|
|
break
|
|
end
|
|
end
|
|
if ffi_state then
|
|
local res = reference(ffi_state.uri, getCdefSourcePosition(ffi_state), true)
|
|
if res then
|
|
if res[1].uri == ffi_state.uri then
|
|
remove(res, 1)
|
|
end
|
|
return res
|
|
end
|
|
end
|
|
end
|