summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--script/core/jump-source.lua32
-rw-r--r--script/parser/luadoc.lua11
-rw-r--r--test/tclient/tests/jump-source.lua40
3 files changed, 69 insertions, 14 deletions
diff --git a/script/core/jump-source.lua b/script/core/jump-source.lua
index 2de23b29..6fb8414f 100644
--- a/script/core/jump-source.lua
+++ b/script/core/jump-source.lua
@@ -1,4 +1,26 @@
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)
@@ -7,8 +29,9 @@ return function (results)
or result.target.type == 'doc.class.name' then
local doc = result.target.parent.source
if doc then
- result.uri = doc.source
- result.target.uri = doc.source
+ local uri = parseUri(doc)
+ result.uri = uri
+ result.target.uri = uri
result.target.start = guide.positionOf(doc.line - 1, doc.char)
result.target.finish = guide.positionOf(doc.line - 1, doc.char)
end
@@ -22,8 +45,9 @@ return function (results)
for _, doc in ipairs(target.bindDocs) do
if doc.type == 'doc.source'
and doc.bindSource == target then
- result.uri = doc.source
- result.target.uri = doc.source
+ local uri = parseUri(doc)
+ result.uri = uri
+ result.target.uri = uri
result.target.start = guide.positionOf(doc.line - 1, doc.char)
result.target.finish = guide.positionOf(doc.line - 1, doc.char)
end
diff --git a/script/parser/luadoc.lua b/script/parser/luadoc.lua
index 6bf1a338..b4b311ae 100644
--- a/script/parser/luadoc.lua
+++ b/script/parser/luadoc.lua
@@ -3,7 +3,6 @@ local re = require 'parser.relabel'
local guide = require 'parser.guide'
local compile = require 'parser.compile'
local util = require 'utility'
-local furi = require 'file-uri'
local TokenTypes, TokenStarts, TokenFinishs, TokenContents, TokenMarks
---@type integer
@@ -148,7 +147,7 @@ Symbol <- ({} {
---@field async? boolean
---@field versions? table[]
---@field names? parser.object[]
----@field source? parser.object
+---@field path? string
local function parseTokens(text, offset)
Ci = 0
@@ -1419,17 +1418,11 @@ local docSwitch = util.switch()
source = source or fullSource
line = tonumber(line) or 1
char = tonumber(char) or 0
- local uri
- if furi.split(source) then
- uri = source
- else
- uri = furi.decode(source)
- end
local result = {
type = 'doc.source',
start = getStart(),
finish = getFinish(),
- source = uri,
+ path = source,
line = line,
char = char,
}
diff --git a/test/tclient/tests/jump-source.lua b/test/tclient/tests/jump-source.lua
index b6ad4da0..dd7666c3 100644
--- a/test/tclient/tests/jump-source.lua
+++ b/test/tclient/tests/jump-source.lua
@@ -14,7 +14,7 @@ lclient():start(function (client)
client:notify('textDocument/didOpen', {
textDocument = {
- uri = furi.encode('1.lua'),
+ uri = furi.encode('D:/test/1.lua'),
languageId = 'lua',
version = 0,
text = [[
@@ -36,6 +36,12 @@ YY = 1
---@class BBB
---@source file:///lib.c
BBB = {}
+
+---@source D:/xxx/2.lua
+D2 = 1
+
+---@source 2.lua
+D3 = 1
]]
}
})
@@ -55,6 +61,8 @@ print(XX)
print(YY)
---@type BBB
print(BBB)
+print(D2)
+print(D3)
]]
}
})
@@ -148,4 +156,34 @@ print(BBB)
}
}
}))
+
+ local locations = client:awaitRequest('textDocument/definition', {
+ textDocument = { uri = furi.encode('main.lua') },
+ position = { line = 9, character = 7 },
+ })
+
+ assert(util.equal(locations, {
+ {
+ uri = 'file:///d%3A/xxx/2.lua',
+ range = {
+ start = { line = 0, character = 0 },
+ ['end'] = { line = 0, character = 0 },
+ }
+ }
+ }))
+
+ local locations = client:awaitRequest('textDocument/definition', {
+ textDocument = { uri = furi.encode('main.lua') },
+ position = { line = 10, character = 7 },
+ })
+
+ assert(util.equal(locations, {
+ {
+ uri = 'file:///d%3A/test/2.lua',
+ range = {
+ start = { line = 0, character = 0 },
+ ['end'] = { line = 0, character = 0 },
+ }
+ }
+ }))
end)