diff options
Diffstat (limited to 'crates/server/src')
-rw-r--r-- | crates/server/src/main_loop/handlers.rs | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/crates/server/src/main_loop/handlers.rs b/crates/server/src/main_loop/handlers.rs index ae362ddaa..b68e93e46 100644 --- a/crates/server/src/main_loop/handlers.rs +++ b/crates/server/src/main_loop/handlers.rs | |||
@@ -5,10 +5,13 @@ use languageserver_types::{ | |||
5 | Command, TextDocumentIdentifier, WorkspaceEdit, | 5 | Command, TextDocumentIdentifier, WorkspaceEdit, |
6 | SymbolInformation, Position, Location, TextEdit, | 6 | SymbolInformation, Position, Location, TextEdit, |
7 | }; | 7 | }; |
8 | use serde_json::{to_value, from_value}; | ||
8 | use libanalysis::{Query}; | 9 | use libanalysis::{Query}; |
9 | use libeditor; | 10 | use libeditor; |
10 | use libsyntax2::TextUnit; | 11 | use libsyntax2::{ |
11 | use serde_json::{to_value, from_value}; | 12 | TextUnit, |
13 | text_utils::contains_offset_nonstrict, | ||
14 | }; | ||
12 | 15 | ||
13 | use ::{ | 16 | use ::{ |
14 | req::{self, Decoration}, Result, | 17 | req::{self, Decoration}, Result, |
@@ -117,7 +120,7 @@ pub fn handle_code_action( | |||
117 | let file = world.analysis().file_syntax(file_id)?; | 120 | let file = world.analysis().file_syntax(file_id)?; |
118 | let line_index = world.analysis().file_line_index(file_id)?; | 121 | let line_index = world.analysis().file_line_index(file_id)?; |
119 | let offset = params.range.conv_with(&line_index).start(); | 122 | let offset = params.range.conv_with(&line_index).start(); |
120 | let mut ret = Vec::new(); | 123 | let mut res = Vec::new(); |
121 | 124 | ||
122 | let actions = &[ | 125 | let actions = &[ |
123 | (ActionId::FlipComma, libeditor::flip_comma(&file, offset).is_some()), | 126 | (ActionId::FlipComma, libeditor::flip_comma(&file, offset).is_some()), |
@@ -128,10 +131,52 @@ pub fn handle_code_action( | |||
128 | for (id, edit) in actions { | 131 | for (id, edit) in actions { |
129 | if *edit { | 132 | if *edit { |
130 | let cmd = apply_code_action_cmd(*id, params.text_document.clone(), offset); | 133 | let cmd = apply_code_action_cmd(*id, params.text_document.clone(), offset); |
131 | ret.push(cmd); | 134 | res.push(cmd); |
135 | } | ||
136 | } | ||
137 | for runnable in libeditor::runnables(&file) { | ||
138 | if !contains_offset_nonstrict(runnable.range, offset) { | ||
139 | continue; | ||
140 | } | ||
141 | |||
142 | #[derive(Serialize)] | ||
143 | struct ProcessSpec { | ||
144 | bin: String, | ||
145 | args: Vec<String>, | ||
146 | env: HashMap<String, String>, | ||
132 | } | 147 | } |
148 | |||
149 | let spec = ProcessSpec { | ||
150 | bin: "cargo".to_string(), | ||
151 | args: match runnable.kind { | ||
152 | libeditor::RunnableKind::Test { name } => { | ||
153 | vec![ | ||
154 | "test".to_string(), | ||
155 | "--".to_string(), | ||
156 | name, | ||
157 | "--nocapture".to_string(), | ||
158 | ] | ||
159 | } | ||
160 | libeditor::RunnableKind::Bin => vec!["run".to_string()] | ||
161 | }, | ||
162 | env: { | ||
163 | let mut m = HashMap::new(); | ||
164 | m.insert( | ||
165 | "RUST_BACKTRACE".to_string(), | ||
166 | "short".to_string(), | ||
167 | ); | ||
168 | m | ||
169 | } | ||
170 | }; | ||
171 | |||
172 | let cmd = Command { | ||
173 | title: "Run ...".to_string(), | ||
174 | command: "libsyntax-rust.run".to_string(), | ||
175 | arguments: Some(vec![to_value(spec).unwrap()]), | ||
176 | }; | ||
177 | res.push(cmd); | ||
133 | } | 178 | } |
134 | return Ok(Some(ret)); | 179 | return Ok(Some(res)); |
135 | } | 180 | } |
136 | 181 | ||
137 | pub fn handle_workspace_symbol( | 182 | pub fn handle_workspace_symbol( |
@@ -257,11 +302,7 @@ struct ActionRequest { | |||
257 | } | 302 | } |
258 | 303 | ||
259 | fn apply_code_action_cmd(id: ActionId, doc: TextDocumentIdentifier, offset: TextUnit) -> Command { | 304 | fn apply_code_action_cmd(id: ActionId, doc: TextDocumentIdentifier, offset: TextUnit) -> Command { |
260 | let action_request = ActionRequest { | 305 | let action_request = ActionRequest { id, text_document: doc, offset }; |
261 | id, | ||
262 | text_document: doc, | ||
263 | offset, | ||
264 | }; | ||
265 | Command { | 306 | Command { |
266 | title: id.title().to_string(), | 307 | title: id.title().to_string(), |
267 | command: "apply_code_action".to_string(), | 308 | command: "apply_code_action".to_string(), |