aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-12-08 18:18:29 +0000
committerAleksey Kladov <[email protected]>2018-12-08 18:18:29 +0000
commit7fd6a41127dc9a60efe703f7d588f8555b8bffc6 (patch)
tree91695d49c0dd47ce0543161b57b8986fa37eeb6b /crates/ra_lsp_server
parent7a79cde107ec71abbc7c715e933f29f7a1fb2b95 (diff)
Refactor symbol resolve API
Introduce ReferenceResolution to avoid nesting to many non-nominal types.
Diffstat (limited to 'crates/ra_lsp_server')
-rw-r--r--crates/ra_lsp_server/src/main_loop/handlers.rs15
1 files changed, 8 insertions, 7 deletions
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs
index f18a1305d..92e92f836 100644
--- a/crates/ra_lsp_server/src/main_loop/handlers.rs
+++ b/crates/ra_lsp_server/src/main_loop/handlers.rs
@@ -203,11 +203,12 @@ pub fn handle_goto_definition(
203 params: req::TextDocumentPositionParams, 203 params: req::TextDocumentPositionParams,
204) -> Result<Option<req::GotoDefinitionResponse>> { 204) -> Result<Option<req::GotoDefinitionResponse>> {
205 let position = params.try_conv_with(&world)?; 205 let position = params.try_conv_with(&world)?;
206 let mut res = Vec::new(); 206 let rr = match world.analysis().approximately_resolve_symbol(position)? {
207 for (file_id, symbol) in match world.analysis().approximately_resolve_symbol(position)? {
208 None => return Ok(None), 207 None => return Ok(None),
209 Some(it) => it.1, 208 Some(it) => it,
210 } { 209 };
210 let mut res = Vec::new();
211 for (file_id, symbol) in rr.resolves_to {
211 let line_index = world.analysis().file_line_index(file_id); 212 let line_index = world.analysis().file_line_index(file_id);
212 let location = to_location(file_id, symbol.node_range, &world, &line_index)?; 213 let location = to_location(file_id, symbol.node_range, &world, &line_index)?;
213 res.push(location) 214 res.push(location)
@@ -510,17 +511,17 @@ pub fn handle_hover(
510 // TODO: Cut down on number of allocations 511 // TODO: Cut down on number of allocations
511 let position = params.try_conv_with(&world)?; 512 let position = params.try_conv_with(&world)?;
512 let line_index = world.analysis().file_line_index(position.file_id); 513 let line_index = world.analysis().file_line_index(position.file_id);
513 let (range, resolved) = match world.analysis().approximately_resolve_symbol(position)? { 514 let rr = match world.analysis().approximately_resolve_symbol(position)? {
514 None => return Ok(None), 515 None => return Ok(None),
515 Some(it) => it, 516 Some(it) => it,
516 }; 517 };
517 let mut result = Vec::new(); 518 let mut result = Vec::new();
518 for (file_id, symbol) in resolved { 519 for (file_id, symbol) in rr.resolves_to {
519 if let Some(docs) = world.analysis().doc_text_for(file_id, symbol)? { 520 if let Some(docs) = world.analysis().doc_text_for(file_id, symbol)? {
520 result.push(docs); 521 result.push(docs);
521 } 522 }
522 } 523 }
523 let range = range.conv_with(&line_index); 524 let range = rr.reference_range.conv_with(&line_index);
524 if result.len() > 0 { 525 if result.len() > 0 {
525 return Ok(Some(Hover { 526 return Ok(Some(Hover {
526 contents: HoverContents::Scalar(MarkedString::String(result.join("\n\n---\n"))), 527 contents: HoverContents::Scalar(MarkedString::String(result.join("\n\n---\n"))),