diff options
Diffstat (limited to 'cli/lsp')
-rw-r--r-- | cli/lsp/analysis.rs | 89 | ||||
-rw-r--r-- | cli/lsp/code_lens.rs | 38 |
2 files changed, 58 insertions, 69 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index aae67f87a..17fdf5d4c 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -29,9 +29,6 @@ use regex::Regex; use std::cmp::Ordering; use std::collections::HashMap; use std::fmt; -use std::rc::Rc; -use swc_common::Loc; -use swc_common::SourceMap; use swc_common::DUMMY_SP; use swc_ecmascript::ast as swc_ast; use swc_ecmascript::visit::Node; @@ -287,13 +284,7 @@ pub fn parse_module( source: &str, media_type: &MediaType, ) -> Result<ast::ParsedModule, AnyError> { - let source_map = Rc::new(swc_common::SourceMap::default()); - ast::parse_with_source_map( - &specifier.to_string(), - source, - media_type, - source_map, - ) + ast::parse(&specifier.to_string(), source, media_type) } // TODO(@kitsonk) a lot of this logic is duplicated in module_graph.rs in @@ -310,7 +301,7 @@ pub fn analyze_dependencies( // Parse leading comments for supported triple slash references. for comment in parsed_module.get_leading_comments().iter() { if let Some((ts_reference, span)) = parse_ts_reference(comment) { - let loc = parsed_module.source_map.lookup_char_pos(span.lo); + let loc = parsed_module.get_location(span.lo); match ts_reference { TypeScriptReference::Path(import) => { let dep = dependencies.entry(import.clone()).or_default(); @@ -320,11 +311,11 @@ pub fn analyze_dependencies( dep.maybe_code_specifier_range = Some(Range { start: Position { line: (loc.line - 1) as u32, - character: loc.col_display as u32, + character: loc.col as u32, }, end: Position { line: (loc.line - 1) as u32, - character: (loc.col_display + import.chars().count() + 2) as u32, + character: (loc.col + import.chars().count() + 2) as u32, }, }); } @@ -341,11 +332,11 @@ pub fn analyze_dependencies( dep.maybe_type_specifier_range = Some(Range { start: Position { line: (loc.line - 1) as u32, - character: loc.col_display as u32, + character: loc.col as u32, }, end: Position { line: (loc.line - 1) as u32, - character: (loc.col_display + import.chars().count() + 2) as u32, + character: (loc.col + import.chars().count() + 2) as u32, }, }); } @@ -368,7 +359,7 @@ pub fn analyze_dependencies( ( resolve_import(deno_types, specifier, maybe_import_map), deno_types.clone(), - parsed_module.source_map.lookup_char_pos(span.lo) + parsed_module.get_location(span.lo) ) }) } else { @@ -377,20 +368,16 @@ pub fn analyze_dependencies( let dep = dependencies.entry(desc.specifier.to_string()).or_default(); dep.is_dynamic = desc.is_dynamic; - let start = parsed_module - .source_map - .lookup_char_pos(desc.specifier_span.lo); - let end = parsed_module - .source_map - .lookup_char_pos(desc.specifier_span.hi); + let start = parsed_module.get_location(desc.specifier_span.lo); + let end = parsed_module.get_location(desc.specifier_span.hi); let range = Range { start: Position { line: (start.line - 1) as u32, - character: start.col_display as u32, + character: start.col as u32, }, end: Position { line: (end.line - 1) as u32, - character: end.col_display as u32, + character: end.col as u32, }, }; dep.maybe_code_specifier_range = Some(range); @@ -402,11 +389,11 @@ pub fn analyze_dependencies( dep.maybe_type_specifier_range = Some(Range { start: Position { line: (loc.line - 1) as u32, - character: (loc.col_display + 1) as u32, + character: (loc.col + 1) as u32, }, end: Position { line: (loc.line - 1) as u32, - character: (loc.col_display + 1 + specifier.chars().count()) as u32, + character: (loc.col + 1 + specifier.chars().count()) as u32, }, }); dep.maybe_type = Some(resolved_dependency); @@ -971,16 +958,19 @@ fn prepend_whitespace(content: String, line_content: Option<String>) -> String { } } -/// Get LSP range from the provided SWC start and end locations. -fn get_range_from_loc(start: &Loc, end: &Loc) -> lsp::Range { +/// Get LSP range from the provided start and end locations. +fn get_range_from_location( + start: &ast::Location, + end: &ast::Location, +) -> lsp::Range { lsp::Range { start: lsp::Position { line: (start.line - 1) as u32, - character: start.col_display as u32, + character: start.col as u32, }, end: lsp::Position { line: (end.line - 1) as u32, - character: end.col_display as u32, + character: end.col as u32, }, } } @@ -1029,16 +1019,16 @@ impl DependencyRanges { } } -struct DependencyRangeCollector { +struct DependencyRangeCollector<'a> { import_ranges: DependencyRanges, - source_map: Rc<SourceMap>, + parsed_module: &'a ast::ParsedModule, } -impl DependencyRangeCollector { - pub fn new(source_map: Rc<SourceMap>) -> Self { +impl<'a> DependencyRangeCollector<'a> { + pub fn new(parsed_module: &'a ast::ParsedModule) -> Self { Self { import_ranges: DependencyRanges::default(), - source_map, + parsed_module, } } @@ -1047,16 +1037,16 @@ impl DependencyRangeCollector { } } -impl Visit for DependencyRangeCollector { +impl<'a> Visit for DependencyRangeCollector<'a> { fn visit_import_decl( &mut self, node: &swc_ast::ImportDecl, _parent: &dyn Node, ) { - let start = self.source_map.lookup_char_pos(node.src.span.lo); - let end = self.source_map.lookup_char_pos(node.src.span.hi); + let start = self.parsed_module.get_location(node.src.span.lo); + let end = self.parsed_module.get_location(node.src.span.hi); self.import_ranges.0.push(DependencyRange { - range: narrow_range(get_range_from_loc(&start, &end)), + range: narrow_range(get_range_from_location(&start, &end)), specifier: node.src.value.to_string(), }); } @@ -1067,10 +1057,10 @@ impl Visit for DependencyRangeCollector { _parent: &dyn Node, ) { if let Some(src) = &node.src { - let start = self.source_map.lookup_char_pos(src.span.lo); - let end = self.source_map.lookup_char_pos(src.span.hi); + let start = self.parsed_module.get_location(src.span.lo); + let end = self.parsed_module.get_location(src.span.hi); self.import_ranges.0.push(DependencyRange { - range: narrow_range(get_range_from_loc(&start, &end)), + range: narrow_range(get_range_from_location(&start, &end)), specifier: src.value.to_string(), }); } @@ -1081,10 +1071,10 @@ impl Visit for DependencyRangeCollector { node: &swc_ast::ExportAll, _parent: &dyn Node, ) { - let start = self.source_map.lookup_char_pos(node.src.span.lo); - let end = self.source_map.lookup_char_pos(node.src.span.hi); + let start = self.parsed_module.get_location(node.src.span.lo); + let end = self.parsed_module.get_location(node.src.span.hi); self.import_ranges.0.push(DependencyRange { - range: narrow_range(get_range_from_loc(&start, &end)), + range: narrow_range(get_range_from_location(&start, &end)), specifier: node.src.value.to_string(), }); } @@ -1094,10 +1084,10 @@ impl Visit for DependencyRangeCollector { node: &swc_ast::TsImportType, _parent: &dyn Node, ) { - let start = self.source_map.lookup_char_pos(node.arg.span.lo); - let end = self.source_map.lookup_char_pos(node.arg.span.hi); + let start = self.parsed_module.get_location(node.arg.span.lo); + let end = self.parsed_module.get_location(node.arg.span.hi); self.import_ranges.0.push(DependencyRange { - range: narrow_range(get_range_from_loc(&start, &end)), + range: narrow_range(get_range_from_location(&start, &end)), specifier: node.arg.value.to_string(), }); } @@ -1108,8 +1098,7 @@ impl Visit for DependencyRangeCollector { pub fn analyze_dependency_ranges( parsed_module: &ast::ParsedModule, ) -> Result<DependencyRanges, AnyError> { - let mut collector = - DependencyRangeCollector::new(parsed_module.source_map.clone()); + let mut collector = DependencyRangeCollector::new(parsed_module); parsed_module .module .visit_with(&swc_ast::Invalid { span: DUMMY_SP }, &mut collector); diff --git a/cli/lsp/code_lens.rs b/cli/lsp/code_lens.rs index 1f8d2481b..0570ac703 100644 --- a/cli/lsp/code_lens.rs +++ b/cli/lsp/code_lens.rs @@ -3,6 +3,7 @@ use super::analysis; use super::language_server; use super::tsc; +use crate::ast::ParsedModule; use deno_core::error::anyhow; use deno_core::error::AnyError; @@ -17,7 +18,6 @@ use regex::Regex; use std::cell::RefCell; use std::collections::HashSet; use std::rc::Rc; -use swc_common::SourceMap; use swc_common::Span; use swc_ecmascript::ast; use swc_ecmascript::visit::Node; @@ -44,40 +44,43 @@ pub struct CodeLensData { pub specifier: ModuleSpecifier, } -fn span_to_range(span: &Span, source_map: Rc<SourceMap>) -> lsp::Range { - let start = source_map.lookup_char_pos(span.lo); - let end = source_map.lookup_char_pos(span.hi); +fn span_to_range(span: &Span, parsed_module: &ParsedModule) -> lsp::Range { + let start = parsed_module.get_location(span.lo); + let end = parsed_module.get_location(span.hi); lsp::Range { start: lsp::Position { line: (start.line - 1) as u32, - character: start.col_display as u32, + character: start.col as u32, }, end: lsp::Position { line: (end.line - 1) as u32, - character: end.col_display as u32, + character: end.col as u32, }, } } -struct DenoTestCollector { +struct DenoTestCollector<'a> { code_lenses: Vec<lsp::CodeLens>, - source_map: Rc<SourceMap>, + parsed_module: &'a ParsedModule, specifier: ModuleSpecifier, test_vars: HashSet<String>, } -impl DenoTestCollector { - pub fn new(specifier: ModuleSpecifier, source_map: Rc<SourceMap>) -> Self { +impl<'a> DenoTestCollector<'a> { + pub fn new( + specifier: ModuleSpecifier, + parsed_module: &'a ParsedModule, + ) -> Self { Self { code_lenses: Vec::new(), - source_map, + parsed_module, specifier, test_vars: HashSet::new(), } } fn add_code_lens<N: AsRef<str>>(&mut self, name: N, span: &Span) { - let range = span_to_range(span, self.source_map.clone()); + let range = span_to_range(span, self.parsed_module); self.code_lenses.push(lsp::CodeLens { range, command: Some(lsp::Command { @@ -125,7 +128,7 @@ impl DenoTestCollector { } } -impl Visit for DenoTestCollector { +impl<'a> Visit for DenoTestCollector<'a> { 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() { @@ -392,10 +395,8 @@ fn collect_test( if let Ok(parsed_module) = analysis::parse_module(specifier, &source, &media_type) { - let mut collector = DenoTestCollector::new( - specifier.clone(), - parsed_module.source_map.clone(), - ); + let mut collector = + DenoTestCollector::new(specifier.clone(), &parsed_module); parsed_module.module.visit_with( &ast::Invalid { span: swc_common::DUMMY_SP, @@ -521,8 +522,7 @@ mod tests { let parsed_module = analysis::parse_module(&specifier, source, &MediaType::TypeScript) .unwrap(); - let mut collector = - DenoTestCollector::new(specifier, parsed_module.source_map.clone()); + let mut collector = DenoTestCollector::new(specifier, &parsed_module); parsed_module.module.visit_with( &ast::Invalid { span: swc_common::DUMMY_SP, |