mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
refactor(lsp): store project version on documents (#21892)
This commit is contained in:
parent
d47ee46ebb
commit
140ef53b26
3 changed files with 35 additions and 37 deletions
|
@ -896,6 +896,7 @@ pub struct Documents {
|
||||||
redirect_resolver: Arc<RedirectResolver>,
|
redirect_resolver: Arc<RedirectResolver>,
|
||||||
/// If --unstable-sloppy-imports is enabled.
|
/// If --unstable-sloppy-imports is enabled.
|
||||||
unstable_sloppy_imports: bool,
|
unstable_sloppy_imports: bool,
|
||||||
|
project_version: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Documents {
|
impl Documents {
|
||||||
|
@ -924,6 +925,7 @@ impl Documents {
|
||||||
has_injected_types_node_package: false,
|
has_injected_types_node_package: false,
|
||||||
redirect_resolver: Arc::new(RedirectResolver::new(cache)),
|
redirect_resolver: Arc::new(RedirectResolver::new(cache)),
|
||||||
unstable_sloppy_imports: false,
|
unstable_sloppy_imports: false,
|
||||||
|
project_version: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -935,6 +937,14 @@ impl Documents {
|
||||||
.flat_map(|value| value.get_type().or_else(|| value.get_code()))
|
.flat_map(|value| value.get_type().or_else(|| value.get_code()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn project_version(&self) -> String {
|
||||||
|
self.project_version.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn increment_project_version(&mut self) {
|
||||||
|
self.project_version += 1;
|
||||||
|
}
|
||||||
|
|
||||||
/// "Open" a document from the perspective of the editor, meaning that
|
/// "Open" a document from the perspective of the editor, meaning that
|
||||||
/// requests for information from the document will come from the in-memory
|
/// requests for information from the document will come from the in-memory
|
||||||
/// representation received from the language server client, versus reading
|
/// representation received from the language server client, versus reading
|
||||||
|
@ -957,10 +967,13 @@ impl Documents {
|
||||||
resolver,
|
resolver,
|
||||||
npm_resolver,
|
npm_resolver,
|
||||||
);
|
);
|
||||||
let mut file_system_docs = self.file_system_docs.lock();
|
{
|
||||||
file_system_docs.docs.remove(&specifier);
|
let mut file_system_docs = self.file_system_docs.lock();
|
||||||
file_system_docs.dirty = true;
|
file_system_docs.docs.remove(&specifier);
|
||||||
|
file_system_docs.dirty = true;
|
||||||
|
}
|
||||||
self.open_docs.insert(specifier, document.clone());
|
self.open_docs.insert(specifier, document.clone());
|
||||||
|
self.increment_project_version();
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
document
|
document
|
||||||
}
|
}
|
||||||
|
@ -995,6 +1008,7 @@ impl Documents {
|
||||||
self.get_npm_resolver(),
|
self.get_npm_resolver(),
|
||||||
)?;
|
)?;
|
||||||
self.open_docs.insert(doc.specifier().clone(), doc.clone());
|
self.open_docs.insert(doc.specifier().clone(), doc.clone());
|
||||||
|
self.increment_project_version();
|
||||||
Ok(doc)
|
Ok(doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,8 +1030,11 @@ impl Documents {
|
||||||
/// information about the document is required.
|
/// information about the document is required.
|
||||||
pub fn close(&mut self, specifier: &ModuleSpecifier) -> Result<(), AnyError> {
|
pub fn close(&mut self, specifier: &ModuleSpecifier) -> Result<(), AnyError> {
|
||||||
if let Some(document) = self.open_docs.remove(specifier) {
|
if let Some(document) = self.open_docs.remove(specifier) {
|
||||||
let mut file_system_docs = self.file_system_docs.lock();
|
{
|
||||||
file_system_docs.docs.insert(specifier.clone(), document);
|
let mut file_system_docs = self.file_system_docs.lock();
|
||||||
|
file_system_docs.docs.insert(specifier.clone(), document);
|
||||||
|
}
|
||||||
|
self.increment_project_version();
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -1422,6 +1439,7 @@ impl Documents {
|
||||||
);
|
);
|
||||||
self.resolver_config_hash = new_resolver_config_hash;
|
self.resolver_config_hash = new_resolver_config_hash;
|
||||||
|
|
||||||
|
self.increment_project_version();
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
self.calculate_dependents_if_dirty();
|
self.calculate_dependents_if_dirty();
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,14 +164,14 @@ impl LspNpmConfigHash {
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>, CancellationToken);
|
pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>, CancellationToken);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct StateNpmSnapshot {
|
pub struct StateNpmSnapshot {
|
||||||
pub node_resolver: Arc<NodeResolver>,
|
pub node_resolver: Arc<NodeResolver>,
|
||||||
pub npm_resolver: Arc<dyn CliNpmResolver>,
|
pub npm_resolver: Arc<dyn CliNpmResolver>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Snapshot of the state used by TSC.
|
/// Snapshot of the state used by TSC.
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct StateSnapshot {
|
pub struct StateSnapshot {
|
||||||
pub assets: AssetsSnapshot,
|
pub assets: AssetsSnapshot,
|
||||||
pub cache_metadata: cache::CacheMetadata,
|
pub cache_metadata: cache::CacheMetadata,
|
||||||
|
@ -1427,7 +1427,6 @@ impl Inner {
|
||||||
self
|
self
|
||||||
.diagnostics_server
|
.diagnostics_server
|
||||||
.invalidate(&self.documents.dependents(&specifier));
|
.invalidate(&self.documents.dependents(&specifier));
|
||||||
self.ts_server.increment_project_version();
|
|
||||||
self.send_diagnostics_update();
|
self.send_diagnostics_update();
|
||||||
self.send_testing_update();
|
self.send_testing_update();
|
||||||
}
|
}
|
||||||
|
@ -1472,7 +1471,6 @@ impl Inner {
|
||||||
let mut specifiers = self.documents.dependents(&specifier);
|
let mut specifiers = self.documents.dependents(&specifier);
|
||||||
specifiers.push(specifier.clone());
|
specifiers.push(specifier.clone());
|
||||||
self.diagnostics_server.invalidate(&specifiers);
|
self.diagnostics_server.invalidate(&specifiers);
|
||||||
self.ts_server.increment_project_version();
|
|
||||||
self.send_diagnostics_update();
|
self.send_diagnostics_update();
|
||||||
self.send_testing_update();
|
self.send_testing_update();
|
||||||
}
|
}
|
||||||
|
@ -1525,7 +1523,6 @@ impl Inner {
|
||||||
self.refresh_documents_config().await;
|
self.refresh_documents_config().await;
|
||||||
|
|
||||||
self.diagnostics_server.invalidate_all();
|
self.diagnostics_server.invalidate_all();
|
||||||
self.ts_server.increment_project_version();
|
|
||||||
self.send_diagnostics_update();
|
self.send_diagnostics_update();
|
||||||
self.send_testing_update();
|
self.send_testing_update();
|
||||||
}
|
}
|
||||||
|
@ -3388,7 +3385,6 @@ impl tower_lsp::LanguageServer for LanguageServer {
|
||||||
inner.refresh_npm_specifiers().await;
|
inner.refresh_npm_specifiers().await;
|
||||||
let specifiers = inner.documents.dependents(&specifier);
|
let specifiers = inner.documents.dependents(&specifier);
|
||||||
inner.diagnostics_server.invalidate(&specifiers);
|
inner.diagnostics_server.invalidate(&specifiers);
|
||||||
inner.ts_server.increment_project_version();
|
|
||||||
inner.send_diagnostics_update();
|
inner.send_diagnostics_update();
|
||||||
inner.send_testing_update();
|
inner.send_testing_update();
|
||||||
}
|
}
|
||||||
|
@ -3479,7 +3475,6 @@ impl tower_lsp::LanguageServer for LanguageServer {
|
||||||
let mut ls = self.0.write().await;
|
let mut ls = self.0.write().await;
|
||||||
ls.refresh_documents_config().await;
|
ls.refresh_documents_config().await;
|
||||||
ls.diagnostics_server.invalidate_all();
|
ls.diagnostics_server.invalidate_all();
|
||||||
ls.ts_server.increment_project_version();
|
|
||||||
ls.send_diagnostics_update();
|
ls.send_diagnostics_update();
|
||||||
}
|
}
|
||||||
performance.measure(mark);
|
performance.measure(mark);
|
||||||
|
|
|
@ -70,8 +70,6 @@ use std::net::SocketAddr;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::atomic::AtomicUsize;
|
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use text_size::TextRange;
|
use text_size::TextRange;
|
||||||
|
@ -222,7 +220,6 @@ pub struct TsServer {
|
||||||
sender: mpsc::UnboundedSender<Request>,
|
sender: mpsc::UnboundedSender<Request>,
|
||||||
receiver: Mutex<Option<mpsc::UnboundedReceiver<Request>>>,
|
receiver: Mutex<Option<mpsc::UnboundedReceiver<Request>>>,
|
||||||
specifier_map: Arc<TscSpecifierMap>,
|
specifier_map: Arc<TscSpecifierMap>,
|
||||||
project_version: Arc<AtomicUsize>,
|
|
||||||
inspector_server: Mutex<Option<Arc<InspectorServer>>>,
|
inspector_server: Mutex<Option<Arc<InspectorServer>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,7 +231,6 @@ impl std::fmt::Debug for TsServer {
|
||||||
.field("sender", &self.sender)
|
.field("sender", &self.sender)
|
||||||
.field("receiver", &self.receiver)
|
.field("receiver", &self.receiver)
|
||||||
.field("specifier_map", &self.specifier_map)
|
.field("specifier_map", &self.specifier_map)
|
||||||
.field("project_version", &self.project_version)
|
|
||||||
.field("inspector_server", &self.inspector_server.lock().is_some())
|
.field("inspector_server", &self.inspector_server.lock().is_some())
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
@ -249,7 +245,6 @@ impl TsServer {
|
||||||
sender: tx,
|
sender: tx,
|
||||||
receiver: Mutex::new(Some(request_rx)),
|
receiver: Mutex::new(Some(request_rx)),
|
||||||
specifier_map: Arc::new(TscSpecifierMap::new()),
|
specifier_map: Arc::new(TscSpecifierMap::new()),
|
||||||
project_version: Arc::new(AtomicUsize::new(1)),
|
|
||||||
inspector_server: Mutex::new(None),
|
inspector_server: Mutex::new(None),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,14 +267,12 @@ impl TsServer {
|
||||||
let performance = self.performance.clone();
|
let performance = self.performance.clone();
|
||||||
let cache = self.cache.clone();
|
let cache = self.cache.clone();
|
||||||
let specifier_map = self.specifier_map.clone();
|
let specifier_map = self.specifier_map.clone();
|
||||||
let project_version = self.project_version.clone();
|
|
||||||
let _join_handle = thread::spawn(move || {
|
let _join_handle = thread::spawn(move || {
|
||||||
run_tsc_thread(
|
run_tsc_thread(
|
||||||
receiver,
|
receiver,
|
||||||
performance.clone(),
|
performance.clone(),
|
||||||
cache.clone(),
|
cache.clone(),
|
||||||
specifier_map.clone(),
|
specifier_map.clone(),
|
||||||
project_version,
|
|
||||||
maybe_inspector_server,
|
maybe_inspector_server,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
@ -361,10 +354,6 @@ impl TsServer {
|
||||||
self.request(snapshot, req).await
|
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(
|
pub async fn get_supported_code_fixes(
|
||||||
&self,
|
&self,
|
||||||
snapshot: Arc<StateSnapshot>,
|
snapshot: Arc<StateSnapshot>,
|
||||||
|
@ -3841,7 +3830,6 @@ struct State {
|
||||||
response: Option<Response>,
|
response: Option<Response>,
|
||||||
state_snapshot: Arc<StateSnapshot>,
|
state_snapshot: Arc<StateSnapshot>,
|
||||||
specifier_map: Arc<TscSpecifierMap>,
|
specifier_map: Arc<TscSpecifierMap>,
|
||||||
project_version: Arc<AtomicUsize>,
|
|
||||||
token: CancellationToken,
|
token: CancellationToken,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3850,7 +3838,6 @@ impl State {
|
||||||
state_snapshot: Arc<StateSnapshot>,
|
state_snapshot: Arc<StateSnapshot>,
|
||||||
specifier_map: Arc<TscSpecifierMap>,
|
specifier_map: Arc<TscSpecifierMap>,
|
||||||
performance: Arc<Performance>,
|
performance: Arc<Performance>,
|
||||||
project_version: Arc<AtomicUsize>,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
last_id: 1,
|
last_id: 1,
|
||||||
|
@ -3858,7 +3845,6 @@ impl State {
|
||||||
response: None,
|
response: None,
|
||||||
state_snapshot,
|
state_snapshot,
|
||||||
specifier_map,
|
specifier_map,
|
||||||
project_version,
|
|
||||||
token: Default::default(),
|
token: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4077,7 +4063,7 @@ fn op_script_version(
|
||||||
fn op_project_version(state: &mut OpState) -> String {
|
fn op_project_version(state: &mut OpState) -> String {
|
||||||
let state = state.borrow_mut::<State>();
|
let state = state.borrow_mut::<State>();
|
||||||
let mark = state.performance.mark("tsc.op.op_project_version");
|
let mark = state.performance.mark("tsc.op.op_project_version");
|
||||||
let r = state.project_version.load(Ordering::Relaxed).to_string();
|
let r = state.state_snapshot.documents.project_version();
|
||||||
state.performance.measure(mark);
|
state.performance.measure(mark);
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
@ -4087,7 +4073,6 @@ fn run_tsc_thread(
|
||||||
performance: Arc<Performance>,
|
performance: Arc<Performance>,
|
||||||
cache: Arc<dyn HttpCache>,
|
cache: Arc<dyn HttpCache>,
|
||||||
specifier_map: Arc<TscSpecifierMap>,
|
specifier_map: Arc<TscSpecifierMap>,
|
||||||
project_version: Arc<AtomicUsize>,
|
|
||||||
maybe_inspector_server: Option<Arc<InspectorServer>>,
|
maybe_inspector_server: Option<Arc<InspectorServer>>,
|
||||||
) {
|
) {
|
||||||
let has_inspector_server = maybe_inspector_server.is_some();
|
let has_inspector_server = maybe_inspector_server.is_some();
|
||||||
|
@ -4095,12 +4080,7 @@ fn run_tsc_thread(
|
||||||
// supplied snapshot is an isolate that contains the TypeScript language
|
// supplied snapshot is an isolate that contains the TypeScript language
|
||||||
// server.
|
// server.
|
||||||
let mut tsc_runtime = JsRuntime::new(RuntimeOptions {
|
let mut tsc_runtime = JsRuntime::new(RuntimeOptions {
|
||||||
extensions: vec![deno_tsc::init_ops(
|
extensions: vec![deno_tsc::init_ops(performance, cache, specifier_map)],
|
||||||
performance,
|
|
||||||
cache,
|
|
||||||
specifier_map,
|
|
||||||
project_version,
|
|
||||||
)],
|
|
||||||
startup_snapshot: Some(tsc::compiler_snapshot()),
|
startup_snapshot: Some(tsc::compiler_snapshot()),
|
||||||
inspector: maybe_inspector_server.is_some(),
|
inspector: maybe_inspector_server.is_some(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
@ -4173,7 +4153,6 @@ deno_core::extension!(deno_tsc,
|
||||||
performance: Arc<Performance>,
|
performance: Arc<Performance>,
|
||||||
cache: Arc<dyn HttpCache>,
|
cache: Arc<dyn HttpCache>,
|
||||||
specifier_map: Arc<TscSpecifierMap>,
|
specifier_map: Arc<TscSpecifierMap>,
|
||||||
project_version: Arc<AtomicUsize>,
|
|
||||||
},
|
},
|
||||||
state = |state, options| {
|
state = |state, options| {
|
||||||
state.put(State::new(
|
state.put(State::new(
|
||||||
|
@ -4187,7 +4166,6 @@ deno_core::extension!(deno_tsc,
|
||||||
}),
|
}),
|
||||||
options.specifier_map,
|
options.specifier_map,
|
||||||
options.performance,
|
options.performance,
|
||||||
options.project_version,
|
|
||||||
));
|
));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -5115,7 +5093,14 @@ mod tests {
|
||||||
b"export const b = \"b\";\n\nexport const a = \"b\";\n",
|
b"export const b = \"b\";\n\nexport const a = \"b\";\n",
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ts_server.increment_project_version();
|
let snapshot = {
|
||||||
|
let mut documents = snapshot.documents.clone();
|
||||||
|
documents.increment_project_version();
|
||||||
|
Arc::new(StateSnapshot {
|
||||||
|
documents,
|
||||||
|
..snapshot.as_ref().clone()
|
||||||
|
})
|
||||||
|
};
|
||||||
let specifier = resolve_url("file:///a.ts").unwrap();
|
let specifier = resolve_url("file:///a.ts").unwrap();
|
||||||
let diagnostics = ts_server
|
let diagnostics = ts_server
|
||||||
.get_diagnostics(snapshot.clone(), vec![specifier], Default::default())
|
.get_diagnostics(snapshot.clone(), vec![specifier], Default::default())
|
||||||
|
|
Loading…
Add table
Reference in a new issue