I think we always need something like TM to have an in-process cache for symbols/tags. We're still a lightweight IDE so a my requirement would be to not exchange megabytes of json text on every keystroke.
It's definitely not megabytes. If you are curious about how typical communication looks like, you can try the geany-lsp plugin and set `rpc_log` in configuration to some file - you will get the full JSON RPC communication.
Question: How does a language server get access to the documents? Does it have to be saved on disk so that the server can open() it?
Basically, one first sends
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17...
where one can specify either a single project directory or multiple workspace directories. And then there are the document synchronization notifications informing about what is happening:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17...
If no, do we have to constantly send the entire document via IPC or network?
Only deltas (if servers support it, but all those I tried do, otherwise one would indeed have to send the whole document), see
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17...
I was slightly worried if documents don't get de-synchronized but it was quite easy to implement using Scintilla SCN_MODIFIED notifications and seems to work well.