63 lines
2 KiB
Lua
63 lines
2 KiB
Lua
|
local guide = require 'parser.guide'
|
||
|
local furi = require 'file-uri'
|
||
|
local ws = require 'workspace'
|
||
|
|
||
|
---@param doc parser.object
|
||
|
---@return uri
|
||
|
local function parseUri(doc)
|
||
|
local uri
|
||
|
local scheme = furi.split(doc.path)
|
||
|
if scheme and #scheme >= 2 then
|
||
|
uri = doc.path
|
||
|
else
|
||
|
local suri = guide.getUri(doc):gsub('[/\\][^/\\]*$', '')
|
||
|
local path = ws.getAbsolutePath(suri, doc.path)
|
||
|
if path then
|
||
|
uri = furi.encode(path)
|
||
|
else
|
||
|
uri = doc.path
|
||
|
end
|
||
|
end
|
||
|
---@cast uri uri
|
||
|
return uri
|
||
|
end
|
||
|
|
||
|
---@param results table
|
||
|
return function (results)
|
||
|
for _, result in ipairs(results) do
|
||
|
if result.target.type == 'doc.field.name'
|
||
|
or result.target.type == 'doc.class.name' then
|
||
|
local doc = result.target.parent.source
|
||
|
if doc then
|
||
|
local uri = parseUri(doc)
|
||
|
result.uri = uri
|
||
|
result.target = {
|
||
|
uri = uri,
|
||
|
start = guide.positionOf(doc.line - 1, doc.char),
|
||
|
finish = guide.positionOf(doc.line - 1, doc.char),
|
||
|
}
|
||
|
end
|
||
|
else
|
||
|
local target = result.target
|
||
|
if target.type == 'method'
|
||
|
or target.type == 'field' then
|
||
|
target = target.parent
|
||
|
end
|
||
|
if target.bindDocs then
|
||
|
for _, doc in ipairs(target.bindDocs) do
|
||
|
if doc.type == 'doc.source'
|
||
|
and doc.bindSource == target then
|
||
|
local uri = parseUri(doc)
|
||
|
result.uri = uri
|
||
|
result.target = {
|
||
|
uri = uri,
|
||
|
start = guide.positionOf(doc.line - 1, doc.char),
|
||
|
finish = guide.positionOf(doc.line - 1, doc.char),
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|