aboutsummaryrefslogtreecommitdiff
path: root/crates/gen_lsp_server/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/gen_lsp_server/src')
-rw-r--r--crates/gen_lsp_server/src/lib.rs35
-rw-r--r--crates/gen_lsp_server/src/msg.rs29
-rw-r--r--crates/gen_lsp_server/src/stdio.rs6
3 files changed, 33 insertions, 37 deletions
diff --git a/crates/gen_lsp_server/src/lib.rs b/crates/gen_lsp_server/src/lib.rs
index 645728a57..e45a6b5e2 100644
--- a/crates/gen_lsp_server/src/lib.rs
+++ b/crates/gen_lsp_server/src/lib.rs
@@ -59,7 +59,6 @@
59//! } 59//! }
60//! ``` 60//! ```
61 61
62
63#[macro_use] 62#[macro_use]
64extern crate failure; 63extern crate failure;
65#[macro_use] 64#[macro_use]
@@ -74,16 +73,16 @@ extern crate languageserver_types;
74mod msg; 73mod msg;
75mod stdio; 74mod stdio;
76 75
77use crossbeam_channel::{Sender, Receiver}; 76use crossbeam_channel::{Receiver, Sender};
78use languageserver_types::{ 77use languageserver_types::{
79 ServerCapabilities, InitializeResult, InitializeParams, 78 notification::{Exit, Initialized},
80 request::{Initialize, Shutdown}, 79 request::{Initialize, Shutdown},
81 notification::{Initialized, Exit}, 80 InitializeParams, InitializeResult, ServerCapabilities,
82}; 81};
83 82
84pub type Result<T> = ::std::result::Result<T, failure::Error>; 83pub type Result<T> = ::std::result::Result<T, failure::Error>;
85pub use { 84pub use {
86 msg::{RawMessage, RawRequest, RawResponse, RawResponseError, RawNotification, ErrorCode}, 85 msg::{ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse, RawResponseError},
87 stdio::{stdio_transport, Threads}, 86 stdio::{stdio_transport, Threads},
88}; 87};
89 88
@@ -97,11 +96,7 @@ pub fn run_server(
97 caps: ServerCapabilities, 96 caps: ServerCapabilities,
98 receiver: Receiver<RawMessage>, 97 receiver: Receiver<RawMessage>,
99 sender: Sender<RawMessage>, 98 sender: Sender<RawMessage>,
100 server: impl FnOnce( 99 server: impl FnOnce(InitializeParams, &Receiver<RawMessage>, &Sender<RawMessage>) -> Result<()>,
101 InitializeParams,
102 &Receiver<RawMessage>,
103 &Sender<RawMessage>,
104 ) -> Result<()>,
105) -> Result<()> { 100) -> Result<()> {
106 info!("lsp server initializes"); 101 info!("lsp server initializes");
107 let params = initialize(&receiver, &sender, caps)?; 102 let params = initialize(&receiver, &sender, caps)?;
@@ -109,12 +104,10 @@ pub fn run_server(
109 server(params, &receiver, &sender)?; 104 server(params, &receiver, &sender)?;
110 info!("lsp server waiting for exit notification"); 105 info!("lsp server waiting for exit notification");
111 match receiver.recv() { 106 match receiver.recv() {
112 Some(RawMessage::Notification(n)) => { 107 Some(RawMessage::Notification(n)) => n
113 n.cast::<Exit>().map_err(|n| format_err!( 108 .cast::<Exit>()
114 "unexpected notification during shutdown: {:?}", n 109 .map_err(|n| format_err!("unexpected notification during shutdown: {:?}", n))?,
115 ))? 110 m => bail!("unexpected message during shutdown: {:?}", m),
116 }
117 m => bail!("unexpected message during shutdown: {:?}", m)
118 } 111 }
119 info!("lsp server shutdown complete"); 112 info!("lsp server shutdown complete");
120 Ok(()) 113 Ok(())
@@ -141,17 +134,15 @@ fn initialize(
141 Some(RawMessage::Request(req)) => match req.cast::<Initialize>() { 134 Some(RawMessage::Request(req)) => match req.cast::<Initialize>() {
142 Err(req) => bail!("expected initialize request, got {:?}", req), 135 Err(req) => bail!("expected initialize request, got {:?}", req),
143 Ok(req) => req, 136 Ok(req) => req,
144 } 137 },
145 msg => 138 msg => bail!("expected initialize request, got {:?}", msg),
146 bail!("expected initialize request, got {:?}", msg),
147 }; 139 };
148 let resp = RawResponse::ok::<Initialize>(id, &InitializeResult { capabilities: caps }); 140 let resp = RawResponse::ok::<Initialize>(id, &InitializeResult { capabilities: caps });
149 sender.send(RawMessage::Response(resp)); 141 sender.send(RawMessage::Response(resp));
150 match receiver.recv() { 142 match receiver.recv() {
151 Some(RawMessage::Notification(n)) => { 143 Some(RawMessage::Notification(n)) => {
152 n.cast::<Initialized>().map_err(|_| format_err!( 144 n.cast::<Initialized>()
153 "expected initialized notification" 145 .map_err(|_| format_err!("expected initialized notification"))?;
154 ))?;
155 } 146 }
156 _ => bail!("expected initialized notification"), 147 _ => bail!("expected initialized notification"),
157 } 148 }
diff --git a/crates/gen_lsp_server/src/msg.rs b/crates/gen_lsp_server/src/msg.rs
index 7fcac6f6d..e0d0aeab5 100644
--- a/crates/gen_lsp_server/src/msg.rs
+++ b/crates/gen_lsp_server/src/msg.rs
@@ -1,11 +1,8 @@
1use std::io::{BufRead, Write}; 1use std::io::{BufRead, Write};
2 2
3use serde_json::{Value, from_str, to_string, from_value, to_value}; 3use languageserver_types::{notification::Notification, request::Request};
4use serde::{Serialize, de::DeserializeOwned}; 4use serde::{de::DeserializeOwned, Serialize};
5use languageserver_types::{ 5use serde_json::{from_str, from_value, to_string, to_value, Value};
6 request::Request,
7 notification::Notification,
8};
9 6
10use Result; 7use Result;
11 8
@@ -81,7 +78,10 @@ impl RawMessage {
81 #[serde(flatten)] 78 #[serde(flatten)]
82 msg: RawMessage, 79 msg: RawMessage,
83 } 80 }
84 let text = to_string(&JsonRpc { jsonrpc: "2.0", msg: self })?; 81 let text = to_string(&JsonRpc {
82 jsonrpc: "2.0",
83 msg: self,
84 })?;
85 write_msg_text(w, &text)?; 85 write_msg_text(w, &text)?;
86 Ok(()) 86 Ok(())
87 } 87 }
@@ -115,8 +115,9 @@ impl RawRequest {
115 115
116impl RawResponse { 116impl RawResponse {
117 pub fn ok<R>(id: u64, result: &R::Result) -> RawResponse 117 pub fn ok<R>(id: u64, result: &R::Result) -> RawResponse
118 where R: Request, 118 where
119 R::Result: Serialize, 119 R: Request,
120 R::Result: Serialize,
120 { 121 {
121 RawResponse { 122 RawResponse {
122 id, 123 id,
@@ -125,7 +126,11 @@ impl RawResponse {
125 } 126 }
126 } 127 }
127 pub fn err(id: u64, code: i32, message: String) -> RawResponse { 128 pub fn err(id: u64, code: i32, message: String) -> RawResponse {
128 let error = RawResponseError { code, message, data: None }; 129 let error = RawResponseError {
130 code,
131 message,
132 data: None,
133 };
129 RawResponse { 134 RawResponse {
130 id, 135 id,
131 result: None, 136 result: None,
@@ -174,7 +179,9 @@ fn read_msg_text(inp: &mut impl BufRead) -> Result<Option<String>> {
174 } 179 }
175 let mut parts = buf.splitn(2, ": "); 180 let mut parts = buf.splitn(2, ": ");
176 let header_name = parts.next().unwrap(); 181 let header_name = parts.next().unwrap();
177 let header_value = parts.next().ok_or_else(|| format_err!("malformed header: {:?}", buf))?; 182 let header_value = parts
183 .next()
184 .ok_or_else(|| format_err!("malformed header: {:?}", buf))?;
178 if header_name == "Content-Length" { 185 if header_name == "Content-Length" {
179 size = Some(header_value.parse::<usize>()?); 186 size = Some(header_value.parse::<usize>()?);
180 } 187 }
diff --git a/crates/gen_lsp_server/src/stdio.rs b/crates/gen_lsp_server/src/stdio.rs
index 81397bb2a..3d8a1712a 100644
--- a/crates/gen_lsp_server/src/stdio.rs
+++ b/crates/gen_lsp_server/src/stdio.rs
@@ -1,11 +1,9 @@
1use std::{ 1use std::{
2 io::{stdin, stdout},
2 thread, 3 thread,
3 io::{
4 stdout, stdin,
5 },
6}; 4};
7 5
8use crossbeam_channel::{Receiver, Sender, bounded}; 6use crossbeam_channel::{bounded, Receiver, Sender};
9 7
10use {RawMessage, Result}; 8use {RawMessage, Result};
11 9