diff options
Diffstat (limited to 'cli/lsp/code_lens.rs')
-rw-r--r-- | cli/lsp/code_lens.rs | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/cli/lsp/code_lens.rs b/cli/lsp/code_lens.rs index 1253fe5aa..650e5e241 100644 --- a/cli/lsp/code_lens.rs +++ b/cli/lsp/code_lens.rs @@ -297,70 +297,72 @@ async fn resolve_references_code_lens( data: CodeLensData, language_server: &language_server::Inner, ) -> Result<lsp::CodeLens, AnyError> { - let asset_or_document = - language_server.get_asset_or_document(&data.specifier)?; - let line_index = asset_or_document.line_index(); - let req = tsc::RequestMethod::GetReferences(( - data.specifier.clone(), - line_index.offset_tsc(code_lens.range.start)?, - )); - let snapshot = language_server.snapshot(); - let maybe_references: Option<Vec<tsc::ReferenceEntry>> = - language_server.ts_server.request(snapshot, req).await?; - if let Some(references) = maybe_references { + fn get_locations( + maybe_referenced_symbols: Option<Vec<tsc::ReferencedSymbol>>, + language_server: &language_server::Inner, + ) -> Result<Vec<lsp::Location>, AnyError> { + let symbols = match maybe_referenced_symbols { + Some(symbols) => symbols, + None => return Ok(Vec::new()), + }; let mut locations = Vec::new(); - for reference in references { + for reference in symbols.iter().flat_map(|s| &s.references) { if reference.is_definition { continue; } let reference_specifier = - resolve_url(&reference.document_span.file_name)?; + resolve_url(&reference.entry.document_span.file_name)?; let asset_or_doc = language_server.get_asset_or_document(&reference_specifier)?; locations.push( reference + .entry .to_location(asset_or_doc.line_index(), &language_server.url_map), ); } - let command = if !locations.is_empty() { - let title = if locations.len() > 1 { - format!("{} references", locations.len()) - } else { - "1 reference".to_string() - }; - lsp::Command { - title, - command: "deno.showReferences".to_string(), - arguments: Some(vec![ - json!(data.specifier), - json!(code_lens.range.start), - json!(locations), - ]), - } - } else { - lsp::Command { - title: "0 references".to_string(), - command: "".to_string(), - arguments: None, - } - }; - Ok(lsp::CodeLens { - range: code_lens.range, - command: Some(command), - data: None, - }) + Ok(locations) + } + + let asset_or_document = + language_server.get_asset_or_document(&data.specifier)?; + let line_index = asset_or_document.line_index(); + let snapshot = language_server.snapshot(); + let maybe_referenced_symbols = language_server + .ts_server + .find_references( + snapshot, + &data.specifier, + line_index.offset_tsc(code_lens.range.start)?, + ) + .await?; + let locations = get_locations(maybe_referenced_symbols, language_server)?; + let title = if locations.len() == 1 { + "1 reference".to_string() } else { - let command = lsp::Command { - title: "0 references".to_string(), - command: "".to_string(), + format!("{} references", locations.len()) + }; + let command = if locations.is_empty() { + lsp::Command { + title, + command: String::new(), arguments: None, - }; - Ok(lsp::CodeLens { - range: code_lens.range, - command: Some(command), - data: None, - }) - } + } + } else { + lsp::Command { + title, + command: "deno.showReferences".to_string(), + arguments: Some(vec![ + json!(data.specifier), + json!(code_lens.range.start), + json!(locations), + ]), + } + }; + Ok(lsp::CodeLens { + range: code_lens.range, + command: Some(command), + data: None, + }) } pub async fn resolve_code_lens( |