diff options
Diffstat (limited to 'cli/lsp/tsc.rs')
-rw-r--r-- | cli/lsp/tsc.rs | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index 0e5e3a995..61a6c9796 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -18,11 +18,11 @@ use super::text::LineIndex; use super::urls::INVALID_SPECIFIER; use crate::config_file::TsConfig; -use crate::media_type::MediaType; use crate::tokio_util::create_basic_runtime; use crate::tsc; use crate::tsc::ResolveArgs; +use deno_ast::MediaType; use deno_core::error::anyhow; use deno_core::error::custom_error; use deno_core::error::AnyError; @@ -45,6 +45,7 @@ use lspower::lsp; use regex::Captures; use regex::Regex; use std::collections::HashSet; +use std::sync::Arc; use std::thread; use std::{borrow::Cow, cmp}; use std::{collections::HashMap, path::Path}; @@ -111,7 +112,7 @@ impl TsServer { /// from static assets built into Rust, or static assets built into tsc. #[derive(Debug, Clone)] pub struct AssetDocument { - pub text: String, + pub text: Arc<String>, pub length: usize, pub line_index: LineIndex, pub maybe_navigation_tree: Option<NavigationTree>, @@ -121,7 +122,7 @@ impl AssetDocument { pub fn new<T: AsRef<str>>(text: T) -> Self { let text = text.as_ref(); Self { - text: text.to_string(), + text: Arc::new(text.to_string()), length: text.encode_utf16().count(), line_index: LineIndex::new(text), maybe_navigation_tree: None, @@ -2057,7 +2058,7 @@ fn cache_snapshot( state .state_snapshot .documents - .content(specifier)? + .content(specifier) .ok_or_else(|| { anyhow!("Specifier unexpectedly doesn't have content: {}", specifier) })? @@ -2068,7 +2069,7 @@ fn cache_snapshot( }; state .snapshots - .insert((specifier.clone(), version.into()), content); + .insert((specifier.clone(), version.into()), content.to_string()); } Ok(()) } @@ -2235,17 +2236,16 @@ fn op_get_text( let specifier = state.normalize_specifier(args.specifier)?; let content = if let Some(Some(content)) = state.state_snapshot.assets.get(&specifier) { - content.text.clone() + content.text.as_str() } else { cache_snapshot(state, &specifier, args.version.clone())?; state .snapshots .get(&(specifier, args.version.into())) .unwrap() - .clone() }; state.state_snapshot.performance.measure(mark); - Ok(text::slice(&content, args.start..args.end).to_string()) + Ok(text::slice(content, args.start..args.end).to_string()) } fn op_load( @@ -2259,7 +2259,7 @@ fn op_load( let specifier = state.normalize_specifier(args.specifier)?; let result = state.state_snapshot.sources.get_source(&specifier); state.state_snapshot.performance.measure(mark); - Ok(result) + Ok(result.map(|t| t.to_string())) } fn op_resolve( @@ -2908,19 +2908,24 @@ mod tests { for (specifier, source, version, language_id) in fixtures { let specifier = resolve_url(specifier).expect("failed to create specifier"); - documents.open(specifier.clone(), *version, language_id.clone(), source); + documents.open( + specifier.clone(), + *version, + *language_id, + Arc::new(source.to_string()), + ); let media_type = MediaType::from(&specifier); - if let Ok(parsed_module) = - analysis::parse_module(&specifier, source, &media_type) + if let Some(Ok(parsed_module)) = + documents.get(&specifier).unwrap().source().module() { let (deps, _) = analysis::analyze_dependencies( &specifier, - &media_type, - &parsed_module, + media_type, + parsed_module, &None, ); let dep_ranges = - analysis::analyze_dependency_ranges(&parsed_module).ok(); + analysis::analyze_dependency_ranges(parsed_module).ok(); documents .set_dependencies(&specifier, Some(deps), dep_ranges) .unwrap(); |