mathworks / mathworks/MATLAB-language-server
Crash when client advertises `workspace/workspaceFolders` but doesn’t implement handler
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 125
- Forks
- 21
- PR merge metrics
- No merged PRs in 30d
Description
Describe the bug
When a client advertises workspace.workspaceFolders but does not implement the workspace/workspaceFolders request, the server assumes success and later code dereferences a missing/failed result, causing a crash.
To Reproduce
- Start the server with a client that sets
capabilities.workspace.workspaceFolders = truebut does not handleworkspace/workspaceFolders(e.g., powernap/crush). - Complete initialize/initialized.
- The server requests
workspace/workspaceFolders; the client returns a JSON-RPC error; the server crashes or becomes unstable.
Expected behavior
- No crash. Treat request errors/null as no folders and continue.
- Prefer
InitializeParams.workspaceFolderswhen present and cache for later use.
Useful Information
- MATLAB-language-server Version: v1.3.6
- MATLAB Version: R2025b Update 1 (25.2.0.3042426) 64-bit (glnxa64)
- OS Version: Ubuntu 24.04.3 LTS as devcontainer (mcr.microsoft.com/devcontainers/base:ubuntu-24.04) with MATLAB feature (ghcr.io/mathworks/devcontainer-features/matlab)
- Language Server Client: crush v0.13.6
Additional context
- Affected code: src/server.ts (capability gate), src/lifecycle/MatlabSession.ts (launch dir), src/lifecycle/PathSynchronizer.ts (on connect), src/indexing/WorkspaceIndexer.ts (index roots).
- Repro: node build from source; ran
/opt/matlab-language-server/out/index.jswith the client above (crush). - Fix: defensively wrap all
getWorkspaceFolders()calls; only enable PathSynchronizer if the request succeeds; fall back toInitializeParams.workspaceFoldersor[]and log a warning when clients error.
I will be submitting a pull request.
Example traffic between `crush` and `matlab-langauge-server`
Example traffic between crush and matlab-langauge-server
stdin:
Content-Length: 2837
{"id":0,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"general":{"markdown":{"parser":"marked","version":"1.1.0"},"positionEncodings":["utf-16"],"regularExpressions":{"engine":"ECMAScript","version":"ES2020"}},"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"dataSupport":true,"dynamicRegistration":true,"isPreferredSupport":true,"resolveSupport":{"properties":["edit"]}},"completion":{"completionItem":{"commitCharactersSupport":true,"deprecatedSupport":true,"documentationFormat":["markdown","plaintext"],"insertReplaceSupport":true,"preselectSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"snippetSupport":false,"tagSupport":{"valueSet":[1]}},"contextSupport":true,"dynamicRegistration":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"hierarchicalDocumentSymbolSupport":true},"formatting":{"dynamicRegistration":true},"hover":{"contentFormat":["markdown","plaintext"],"dynamicRegistration":true},"publishDiagnostics":{"codeDescriptionSupport":true,"dataSupport":true,"relatedInformation":true,"tagSupport":{"valueSet":[1,2]},"versionSupport":true},"rangeFormatting":{"dynamicRegistration":true},"references":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"synchronization":{"didSave":true,"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true}},"window":{"showDocument":{"support":true},"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"workDoneProgress":true},"workspace":{"applyEdit":true,"configuration":true,"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"fileOperations":{"didCreate":true,"didDelete":true,"didRename":true,"dynamicRegistration":true,"willCreate":true,"willDelete":true,"willRename":true},"symbol":{"dynamicRegistration":true},"workspaceEdit":{"documentChanges":true,"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"resourceOperations":["create","rename","delete"]},"workspaceFolders":true}},"clientInfo":{"name":"powernap","version":"0.1.0"},"initializationOptions":{"MATLAB":{"indexWorkspace":true,"installPath":"/opt/matlab/R2025b","matlabConnectionTiming":"onStart","prewarmGraphics":false,"signIn":true,"telemetry":false}},"locale":"en-us","processId":26471,"rootPath":"/workspaces/agentic-matlab-example","rootUri":"file:///workspaces/agentic-matlab-example","trace":"off","workspaceFolders":[{"uri":"file:///workspaces/agentic-matlab-example","name":"agentic-matlab-example"}]}}Content-Length: 52
{"jsonrpc":"2.0","method":"initialized","params":{}}Content-Length: 38
{"id":0,"result":null,"jsonrpc":"2.0"}Content-Length: 38
{"id":1,"result":[{}],"jsonrpc":"2.0"}Content-Length: 38
{"id":2,"result":null,"jsonrpc":"2.0"}Content-Length: 105
{"id":3,"error":{"code":0,"message":"no handler for method: workspace/workspaceFolders"},"jsonrpc":"2.0"}
stdout:
Content-Length: 134
{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"(17:12:36) matlabls: Log Directory: /tmp/matlabls_26511"}}Content-Length: 583
{"jsonrpc":"2.0","id":0,"result":{"capabilities":{"codeActionProvider":true,"completionProvider":{"triggerCharacters":[".","("," ",",","/","\\"]},"definitionProvider":true,"documentFormattingProvider":true,"documentRangeFormattingProvider":true,"executeCommandProvider":{"commands":["matlabls.lint.suppress.line","matlabls.lint.suppress.file"]},"foldingRangeProvider":true,"referencesProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"documentSymbolProvider":true,"renameProvider":{"prepareProvider":true},"documentHighlightProvider":true,"textDocumentSync":2}}}Content-Length: 201
{"jsonrpc":"2.0","id":0,"method":"client/registerCapability","params":{"registrations":[{"id":"91b68732-e3ec-49a1-bfb6-1202b45aad6f","method":"workspace/didChangeConfiguration","registerOptions":{}}]}}Content-Length: 101
{"jsonrpc":"2.0","id":1,"method":"workspace/configuration","params":{"items":[{"section":"MATLAB"}]}}Content-Length: 204
{"jsonrpc":"2.0","id":2,"method":"client/registerCapability","params":{"registrations":[{"id":"93246463-a499-485b-b7af-5c7110954b4d","method":"workspace/didChangeWorkspaceFolders","registerOptions":{}}]}}Content-Length: 103
{"jsonrpc":"2.0","method":"matlab/connection/update/server","params":{"connectionStatus":"connecting"}}Content-Length: 62
{"jsonrpc":"2.0","id":3,"method":"workspace/workspaceFolders"}
stderr:
(node:26511) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
/opt/matlab-language-server/out/index.js:43412
responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));
^
ResponseError: no handler for method: workspace/workspaceFolders
at handleResponse (/opt/matlab-language-server/out/index.js:43412:48)
at handleMessage (/opt/matlab-language-server/out/index.js:43192:13)
at processMessageQueue (/opt/matlab-language-server/out/index.js:43209:17)
at Immediate.<anonymous> (/opt/matlab-language-server/out/index.js:43181:13)
at process.processImmediate (node:internal/timers:485:21) {
code: 0,
data: undefined
}
Node.js v22.21.1
Example `crush.json` lsp config for `matlab-language-server`
Example crush.json lsp config for matlab-language-server
{
"$schema": "https://charm.land/crush.json",
"lsp": {
"matlab": {
"command": "/usr/local/bin/matlab-language-server",
"args": [
"--stdio"
],
"env": {
"MLM_LICENSE_FILE": "27000@host"
},
"init_options": {
"MATLAB": {
"installPath": "/opt/matlab/R2025b",
"indexWorkspace": true,
"matlabConnectionTiming": "onStart",
"telemetry": false,
"signIn": true,
"prewarmGraphics": false
}
}
}
},
...
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in src/server.ts and trace workspace-folder handling through src/lifecycle/MatlabSession.ts, src/lifecycle/PathSynchronizer.ts, and src/indexing/WorkspaceIndexer.ts. Verify the reported error path with the provided client scenario and existing repository checks. Done means failed or null workspace-folder requests no longer crash the server, initialization folders are used when available, and later indexing continues with an empty fallback.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 42/100