summaryrefslogtreecommitdiff
path: root/cli/lsp/tsc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/tsc.rs')
-rw-r--r--cli/lsp/tsc.rs35
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();