|
2 | 2 | //! requests/replies and notifications back to the client.
|
3 | 3 | use std::{
|
4 | 4 | fmt,
|
| 5 | + ops::Deref, |
5 | 6 | sync::Arc,
|
6 | 7 | time::{Duration, Instant},
|
7 | 8 | };
|
@@ -720,13 +721,62 @@ impl GlobalState {
|
720 | 721 | Ok(())
|
721 | 722 | })?
|
722 | 723 | .on::<lsp_types::notification::DidSaveTextDocument>(|this, params| {
|
723 |
| - for flycheck in &this.flycheck { |
724 |
| - flycheck.update(); |
| 724 | + let mut updated = false; |
| 725 | + if let Ok(vfs_path) = from_proto::vfs_path(¶ms.text_document.uri) { |
| 726 | + let (vfs, _) = &*this.vfs.read(); |
| 727 | + if let Some(file_id) = vfs.file_id(&vfs_path) { |
| 728 | + let analysis = this.analysis_host.analysis(); |
| 729 | + let crate_ids = analysis.crate_for(file_id)?; |
| 730 | + |
| 731 | + let paths: Vec<_> = crate_ids |
| 732 | + .iter() |
| 733 | + .filter_map(|&crate_id| { |
| 734 | + analysis |
| 735 | + .crate_root(crate_id) |
| 736 | + .map(|file_id| { |
| 737 | + vfs.file_path(file_id).as_path().map(ToOwned::to_owned) |
| 738 | + }) |
| 739 | + .transpose() |
| 740 | + }) |
| 741 | + .collect::<ide::Cancellable<_>>()?; |
| 742 | + let paths: Vec<_> = paths.iter().map(Deref::deref).collect(); |
| 743 | + |
| 744 | + let workspace_ids = |
| 745 | + this.workspaces.iter().enumerate().filter(|(_, ws)| match ws { |
| 746 | + project_model::ProjectWorkspace::Cargo { cargo, .. } => { |
| 747 | + cargo.packages().filter(|&pkg| cargo[pkg].is_member).any( |
| 748 | + |pkg| { |
| 749 | + cargo[pkg].targets.iter().any(|&it| { |
| 750 | + paths.contains(&cargo[it].root.as_path()) |
| 751 | + }) |
| 752 | + }, |
| 753 | + ) |
| 754 | + } |
| 755 | + project_model::ProjectWorkspace::Json { project, .. } => project |
| 756 | + .crates() |
| 757 | + .any(|(c, _)| crate_ids.iter().any(|&crate_id| crate_id == c)), |
| 758 | + project_model::ProjectWorkspace::DetachedFiles { .. } => false, |
| 759 | + }); |
| 760 | + 'workspace: for (id, _) in workspace_ids { |
| 761 | + for flycheck in &this.flycheck { |
| 762 | + if id == flycheck.id() { |
| 763 | + updated = true; |
| 764 | + flycheck.update(); |
| 765 | + continue 'workspace; |
| 766 | + } |
| 767 | + } |
| 768 | + } |
| 769 | + } |
| 770 | + if let Some(abs_path) = vfs_path.as_path() { |
| 771 | + if reload::should_refresh_for_change(&abs_path, ChangeKind::Modify) { |
| 772 | + this.fetch_workspaces_queue |
| 773 | + .request_op(format!("DidSaveTextDocument {}", abs_path.display())); |
| 774 | + } |
| 775 | + } |
725 | 776 | }
|
726 |
| - if let Ok(abs_path) = from_proto::abs_path(¶ms.text_document.uri) { |
727 |
| - if reload::should_refresh_for_change(&abs_path, ChangeKind::Modify) { |
728 |
| - this.fetch_workspaces_queue |
729 |
| - .request_op(format!("DidSaveTextDocument {}", abs_path.display())); |
| 777 | + if !updated { |
| 778 | + for flycheck in &this.flycheck { |
| 779 | + flycheck.update(); |
730 | 780 | }
|
731 | 781 | }
|
732 | 782 | Ok(())
|
|
0 commit comments