diff options
-rw-r--r-- | .vscode/launch.json | 2 | ||||
-rw-r--r-- | changelog.md | 1 | ||||
-rw-r--r-- | script/core/completion/completion.lua | 2 | ||||
-rw-r--r-- | script/workspace/require-path.lua | 34 | ||||
-rw-r--r-- | script/workspace/workspace.lua | 7 |
5 files changed, 40 insertions, 6 deletions
diff --git a/.vscode/launch.json b/.vscode/launch.json index 36a148b0..88d361b2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -25,7 +25,7 @@ "type": "lua", "request": "attach", "stopOnEntry": false, - "address": "127.0.0.1:11427", + "address": "127.0.0.1:11428", "outputCapture": [ ], "sourceMaps": [ diff --git a/changelog.md b/changelog.md index 61e351ed..eb63faa3 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## 3.5.1 * `CHG` setting `type.castNumberToInteger` default by `true` +* `CHG` improve supports for multi-workspace * `FIX` [#1335](https://github.com/sumneko/lua-language-server/issues/1335) * `FIX` [#1354](https://github.com/sumneko/lua-language-server/issues/1354) diff --git a/script/core/completion/completion.lua b/script/core/completion/completion.lua index b2f74aa8..09d276a6 100644 --- a/script/core/completion/completion.lua +++ b/script/core/completion/completion.lua @@ -913,7 +913,7 @@ local function collectRequireNames(mode, myUri, literal, source, smark, position goto CONTINUE end local path = furi.decode(uri) - local infos = rpath.getVisiblePath(uri, path) + local infos = rpath.getVisiblePath(myUri, path) local relative = workspace.getRelativePath(path) for _, info in ipairs(infos) do if matchKey(literal, info.name) then diff --git a/script/workspace/require-path.lua b/script/workspace/require-path.lua index 6c550e12..204a22a6 100644 --- a/script/workspace/require-path.lua +++ b/script/workspace/require-path.lua @@ -39,7 +39,7 @@ function mt:getRequireNameByPath(path, searcher) : gsub('[/\\%.]+', separator) local stemSearcher = searcher : gsub('%.[^%.]+$', '') - : gsub('[/\\%.]+', separator) + : gsub('[/\\]+', separator) local start = stemSearcher:match '()%?' or 1 if stemPath:sub(1, start - 1) ~= stemSearcher:sub(1, start - 1) then return nil @@ -58,15 +58,18 @@ end ---@return require-manager.visibleResult[] function mt:getRequireResultByPath(path) local uri = furi.encode(path) - local searchers = config.get(self.scp.uri, 'Lua.runtime.path') - local strict = config.get(self.scp.uri, 'Lua.runtime.pathStrict') - local libUri = files.getLibraryUri(self.scp.uri, uri) + local searchers = config.get(self.scp.uri, 'Lua.runtime.path') + local strict = config.get(self.scp.uri, 'Lua.runtime.pathStrict') + local libUri = files.getLibraryUri(self.scp.uri, uri) local libraryPath = libUri and furi.decode(libUri) local result = {} for _, searcher in ipairs(searchers) do local isAbsolute = searcher:match '^[/\\]' or searcher:match '^%a+%:' searcher = workspace.normalize(searcher) + if searcher:sub(1, 1) == '.' then + strict = true + end local cutedPath = path local currentPath = path local head @@ -78,6 +81,29 @@ function mt:getRequireResultByPath(path) currentPath = workspace.getRelativePath(uri) end end + + -- handle `../?.lua` + local parentCount = 0 + for _ = 1, 1000 do + if searcher:match '^%.%.[/\\]' then + parentCount = parentCount + 1 + searcher = searcher:sub(4) + else + break + end + end + if parentCount > 0 then + local parentPath = libraryPath + or (self.scp.uri and furi.decode(self.scp.uri)) + if parentPath then + local tail + for _ = 1, parentCount do + parentPath, tail = parentPath:match '^(.+)[/\\]([^/\\]*)$' + currentPath = tail .. '/' .. currentPath + end + end + end + repeat cutedPath = currentPath:sub(pos) head = currentPath:sub(1, pos - 1) diff --git a/script/workspace/workspace.lua b/script/workspace/workspace.lua index c2a5dfc0..60078975 100644 --- a/script/workspace/workspace.lua +++ b/script/workspace/workspace.lua @@ -383,6 +383,13 @@ function m.normalize(path) end) path = util.expandPath(path) path = path:gsub('^%.[/\\]+', '') + for _ = 1, 1000 do + local count + path, count = path:gsub('[^/\\]+[/\\]%.%.', '') + if count == 0 then + break + end + end if platform.OS == 'Windows' then path = path:gsub('[/\\]+', '\\') :gsub('[/\\]+$', '') |