Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a6663b0

Browse files
authored
fix(lsp): don't write lockfile during cache-on-save (denoland#30733)
1 parent 7385354 commit a6663b0

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

cli/lsp/config.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ pub struct WorkspaceSettings {
555555

556556
/// Cache local modules and their dependencies on `textDocument/didSave`
557557
/// notifications corresponding to them.
558-
#[serde(default)]
558+
#[serde(default = "default_to_true")]
559559
pub cache_on_save: bool,
560560

561561
/// Override the default stores used to validate certificates. This overrides
@@ -632,7 +632,7 @@ impl Default for WorkspaceSettings {
632632
disable_paths: vec![],
633633
enable_paths: None,
634634
cache: None,
635-
cache_on_save: false,
635+
cache_on_save: true,
636636
certificate_stores: None,
637637
config: None,
638638
import_map: None,
@@ -1433,7 +1433,7 @@ impl ConfigData {
14331433
is_package_manager_subcommand: false,
14341434
frozen_lockfile: None,
14351435
lock_arg: None,
1436-
lockfile_skip_write: false,
1436+
lockfile_skip_write: true,
14371437
node_modules_dir: Some(resolve_node_modules_dir_mode(
14381438
&member_dir.workspace,
14391439
byonm,
@@ -2146,7 +2146,7 @@ mod tests {
21462146
disable_paths: vec![],
21472147
enable_paths: None,
21482148
cache: None,
2149-
cache_on_save: false,
2149+
cache_on_save: true,
21502150
certificate_stores: None,
21512151
config: None,
21522152
import_map: None,

cli/lsp/language_server.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ impl LanguageServer {
377377
specifiers: Vec<ModuleSpecifier>,
378378
referrer: ModuleSpecifier,
379379
force_global_cache: bool,
380+
lockfile_skip_write: bool,
380381
) -> LspResult<Option<Value>> {
381382
async fn create_graph_for_caching(
382383
factory: CliFactory,
@@ -439,6 +440,7 @@ impl LanguageServer {
439440
specifiers,
440441
referrer,
441442
force_global_cache,
443+
lockfile_skip_write,
442444
);
443445

444446
match prepare_cache_result {
@@ -458,7 +460,12 @@ impl LanguageServer {
458460

459461
// now get the lock back to update with the new information
460462
*self.did_change_batch_queue.borrow_mut() = None;
461-
self.inner.write().await.post_cache().await;
463+
self
464+
.inner
465+
.write()
466+
.await
467+
.post_cache(!lockfile_skip_write)
468+
.await;
462469
self.performance.measure(mark);
463470
}
464471
Err(err) => {
@@ -1254,7 +1261,9 @@ impl Inner {
12541261
};
12551262
specifier
12561263
};
1257-
if let Err(err) = ls.cache(vec![specifier], referrer, false).await {
1264+
if let Err(err) =
1265+
ls.cache(vec![specifier], referrer, false, true).await
1266+
{
12581267
lsp_warn!("{:#}", err);
12591268
}
12601269
});
@@ -1451,7 +1460,7 @@ impl Inner {
14511460
self.task_queue.queue_task(Box::new(|ls: LanguageServer| {
14521461
spawn(async move {
14531462
if let Err(err) = ls
1454-
.cache(vec![], module.specifier.as_ref().clone(), false)
1463+
.cache(vec![], module.specifier.as_ref().clone(), false, true)
14551464
.await
14561465
{
14571466
lsp_warn!(
@@ -4085,7 +4094,7 @@ impl tower_lsp::LanguageServer for LanguageServer {
40854094
serde_json::from_value(json!(params.arguments))
40864095
.map_err(|err| LspError::invalid_params(err.to_string()))?;
40874096
self
4088-
.cache(specifiers, referrer, options.force_global_cache)
4097+
.cache(specifiers, referrer, options.force_global_cache, false)
40894098
.await
40904099
} else if params.command == "deno.reloadImportRegistries" {
40914100
*self.did_change_batch_queue.borrow_mut() = None;
@@ -4694,6 +4703,7 @@ impl Inner {
46944703
specifiers: Vec<ModuleSpecifier>,
46954704
referrer: ModuleSpecifier,
46964705
force_global_cache: bool,
4706+
lockfile_skip_write: bool,
46974707
) -> Result<PrepareCacheResult, AnyError> {
46984708
let config_data = self.config.tree.data_for_specifier(&referrer);
46994709
let scope = config_data.map(|d| d.scope.clone());
@@ -4725,6 +4735,7 @@ impl Inner {
47254735
let mut cli_factory = CliFactory::from_flags(Arc::new(Flags {
47264736
internal: InternalFlags {
47274737
cache_path: Some(self.cache.deno_dir().root.clone()),
4738+
lockfile_skip_write,
47284739
..Default::default()
47294740
},
47304741
ca_stores: workspace_settings.certificate_stores.clone(),
@@ -4776,9 +4787,22 @@ impl Inner {
47764787
}
47774788

47784789
#[cfg_attr(feature = "lsp-tracing", tracing::instrument(skip_all))]
4779-
async fn post_cache(&mut self) {
4780-
self.resolver.did_cache();
4781-
self.refresh_dep_info();
4790+
async fn post_cache(&mut self, did_write_lockfile: bool) {
4791+
if did_write_lockfile {
4792+
// Most of the refresh steps will happen in `did_change_watched_files()`,
4793+
// since the lockfile was written.
4794+
self.resolver.did_cache();
4795+
self.refresh_dep_info();
4796+
} else {
4797+
self.refresh_config_tree().await;
4798+
self.update_cache();
4799+
self.refresh_resolver().await;
4800+
self.refresh_compiler_options_resolver();
4801+
self.refresh_linter_resolver();
4802+
self.refresh_documents_config();
4803+
self.resolver.did_cache();
4804+
self.refresh_dep_info();
4805+
}
47824806
self.project_changed(vec![], ProjectScopesChange::Config);
47834807
self.ts_server.cleanup_semantic_cache(self.snapshot()).await;
47844808
self.send_diagnostics_update();

tests/integration/lsp_tests.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6586,7 +6586,7 @@ fn lsp_cache_on_save() {
65866586
.use_temp_cwd()
65876587
.build();
65886588
let temp_dir = context.temp_dir();
6589-
temp_dir.write(
6589+
let file = temp_dir.source_file(
65906590
"file.ts",
65916591
r#"
65926592
import { printHello } from "http://localhost:4545/subdir/print_hello.ts";
@@ -6595,25 +6595,12 @@ fn lsp_cache_on_save() {
65956595
);
65966596
let mut client = context.new_lsp_command().build();
65976597
client.initialize_default();
6598-
client.change_configuration(json!({
6599-
"deno": {
6600-
"enable": true,
6601-
"cacheOnSave": true,
6602-
},
6603-
}));
66046598

6605-
let diagnostics = client.did_open(json!({
6606-
"textDocument": {
6607-
"uri": url_to_uri(&temp_dir.url().join("file.ts").unwrap()).unwrap(),
6608-
"languageId": "typescript",
6609-
"version": 1,
6610-
"text": temp_dir.read_to_string("file.ts"),
6611-
}
6612-
}));
6599+
let diagnostics = client.did_open_file(&file);
66136600
assert_eq!(
66146601
diagnostics.messages_with_source("deno"),
66156602
serde_json::from_value(json!({
6616-
"uri": url_to_uri(&temp_dir.url().join("file.ts").unwrap()).unwrap(),
6603+
"uri": file.uri(),
66176604
"diagnostics": [{
66186605
"range": {
66196606
"start": { "line": 1, "character": 33 },
@@ -6630,10 +6617,13 @@ fn lsp_cache_on_save() {
66306617
.unwrap()
66316618
);
66326619
client.did_save(json!({
6633-
"textDocument": { "uri": url_to_uri(&temp_dir.url().join("file.ts").unwrap()).unwrap() },
6620+
"textDocument": { "uri": file.uri() },
66346621
}));
66356622
client.handle_refresh_diagnostics_request();
6636-
assert_eq!(client.read_diagnostics().all(), vec![]);
6623+
assert_eq!(json!(client.read_diagnostics().all()), json!([]));
6624+
6625+
// Lockfiles should not be written from cache-on-save.
6626+
assert!(!temp_dir.path().join("deno.lock").exists());
66376627

66386628
client.shutdown();
66396629
}

0 commit comments

Comments
 (0)