summaryrefslogtreecommitdiff
path: root/cli/lsp/code_lens.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/code_lens.rs')
-rw-r--r--cli/lsp/code_lens.rs102
1 files changed, 69 insertions, 33 deletions
diff --git a/cli/lsp/code_lens.rs b/cli/lsp/code_lens.rs
index 6755f50d5..97ad8f260 100644
--- a/cli/lsp/code_lens.rs
+++ b/cli/lsp/code_lens.rs
@@ -25,6 +25,7 @@ use regex::Regex;
use std::cell::RefCell;
use std::collections::HashSet;
use std::rc::Rc;
+use std::sync::Arc;
lazy_static::lazy_static! {
static ref ABSTRACT_MODIFIER: Regex = Regex::new(r"\babstract\b").unwrap();
@@ -61,18 +62,15 @@ fn span_to_range(span: &Span, parsed_source: &ParsedSource) -> lsp::Range {
}
}
-struct DenoTestCollector<'a> {
+struct DenoTestCollector {
code_lenses: Vec<lsp::CodeLens>,
- parsed_source: &'a ParsedSource,
+ parsed_source: ParsedSource,
specifier: ModuleSpecifier,
test_vars: HashSet<String>,
}
-impl<'a> DenoTestCollector<'a> {
- pub fn new(
- specifier: ModuleSpecifier,
- parsed_source: &'a ParsedSource,
- ) -> Self {
+impl DenoTestCollector {
+ pub fn new(specifier: ModuleSpecifier, parsed_source: ParsedSource) -> Self {
Self {
code_lenses: Vec::new(),
parsed_source,
@@ -82,7 +80,7 @@ impl<'a> DenoTestCollector<'a> {
}
fn add_code_lens<N: AsRef<str>>(&mut self, name: N, span: &Span) {
- let range = span_to_range(span, self.parsed_source);
+ let range = span_to_range(span, &self.parsed_source);
self.code_lenses.push(lsp::CodeLens {
range,
command: Some(lsp::Command {
@@ -130,7 +128,7 @@ impl<'a> DenoTestCollector<'a> {
}
}
-impl<'a> Visit for DenoTestCollector<'a> {
+impl Visit for DenoTestCollector {
fn visit_call_expr(&mut self, node: &ast::CallExpr, _parent: &dyn Node) {
if let ast::ExprOrSuper::Expr(callee_expr) = &node.callee {
match callee_expr.as_ref() {
@@ -238,7 +236,7 @@ async fn resolve_implementation_code_lens(
let implementation_specifier =
resolve_url(&implementation.document_span.file_name)?;
let implementation_location =
- implementation.to_location(&line_index, language_server);
+ implementation.to_location(line_index.clone(), language_server);
if !(implementation_specifier == data.specifier
&& implementation_location.range.start == code_lens.range.start)
{
@@ -311,7 +309,7 @@ async fn resolve_references_code_lens(
resolve_url(&reference.document_span.file_name)?;
let line_index =
language_server.get_line_index(reference_specifier).await?;
- locations.push(reference.to_location(&line_index, language_server));
+ locations.push(reference.to_location(line_index, language_server));
}
let command = if !locations.is_empty() {
let title = if locations.len() > 1 {
@@ -372,9 +370,9 @@ pub(crate) async fn resolve_code_lens(
pub(crate) async fn collect(
specifier: &ModuleSpecifier,
- parsed_source: Option<&ParsedSource>,
+ parsed_source: Option<ParsedSource>,
config: &Config,
- line_index: &LineIndex,
+ line_index: Arc<LineIndex>,
navigation_tree: &NavigationTree,
) -> Result<Vec<lsp::CodeLens>, AnyError> {
let mut code_lenses = collect_test(specifier, parsed_source, config)?;
@@ -393,13 +391,13 @@ pub(crate) async fn collect(
fn collect_test(
specifier: &ModuleSpecifier,
- parsed_source: Option<&ParsedSource>,
+ parsed_source: Option<ParsedSource>,
config: &Config,
) -> Result<Vec<lsp::CodeLens>, AnyError> {
if config.specifier_code_lens_test(specifier) {
if let Some(parsed_source) = parsed_source {
let mut collector =
- DenoTestCollector::new(specifier.clone(), parsed_source);
+ DenoTestCollector::new(specifier.clone(), parsed_source.clone());
parsed_source.module().visit_with(
&ast::Invalid {
span: deno_ast::swc::common::DUMMY_SP,
@@ -416,7 +414,7 @@ fn collect_test(
async fn collect_tsc(
specifier: &ModuleSpecifier,
workspace_settings: &WorkspaceSettings,
- line_index: &LineIndex,
+ line_index: Arc<LineIndex>,
navigation_tree: &NavigationTree,
) -> Result<Vec<lsp::CodeLens>, AnyError> {
let code_lenses = Rc::new(RefCell::new(Vec::new()));
@@ -428,7 +426,11 @@ async fn collect_tsc(
let source = CodeLensSource::Implementations;
match i.kind {
tsc::ScriptElementKind::InterfaceElement => {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
tsc::ScriptElementKind::ClassElement
| tsc::ScriptElementKind::MemberFunctionElement
@@ -436,7 +438,11 @@ async fn collect_tsc(
| tsc::ScriptElementKind::MemberGetAccessorElement
| tsc::ScriptElementKind::MemberSetAccessorElement => {
if ABSTRACT_MODIFIER.is_match(&i.kind_modifiers) {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
}
_ => (),
@@ -448,31 +454,51 @@ async fn collect_tsc(
let source = CodeLensSource::References;
if let Some(parent) = &mp {
if parent.kind == tsc::ScriptElementKind::EnumElement {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
}
match i.kind {
tsc::ScriptElementKind::FunctionElement => {
if workspace_settings.code_lens.references_all_functions {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
}
tsc::ScriptElementKind::ConstElement
| tsc::ScriptElementKind::LetElement
| tsc::ScriptElementKind::VariableElement => {
if EXPORT_MODIFIER.is_match(&i.kind_modifiers) {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
}
tsc::ScriptElementKind::ClassElement => {
if i.text != "<class>" {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
}
tsc::ScriptElementKind::InterfaceElement
| tsc::ScriptElementKind::TypeElement
| tsc::ScriptElementKind::EnumElement => {
- code_lenses.push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
tsc::ScriptElementKind::LocalFunctionElement
| tsc::ScriptElementKind::MemberGetAccessorElement
@@ -485,8 +511,11 @@ async fn collect_tsc(
tsc::ScriptElementKind::ClassElement
| tsc::ScriptElementKind::InterfaceElement
| tsc::ScriptElementKind::TypeElement => {
- code_lenses
- .push(i.to_code_lens(line_index, specifier, &source));
+ code_lenses.push(i.to_code_lens(
+ line_index.clone(),
+ specifier,
+ &source,
+ ));
}
_ => (),
}
@@ -510,21 +539,28 @@ mod tests {
#[test]
fn test_deno_test_collector() {
let specifier = resolve_url("https://deno.land/x/mod.ts").unwrap();
- let source = r#"
+ let source = Arc::new(
+ r#"
Deno.test({
name: "test a",
fn() {}
});
Deno.test("test b", function anotherTest() {});
- "#;
- let parsed_module = crate::lsp::analysis::parse_module(
- &specifier,
- SourceTextInfo::from_string(source.to_string()),
- MediaType::TypeScript,
- )
+ "#
+ .to_string(),
+ );
+ let parsed_module = deno_ast::parse_module(deno_ast::ParseParams {
+ specifier: specifier.to_string(),
+ source: SourceTextInfo::new(source),
+ media_type: MediaType::TypeScript,
+ capture_tokens: true,
+ scope_analysis: true,
+ maybe_syntax: None,
+ })
.unwrap();
- let mut collector = DenoTestCollector::new(specifier, &parsed_module);
+ let mut collector =
+ DenoTestCollector::new(specifier, parsed_module.clone());
parsed_module.module().visit_with(
&ast::Invalid {
span: deno_ast::swc::common::DUMMY_SP,