diff --git a/changelog.md b/changelog.md index 1ce5553c4..62532666c 100644 --- a/changelog.md +++ b/changelog.md @@ -1,8 +1,10 @@ # changelog ## 3.6.7 +* `FIX` [#1810] * `FIX` [#1829] +[#1810]: https://github.com/sumneko/lua-language-server/issues/1810 [#1829]: https://github.com/sumneko/lua-language-server/issues/1829 ## 3.6.6 diff --git a/script/file-uri.lua b/script/file-uri.lua index 3e916acf7..8e9dd9388 100644 --- a/script/file-uri.lua +++ b/script/file-uri.lua @@ -106,7 +106,7 @@ function m.isValid(uri) end function m.normalize(uri) - if uri == '' then + if not m.isValid(uri) then return uri end return m.encode(m.decode(uri)) diff --git a/script/files.lua b/script/files.lua index 05ca13308..ece7f3a98 100644 --- a/script/files.lua +++ b/script/files.lua @@ -79,7 +79,7 @@ end ---@return uri function m.getRealUri(uri) if platform.OS ~= 'Windows' then - return uri + return furi.normalize(uri) end local filename = furi.decode(uri) -- normalize uri diff --git a/script/provider/provider.lua b/script/provider/provider.lua index e77efb7c5..a83ce18e8 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -114,10 +114,10 @@ m.register 'initialize' { if params.workspaceFolders then for _, folder in ipairs(params.workspaceFolders) do - workspace.create(folder.uri) + workspace.create(files.getRealUri(folder.uri)) end elseif params.rootUri then - workspace.create(params.rootUri) + workspace.create(files.getRealUri(params.rootUri)) end local response = { @@ -249,12 +249,14 @@ m.register 'workspace/didChangeWorkspaceFolders' { function (params) log.debug('workspace/didChangeWorkspaceFolders', inspect(params)) for _, folder in ipairs(params.event.added) do - workspace.create(folder.uri) + local uri = files.getRealUri(folder.uri) + workspace.create(uri) m.updateConfig() - workspace.reload(scope.getScope(folder.uri)) + workspace.reload(scope.getScope(uri)) end for _, folder in ipairs(params.event.removed) do - workspace.remove(folder.uri) + local uri = files.getRealUri(folder.uri) + workspace.remove(uri) end end } @@ -263,12 +265,12 @@ m.register 'textDocument/didOpen' { ---@async function (params) local doc = params.textDocument - local scheme = furi.split(doc.uri) - local supports = config.get(doc.uri, 'Lua.workspace.supportScheme') + local uri = files.getRealUri(doc.uri) + local scheme = furi.split(uri) + local supports = config.get(uri, 'Lua.workspace.supportScheme') if not util.arrayHas(supports, scheme) then return end - local uri = files.getRealUri(doc.uri) log.debug('didOpen', uri) local text = doc.text files.setText(uri, text, true, function (file) diff --git a/script/workspace/workspace.lua b/script/workspace/workspace.lua index f08468c8c..aabe0c78d 100644 --- a/script/workspace/workspace.lua +++ b/script/workspace/workspace.lua @@ -45,9 +45,6 @@ end --- 初始化工作区 function m.create(uri) - if furi.isValid(uri) then - uri = furi.normalize(uri) - end log.info('Workspace create: ', uri) local scp = scope.createFolder(uri) m.folders[#m.folders+1] = scp diff --git a/test/tclient/tests/change-workspace-folder.lua b/test/tclient/tests/change-workspace-folder.lua index abd385cb1..a9b0e36a8 100644 --- a/test/tclient/tests/change-workspace-folder.lua +++ b/test/tclient/tests/change-workspace-folder.lua @@ -98,4 +98,22 @@ lclient():start(function (client) assert(files.getState(rootUri .. '/ws1/test.lua') == nil) assert(files.getState(rootUri .. '/ws2/test.lua') == nil) assert(files.getState(rootUri .. '/ws3/test.lua') ~= nil) + + -- normalize uri + client:notify('workspace/didChangeWorkspaceFolders', { + event = { + added = { + { + name = 'ws2', + uri = rootUri .. '%2F%77%73%32'--[[/ws2]], + }, + }, + removed = {}, + }, + }) + + ws.awaitReady(rootUri .. '/ws2') + assert(files.getState(rootUri .. '/ws1/test.lua') == nil) + assert(files.getState(rootUri .. '/ws2/test.lua') ~= nil) + assert(files.getState(rootUri .. '/ws3/test.lua') ~= nil) end)