summaryrefslogtreecommitdiff
path: root/cli/lsp/tsc.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2023-12-28 00:13:57 +0000
committerGitHub <noreply@github.com>2023-12-28 00:13:57 +0000
commit48dae2441c2085db345a8d2d225b2c063e740600 (patch)
tree15c7533f1ce8d830d36df2c1e74fc80a51634c0d /cli/lsp/tsc.rs
parentc2414db1f68d27db8ca6f192f0ff877f1394164c (diff)
perf(lsp): use LanguageServiceHost::getProjectVersion() (#21719)
Diffstat (limited to 'cli/lsp/tsc.rs')
-rw-r--r--cli/lsp/tsc.rs36
1 files changed, 35 insertions, 1 deletions
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs
index c3d16f038..32421ba69 100644
--- a/cli/lsp/tsc.rs
+++ b/cli/lsp/tsc.rs
@@ -70,6 +70,8 @@ use std::net::SocketAddr;
use std::ops::Range;
use std::path::Path;
use std::rc::Rc;
+use std::sync::atomic::AtomicUsize;
+use std::sync::atomic::Ordering;
use std::sync::Arc;
use std::thread;
use text_size::TextRange;
@@ -220,6 +222,7 @@ pub struct TsServer {
sender: mpsc::UnboundedSender<Request>,
receiver: Mutex<Option<mpsc::UnboundedReceiver<Request>>>,
specifier_map: Arc<TscSpecifierMap>,
+ project_version: Arc<AtomicUsize>,
inspector_server: Mutex<Option<Arc<InspectorServer>>>,
}
@@ -231,6 +234,7 @@ impl std::fmt::Debug for TsServer {
.field("sender", &self.sender)
.field("receiver", &self.receiver)
.field("specifier_map", &self.specifier_map)
+ .field("project_version", &self.project_version)
.field("inspector_server", &self.inspector_server.lock().is_some())
.finish()
}
@@ -245,6 +249,7 @@ impl TsServer {
sender: tx,
receiver: Mutex::new(Some(request_rx)),
specifier_map: Arc::new(TscSpecifierMap::new()),
+ project_version: Arc::new(AtomicUsize::new(1)),
inspector_server: Mutex::new(None),
}
}
@@ -267,12 +272,14 @@ impl TsServer {
let performance = self.performance.clone();
let cache = self.cache.clone();
let specifier_map = self.specifier_map.clone();
+ let project_version = self.project_version.clone();
let _join_handle = thread::spawn(move || {
run_tsc_thread(
receiver,
performance.clone(),
cache.clone(),
specifier_map.clone(),
+ project_version,
maybe_inspector_server,
)
});
@@ -354,6 +361,10 @@ impl TsServer {
self.request(snapshot, req).await
}
+ pub fn increment_project_version(&self) {
+ self.project_version.fetch_add(1, Ordering::Relaxed);
+ }
+
pub async fn get_supported_code_fixes(
&self,
snapshot: Arc<StateSnapshot>,
@@ -3830,6 +3841,7 @@ struct State {
response: Option<Response>,
state_snapshot: Arc<StateSnapshot>,
specifier_map: Arc<TscSpecifierMap>,
+ project_version: Arc<AtomicUsize>,
token: CancellationToken,
}
@@ -3838,6 +3850,7 @@ impl State {
state_snapshot: Arc<StateSnapshot>,
specifier_map: Arc<TscSpecifierMap>,
performance: Arc<Performance>,
+ project_version: Arc<AtomicUsize>,
) -> Self {
Self {
last_id: 1,
@@ -3845,6 +3858,7 @@ impl State {
response: None,
state_snapshot,
specifier_map,
+ project_version,
token: Default::default(),
}
}
@@ -4058,11 +4072,22 @@ fn op_script_version(
Ok(r)
}
+#[op2]
+#[string]
+fn op_project_version(state: &mut OpState) -> String {
+ let state = state.borrow_mut::<State>();
+ let mark = state.performance.mark("tsc.op.op_project_version");
+ let r = state.project_version.load(Ordering::Relaxed).to_string();
+ state.performance.measure(mark);
+ r
+}
+
fn run_tsc_thread(
mut request_rx: UnboundedReceiver<Request>,
performance: Arc<Performance>,
cache: Arc<dyn HttpCache>,
specifier_map: Arc<TscSpecifierMap>,
+ project_version: Arc<AtomicUsize>,
maybe_inspector_server: Option<Arc<InspectorServer>>,
) {
let has_inspector_server = maybe_inspector_server.is_some();
@@ -4070,7 +4095,12 @@ fn run_tsc_thread(
// supplied snapshot is an isolate that contains the TypeScript language
// server.
let mut tsc_runtime = JsRuntime::new(RuntimeOptions {
- extensions: vec![deno_tsc::init_ops(performance, cache, specifier_map)],
+ extensions: vec![deno_tsc::init_ops(
+ performance,
+ cache,
+ specifier_map,
+ project_version,
+ )],
startup_snapshot: Some(tsc::compiler_snapshot()),
inspector: maybe_inspector_server.is_some(),
..Default::default()
@@ -4137,11 +4167,13 @@ deno_core::extension!(deno_tsc,
op_respond,
op_script_names,
op_script_version,
+ op_project_version,
],
options = {
performance: Arc<Performance>,
cache: Arc<dyn HttpCache>,
specifier_map: Arc<TscSpecifierMap>,
+ project_version: Arc<AtomicUsize>,
},
state = |state, options| {
state.put(State::new(
@@ -4155,6 +4187,7 @@ deno_core::extension!(deno_tsc,
}),
options.specifier_map,
options.performance,
+ options.project_version,
));
},
);
@@ -5082,6 +5115,7 @@ mod tests {
b"export const b = \"b\";\n\nexport const a = \"b\";\n",
)
.unwrap();
+ ts_server.increment_project_version();
let specifier = resolve_url("file:///a.ts").unwrap();
let diagnostics = ts_server
.get_diagnostics(snapshot.clone(), vec![specifier], Default::default())