Skip to content

Commit 3e00bfc

Browse files
committed
Document statelessness invariant
1 parent 5a1306a commit 3e00bfc

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

docs/dev/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ In general, API is centered around UI concerns -- the result of the call is what
170170
The results are 100% Rust specific though.
171171
Shout outs to LSP developers for popularizing the idea that "UI" is a good place to draw a boundary at.
172172

173+
## LSP is sateless
174+
175+
The protocol is implemented in the mostly stateless way.
176+
A good mental model is HTTP, which doesn't store per-client state, and instead relies on devices like cookies to maintain an illusion of state.
177+
If some action requires multi-step protocol, each step should be self-contained.
178+
179+
A good example here is code action resolving process.
180+
TO display the lightbulb, we compute the list of code actions without computing edits.
181+
Figuring out the edit is done in a separate `codeAction/resolve` call.
182+
Rather than storing some `lazy_edit: Box<dyn FnOnce() -> Edit>` somewhere, we use a string ID of action to re-compute the list of actions during the resolve process.
183+
(See [this post](https://rust-analyzer.github.io/blog/2020/09/28/how-to-make-a-light-bulb.html) for more details.)
184+
The benefit here is that, generally speaking, the state of the world might change between `codeAction` and `codeAction` resolve requests, so any closure we store might become invalid.
185+
186+
While we don't currently implement any complicated refactors with complex GUI, I imagine we'd use the same techniques for refactors.
187+
After clicking each "Next" button during refactor, the client would send all the info which server needs to re-recreate the context from scratch.
188+
173189
## CI
174190

175191
CI does not test rust-analyzer, CI is a core part of rust-analyzer, and is maintained with above average standard of quality.

0 commit comments

Comments
 (0)