diff options
Diffstat (limited to 'crates/gen_lsp_server/src/stdio.rs')
-rw-r--r-- | crates/gen_lsp_server/src/stdio.rs | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/crates/gen_lsp_server/src/stdio.rs b/crates/gen_lsp_server/src/stdio.rs index 35d8e46d0..5c8e33854 100644 --- a/crates/gen_lsp_server/src/stdio.rs +++ b/crates/gen_lsp_server/src/stdio.rs | |||
@@ -9,11 +9,13 @@ use failure::bail; | |||
9 | use crate::{RawMessage, Result}; | 9 | use crate::{RawMessage, Result}; |
10 | 10 | ||
11 | pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads) { | 11 | pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads) { |
12 | let (writer_sender, mut writer_receiver) = bounded::<RawMessage>(16); | 12 | let (writer_sender, writer_receiver) = bounded::<RawMessage>(16); |
13 | let writer = thread::spawn(move || { | 13 | let writer = thread::spawn(move || { |
14 | let stdout = stdout(); | 14 | let stdout = stdout(); |
15 | let mut stdout = stdout.lock(); | 15 | let mut stdout = stdout.lock(); |
16 | writer_receiver.try_for_each(|it| it.write(&mut stdout))?; | 16 | writer_receiver |
17 | .into_iter() | ||
18 | .try_for_each(|it| it.write(&mut stdout))?; | ||
17 | Ok(()) | 19 | Ok(()) |
18 | }); | 20 | }); |
19 | let (reader_sender, reader_receiver) = bounded::<RawMessage>(16); | 21 | let (reader_sender, reader_receiver) = bounded::<RawMessage>(16); |
@@ -21,7 +23,9 @@ pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads) | |||
21 | let stdin = stdin(); | 23 | let stdin = stdin(); |
22 | let mut stdin = stdin.lock(); | 24 | let mut stdin = stdin.lock(); |
23 | while let Some(msg) = RawMessage::read(&mut stdin)? { | 25 | while let Some(msg) = RawMessage::read(&mut stdin)? { |
24 | reader_sender.send(msg); | 26 | if let Err(_) = reader_sender.send(msg) { |
27 | break; | ||
28 | } | ||
25 | } | 29 | } |
26 | Ok(()) | 30 | Ok(()) |
27 | }); | 31 | }); |