summaryrefslogtreecommitdiff
path: root/cli/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp')
-rw-r--r--cli/lsp/analysis.rs89
-rw-r--r--cli/lsp/code_lens.rs38
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,