From b22099c12e001bf81a6d1cf47655e6e815d04391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Sun, 13 Sep 2020 19:23:09 +0800 Subject: =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8=E5=AE=8C=E6=88=90?= =?UTF-8?q?=20dofile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script-beta/core/completion.lua | 24 ++++++++++++++++++- script-beta/core/definition.lua | 4 ++-- script-beta/core/hover/description.lua | 4 ++-- script-beta/vm/getLinks.lua | 2 +- script-beta/vm/guideInterface.lua | 4 ++-- script-beta/workspace/workspace.lua | 43 +++++++++++++++++----------------- test-beta/crossfile/completion.lua | 21 +++++++++++++++++ 7 files changed, 72 insertions(+), 30 deletions(-) diff --git a/script-beta/core/completion.lua b/script-beta/core/completion.lua index ec4b0fe6..2e32f515 100644 --- a/script-beta/core/completion.lua +++ b/script-beta/core/completion.lua @@ -512,7 +512,29 @@ local function checkUri(ast, text, offset, results) end elseif lib.name == 'dofile' or lib.name == 'loadfile' then - return workspace.findUrisByFilePath(literal, false) + for uri in files.eachFile() do + uri = files.getOriginUri(uri) + if files.eq(myUri, uri) then + goto CONTINUE + end + local path = workspace.getRelativePath(uri) + if matchKey(literal, path) then + if not collect[path] then + collect[path] = { + textEdit = { + start = source.start + #source[2], + finish = source.finish - #source[2], + } + } + end + -- TODO 翻译 + collect[path][#collect[path]+1] = ([=[[%s](%s)]=]):format( + path, + uri + ) + end + ::CONTINUE:: + end end end) for label, infos in util.sortPairs(collect) do diff --git a/script-beta/core/definition.lua b/script-beta/core/definition.lua index 8e76bfab..8c308aaf 100644 --- a/script-beta/core/definition.lua +++ b/script-beta/core/definition.lua @@ -64,10 +64,10 @@ local function checkRequire(source, offset) return nil end if lib.name == 'require' then - return workspace.findUrisByRequirePath(literal, true) + return workspace.findUrisByRequirePath(literal) elseif lib.name == 'dofile' or lib.name == 'loadfile' then - return workspace.findUrisByFilePath(literal, true) + return workspace.findUrisByFilePath(literal) end return nil end diff --git a/script-beta/core/hover/description.lua b/script-beta/core/hover/description.lua index 277ea9c8..9a0bd83a 100644 --- a/script-beta/core/hover/description.lua +++ b/script-beta/core/hover/description.lua @@ -19,10 +19,10 @@ local function asString(source) return end if lib.name == 'require' then - result = ws.findUrisByRequirePath(literal, true) + result = ws.findUrisByRequirePath(literal) elseif lib.name == 'dofile' or lib.name == 'loadfile' then - result = ws.findUrisByFilePath(literal, true) + result = ws.findUrisByFilePath(literal) end if result and #result > 0 then for i, uri in ipairs(result) do diff --git a/script-beta/vm/getLinks.lua b/script-beta/vm/getLinks.lua index cc1ed190..0bb1c6ff 100644 --- a/script-beta/vm/getLinks.lua +++ b/script-beta/vm/getLinks.lua @@ -18,7 +18,7 @@ local function getFileLinks(uri) if not args[1] or args[1].type ~= 'string' then return end - local uris = ws.findUrisByRequirePath(args[1][1], true) + local uris = ws.findUrisByRequirePath(args[1][1]) for _, u in ipairs(uris) do u = files.asKey(u) if not links[u] then diff --git a/script-beta/vm/guideInterface.lua b/script-beta/vm/guideInterface.lua index c8658b42..c85194d8 100644 --- a/script-beta/vm/guideInterface.lua +++ b/script-beta/vm/guideInterface.lua @@ -27,7 +27,7 @@ function m.require(args, index) end local results = {} local myUri = guide.getUri(args[1]) - local uris = ws.findUrisByRequirePath(reqName, true) + local uris = ws.findUrisByRequirePath(reqName) for _, uri in ipairs(uris) do if not files.eq(myUri, uri) then local ast = files.getAst(uri) @@ -50,7 +50,7 @@ function m.dofile(args, index) end local results = {} local myUri = guide.getUri(args[1]) - local uris = ws.findUrisByFilePath(reqName, true) + local uris = ws.findUrisByFilePath(reqName) for _, uri in ipairs(uris) do if not files.eq(myUri, uri) then local ast = files.getAst(uri) diff --git a/script-beta/workspace/workspace.lua b/script-beta/workspace/workspace.lua index f92d8308..f837fe91 100644 --- a/script-beta/workspace/workspace.lua +++ b/script-beta/workspace/workspace.lua @@ -22,7 +22,7 @@ m.requireCache = {} function m.init(name, uri) m.name = name m.uri = uri - m.path = furi.decode(uri) + m.path = m.normalize(furi.decode(uri)) log.info('Workspace inited: ', uri) local logPath = ROOT / 'log' / (uri:gsub('[/:]+', '_') .. '.log') log.info('Log path: ', logPath) @@ -145,26 +145,16 @@ end --- 查找符合指定file path的所有uri ---@param path string ----@param whole boolean -function m.findUrisByFilePath(path, whole) +function m.findUrisByFilePath(path) local results = {} for uri in files.eachFile() do local pathLen = #path local uriLen = #uri - if whole then - local seg = uri:sub(uriLen - pathLen, uriLen - pathLen) - if seg == '/' or seg == '\\' or seg == '' then - local see = uri:sub(uriLen - pathLen + 1, uriLen) - if files.eq(see, path) then - results[#results+1] = uri - end - end - else - for i = uriLen, uriLen - pathLen + 1, -1 do - local see = uri:sub(i - pathLen + 1, i) - if files.eq(see, path) then - results[#results+1] = uri - end + local seg = uri:sub(uriLen - pathLen, uriLen - pathLen) + if seg == '/' or seg == '\\' or seg == '' then + local see = uri:sub(uriLen - pathLen + 1, uriLen) + if files.eq(see, path) then + results[#results+1] = uri end end end @@ -174,14 +164,14 @@ end --- 查找符合指定require path的所有uri ---@param path string ---@param whole boolean -function m.findUrisByRequirePath(path, whole) +function m.findUrisByRequirePath(path) local results = {} local mark = {} local input = path:gsub('%.', '/') :gsub('%%', '%%%%') for _, luapath in ipairs(config.config.runtime.path) do local part = luapath:gsub('%?', input) - local uris = m.findUrisByFilePath(part, whole) + local uris = m.findUrisByFilePath(part) for _, uri in ipairs(uris) do if not mark[uri] then mark[uri] = true @@ -192,13 +182,22 @@ function m.findUrisByRequirePath(path, whole) return results end +function m.normalize(path) + if platform.OS == 'Windows' then + path = path:gsub('[/\\]+', '\\') + else + path = path:gsub('[/\\]+', '/') + end + return path:gsub('^[/\\]+', '') +end + function m.getRelativePath(uri) local path = furi.decode(uri) - local _, pos = path:lower():find(m.path:lower(), 1, true) + local _, pos = m.normalize(path):lower():find(m.path:lower(), 1, true) if pos then - return path:sub(pos + 1):gsub('^[/\\]+', '') + return m.normalize(path:sub(pos + 1)) else - return path:gsub('^[/\\]+', '') + return m.normalize(path) end end diff --git a/test-beta/crossfile/completion.lua b/test-beta/crossfile/completion.lua index 6801abb7..0e344a5b 100644 --- a/test-beta/crossfile/completion.lua +++ b/test-beta/crossfile/completion.lua @@ -521,3 +521,24 @@ TEST { }, } } + +TEST { + { + path = [[abc/init.lua]], + content = '' + }, + { + path = 'main.lua', + content = [[ + dofile 'ab$' + ]], + main = true, + }, + completion = { + { + label = [[abc\init.lua]], + kind = CompletionItemKind.Reference, + textEdit = EXISTS, + }, + } +} -- cgit v1.2.3