diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2022-07-14 17:54:14 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2022-07-14 17:54:14 +0800 |
commit | 9ad3fdce5bd6c889f5734eddd04708595e1fa621 (patch) | |
tree | 028fe13842e0b7f40fd189f1109ef8ec1245812c /script | |
parent | 0d79784ccf47a03f9f35e1afbd579ecbab0acd5a (diff) | |
download | lua-language-server-9ad3fdce5bd6c889f5734eddd04708595e1fa621.zip |
`---@source`
Diffstat (limited to 'script')
-rw-r--r-- | script/core/definition.lua | 2 | ||||
-rw-r--r-- | script/core/jump-source.lua | 33 | ||||
-rw-r--r-- | script/core/reference.lua | 2 | ||||
-rw-r--r-- | script/core/type-definition.lua | 2 | ||||
-rw-r--r-- | script/parser/luadoc.lua | 52 | ||||
-rw-r--r-- | script/provider/provider.lua | 45 |
6 files changed, 107 insertions, 29 deletions
diff --git a/script/core/definition.lua b/script/core/definition.lua index e4868532..ac2513e9 100644 --- a/script/core/definition.lua +++ b/script/core/definition.lua @@ -4,6 +4,7 @@ local vm = require 'vm' local findSource = require 'core.find-source' local guide = require 'parser.guide' local rpath = require 'workspace.require-path' +local jumpSource = require 'core.jump-source' local function sortResults(results) -- 先按照顺序排序 @@ -197,6 +198,7 @@ return function (uri, offset) end sortResults(results) + jumpSource(results) return results end diff --git a/script/core/jump-source.lua b/script/core/jump-source.lua new file mode 100644 index 00000000..76d7324b --- /dev/null +++ b/script/core/jump-source.lua @@ -0,0 +1,33 @@ +local guide = require 'parser.guide' + +---@param results table +return function (results) + for _, result in ipairs(results) do + if result.target.type == 'doc.field.name' then + local doc = result.target.parent.source + if doc then + result.uri = doc.source + result.target.uri = doc.source + result.target.start = guide.positionOf(doc.line - 1, 0) + result.target.finish = guide.positionOf(doc.line - 1, 0) + 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 + result.uri = doc.source + result.target.uri = doc.source + result.target.start = guide.positionOf(doc.line - 1, 0) + result.target.finish = guide.positionOf(doc.line - 1, 0) + end + end + end + end + end +end diff --git a/script/core/reference.lua b/script/core/reference.lua index 4c9c193d..a468afde 100644 --- a/script/core/reference.lua +++ b/script/core/reference.lua @@ -2,6 +2,7 @@ local guide = require 'parser.guide' local files = require 'files' local vm = require 'vm' local findSource = require 'core.find-source' +local jumpSource = require 'core.jump-source' local function sortResults(results) -- 先按照顺序排序 @@ -132,6 +133,7 @@ return function (uri, position) end sortResults(results) + jumpSource(results) return results end diff --git a/script/core/type-definition.lua b/script/core/type-definition.lua index d8434c8c..2140090b 100644 --- a/script/core/type-definition.lua +++ b/script/core/type-definition.lua @@ -4,6 +4,7 @@ local vm = require 'vm' local findSource = require 'core.find-source' local guide = require 'parser.guide' local rpath = require 'workspace.require-path' +local jumpSource = require 'core.jump-source' local function sortResults(results) -- 先按照顺序排序 @@ -164,6 +165,7 @@ return function (uri, offset) end sortResults(results) + jumpSource(results) return results end diff --git a/script/parser/luadoc.lua b/script/parser/luadoc.lua index 37a1843d..91ed44c0 100644 --- a/script/parser/luadoc.lua +++ b/script/parser/luadoc.lua @@ -3,6 +3,7 @@ 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 @@ -147,6 +148,7 @@ Symbol <- ({} { ---@field async? boolean ---@field versions? table[] ---@field names? parser.object[] +---@field source? parser.object local function parseTokens(text, offset) Ci = 0 @@ -1403,8 +1405,36 @@ local docSwitch = util.switch() return result end) + : case 'source' + : call(function (doc) + local fullSource = doc:sub(#'source' + 1) + if not fullSource or fullSource == '' then + return + end + fullSource = util.trim(fullSource) + if fullSource == '' then + return + end + local source, line = fullSource:match('^(.-):(%d+)$') + source = source or fullSource + line = tonumber(line) or 1 + local uri + if furi.split(source) then + uri = source + else + uri = furi.decode(source) + end + local result = { + type = 'doc.source', + start = getFinish(), + finish = getFinish(), + source = uri, + line = line, + } + return result + end) -local function convertTokens() +local function convertTokens(doc) local tp, text = nextToken() if not tp then return @@ -1417,7 +1447,7 @@ local function convertTokens() } return nil end - return docSwitch(text) + return docSwitch(text, doc) end local function trimTailComment(text) @@ -1457,7 +1487,7 @@ local function buildLuaDoc(comment) local doc = text:sub(startPos) parseTokens(doc, comment.start + startPos) - local result, rests = convertTokens() + local result, rests = convertTokens(doc) if result then result.range = comment.finish local finish = result.firstFinish or result.finish @@ -1527,7 +1557,8 @@ local function isContinuedDoc(lastDoc, nextDoc) if nextDoc.type ~= 'doc.field' and nextDoc.type ~= 'doc.operator' and nextDoc.type ~= 'doc.comment' - and nextDoc.type ~= 'doc.overload' then + and nextDoc.type ~= 'doc.overload' + and nextDoc.type ~= 'doc.source' then return false end end @@ -1603,7 +1634,8 @@ local function bindDoc(source, binded) if doc.type == 'doc.class' or doc.type == 'doc.deprecated' or doc.type == 'doc.version' - or doc.type == 'doc.module' then + or doc.type == 'doc.module' + or doc.type == 'doc.source' then if source.type == 'function' or isParam then goto CONTINUE @@ -1746,6 +1778,7 @@ end local function bindCommentsAndFields(binded) local class local comments = {} + local source for _, doc in ipairs(binded) do if doc.type == 'doc.class' then -- 多个class连续写在一起,只有最后一个class可以绑定source @@ -1760,6 +1793,10 @@ local function bindCommentsAndFields(binded) class.fields[#class.fields+1] = doc doc.class = class end + if source then + doc.source = source + source.bindSource = doc + end bindCommentsToDoc(doc, comments) comments = {} elseif doc.type == 'doc.operator' then @@ -1774,7 +1811,12 @@ local function bindCommentsAndFields(binded) comments = {} elseif doc.type == 'doc.comment' then comments[#comments+1] = doc + elseif doc.type == 'doc.source' then + source = doc + goto CONTINUE end + source = nil + ::CONTINUE:: end end diff --git a/script/provider/provider.lua b/script/provider/provider.lua index eb1362eb..18147e80 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -22,6 +22,7 @@ local inspect = require 'inspect' local markdown = require 'provider.markdown' local guide = require 'parser.guide' local fs = require 'bee.filesystem' +local jumpSource = require 'core.jump-source' ---@async local function updateConfig(uri) @@ -376,18 +377,16 @@ m.register 'textDocument/definition' { for i, info in ipairs(result) do local targetUri = info.uri if targetUri then - if files.exists(targetUri) then - if client.getAbility 'textDocument.definition.linkSupport' then - response[i] = converter.locationLink(targetUri - , converter.packRange(targetUri, info.target.start, info.target.finish) - , converter.packRange(targetUri, info.target.start, info.target.finish) - , converter.packRange(uri, info.source.start, info.source.finish) - ) - else - response[i] = converter.location(targetUri - , converter.packRange(targetUri, info.target.start, info.target.finish) - ) - end + if client.getAbility 'textDocument.definition.linkSupport' then + response[i] = converter.locationLink(targetUri + , converter.packRange(targetUri, info.target.start, info.target.finish) + , converter.packRange(targetUri, info.target.start, info.target.finish) + , converter.packRange(uri, info.source.start, info.source.finish) + ) + else + response[i] = converter.location(targetUri + , converter.packRange(targetUri, info.target.start, info.target.finish) + ) end end end @@ -418,18 +417,16 @@ m.register 'textDocument/typeDefinition' { for i, info in ipairs(result) do local targetUri = info.uri if targetUri then - if files.exists(targetUri) then - if client.getAbility 'textDocument.typeDefinition.linkSupport' then - response[i] = converter.locationLink(targetUri - , converter.packRange(targetUri, info.target.start, info.target.finish) - , converter.packRange(targetUri, info.target.start, info.target.finish) - , converter.packRange(uri, info.source.start, info.source.finish) - ) - else - response[i] = converter.location(targetUri - , converter.packRange(targetUri, info.target.start, info.target.finish) - ) - end + if client.getAbility 'textDocument.typeDefinition.linkSupport' then + response[i] = converter.locationLink(targetUri + , converter.packRange(targetUri, info.target.start, info.target.finish) + , converter.packRange(targetUri, info.target.start, info.target.finish) + , converter.packRange(uri, info.source.start, info.source.finish) + ) + else + response[i] = converter.location(targetUri + , converter.packRange(targetUri, info.target.start, info.target.finish) + ) end end end |