Description
Background
Language Service Protocol is a protocol between code editor and a language server that provides code analysis features like autocompletion. Now with the mature local languages and app extension support in Code App, it is time to design and build the architecture necessary to implement LSP features.
Architecture
Server
We would run the language server implementation in an iOS app extension because:
- Language servers are prone to crashes, especially in a patched, non supported environment, we do not want the whole app to crash when they encountered errors
- Language runtime interferes with each other in a single process
This implies the language server must keep its memory usage low (~120MB). Careful configuration and crash recovery are necessary.
Websocket endpoints:
lsp/{language_identifier}
: Request to start language serverexecution/
: Request to start code execution
Requests are then accepted / rejected subject to resources availability. If accepted, stream stdio over web socket.
Client
Use monaco-languageclient to connect monaco editor to LSP using WebSocket.
async function connectMonacoToLanguageServer(languageIdentifier, serverURL) {}
async function disconnectLanguageServer(languageIdentifier?) {}
function languageServerConnectionDidDrop(languageIdentifier) {}
(To be added..)
TODOs:
- Design the editor-server communication protocol
- WebSocket or Posix socket?
- When to start or stop a language server?
- What to do when user requests code execution when there can only be one runtime instance? (Java, Node.js)
- What to do with multiple scene? A language server serves one editor at a time.
- Build the client using monaco-languageclient
- Build the server
- A web socket server that redirects stdio/stdin in ios_system / main thread
- Implementation of any crash recovery protocol
- Integration of the actual language servers
Some candidates of language server to integrate:
- https://github.com/pappasam/jedi-language-server (Python)
- https://github.com/georgewfraser/java-language-server (Java)
- https://github.com/typescript-language-server/typescript-language-server (TypeScript / JavaScript)
Metadata
Assignees
Labels
Type
Projects
Status
Done
Activity