aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-06-17 16:51:46 +0100
committerAleksey Kladov <[email protected]>2020-06-17 16:51:46 +0100
commitdc90e0b5a5d4f2255d6f0b82204f26cbaafbdd46 (patch)
treef1fec822afdef76d83d56918ab5ce12697dd8943
parent931f3173992df6ac6b728fa9fa9a94d15781027e (diff)
Better encapsulate reverse-mapping of files to cargo targets
We need to find a better way to do it... CrateGraph by itself is fine, CargoWorkspace as well, but the mapping between the two seems arbitrary...
-rw-r--r--crates/rust-analyzer/src/cargo_target_spec.rs32
-rw-r--r--crates/rust-analyzer/src/global_state.rs22
2 files changed, 30 insertions, 24 deletions
diff --git a/crates/rust-analyzer/src/cargo_target_spec.rs b/crates/rust-analyzer/src/cargo_target_spec.rs
index 44f856f6b..5c22dce0d 100644
--- a/crates/rust-analyzer/src/cargo_target_spec.rs
+++ b/crates/rust-analyzer/src/cargo_target_spec.rs
@@ -2,7 +2,7 @@
2 2
3use ra_cfg::CfgExpr; 3use ra_cfg::CfgExpr;
4use ra_ide::{FileId, RunnableKind, TestId}; 4use ra_ide::{FileId, RunnableKind, TestId};
5use ra_project_model::{self, ProjectWorkspace, TargetKind}; 5use ra_project_model::{self, TargetKind};
6 6
7use crate::{global_state::GlobalStateSnapshot, Result}; 7use crate::{global_state::GlobalStateSnapshot, Result};
8 8
@@ -89,27 +89,23 @@ impl CargoTargetSpec {
89 } 89 }
90 90
91 pub(crate) fn for_file( 91 pub(crate) fn for_file(
92 world: &GlobalStateSnapshot, 92 global_state_snapshot: &GlobalStateSnapshot,
93 file_id: FileId, 93 file_id: FileId,
94 ) -> Result<Option<CargoTargetSpec>> { 94 ) -> Result<Option<CargoTargetSpec>> {
95 let &crate_id = match world.analysis().crate_for(file_id)?.first() { 95 let crate_id = match global_state_snapshot.analysis().crate_for(file_id)?.first() {
96 Some(crate_id) => crate_id, 96 Some(crate_id) => *crate_id,
97 None => return Ok(None), 97 None => return Ok(None),
98 }; 98 };
99 let file_id = world.analysis().crate_root(crate_id)?; 99 let (cargo_ws, target) = match global_state_snapshot.cargo_target_for_crate_root(crate_id) {
100 let path = world.file_id_to_path(file_id); 100 Some(it) => it,
101 let res = world.workspaces.iter().find_map(|ws| match ws { 101 None => return Ok(None),
102 ProjectWorkspace::Cargo { cargo, .. } => { 102 };
103 let tgt = cargo.target_by_root(&path)?; 103 let res = CargoTargetSpec {
104 Some(CargoTargetSpec { 104 package: cargo_ws.package_flag(&cargo_ws[cargo_ws[target].package]),
105 package: cargo.package_flag(&cargo[cargo[tgt].package]), 105 target: cargo_ws[target].name.clone(),
106 target: cargo[tgt].name.clone(), 106 target_kind: cargo_ws[target].kind,
107 target_kind: cargo[tgt].kind, 107 };
108 }) 108 Ok(Some(res))
109 }
110 ProjectWorkspace::Json { .. } => None,
111 });
112 Ok(res)
113 } 109 }
114 110
115 pub(crate) fn push_to(self, buf: &mut Vec<String>, kind: &RunnableKind) { 111 pub(crate) fn push_to(self, buf: &mut Vec<String>, kind: &RunnableKind) {
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index 73ca2a709..ef6c7d44d 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -15,7 +15,7 @@ use ra_flycheck::{Flycheck, FlycheckConfig};
15use ra_ide::{ 15use ra_ide::{
16 Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData, SourceRootId, 16 Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData, SourceRootId,
17}; 17};
18use ra_project_model::{ProcMacroClient, ProjectWorkspace}; 18use ra_project_model::{CargoWorkspace, ProcMacroClient, ProjectWorkspace, Target};
19use ra_vfs::{LineEndings, RootEntry, Vfs, VfsChange, VfsFile, VfsTask, Watch}; 19use ra_vfs::{LineEndings, RootEntry, Vfs, VfsChange, VfsFile, VfsTask, Watch};
20use relative_path::RelativePathBuf; 20use relative_path::RelativePathBuf;
21use stdx::format_to; 21use stdx::format_to;
@@ -28,7 +28,7 @@ use crate::{
28 vfs_glob::{Glob, RustPackageFilterBuilder}, 28 vfs_glob::{Glob, RustPackageFilterBuilder},
29 LspError, Result, 29 LspError, Result,
30}; 30};
31use ra_db::ExternSourceId; 31use ra_db::{CrateId, ExternSourceId};
32use rustc_hash::{FxHashMap, FxHashSet}; 32use rustc_hash::{FxHashMap, FxHashSet};
33 33
34fn create_flycheck(workspaces: &[ProjectWorkspace], config: &FlycheckConfig) -> Option<Flycheck> { 34fn create_flycheck(workspaces: &[ProjectWorkspace], config: &FlycheckConfig) -> Option<Flycheck> {
@@ -290,10 +290,6 @@ impl GlobalStateSnapshot {
290 file_id_to_url(&self.vfs.read(), id) 290 file_id_to_url(&self.vfs.read(), id)
291 } 291 }
292 292
293 pub fn file_id_to_path(&self, id: FileId) -> PathBuf {
294 self.vfs.read().file2path(VfsFile(id.0))
295 }
296
297 pub fn file_line_endings(&self, id: FileId) -> LineEndings { 293 pub fn file_line_endings(&self, id: FileId) -> LineEndings {
298 self.vfs.read().file_line_endings(VfsFile(id.0)) 294 self.vfs.read().file_line_endings(VfsFile(id.0))
299 } 295 }
@@ -305,6 +301,20 @@ impl GlobalStateSnapshot {
305 url_from_abs_path(&path) 301 url_from_abs_path(&path)
306 } 302 }
307 303
304 pub(crate) fn cargo_target_for_crate_root(
305 &self,
306 crate_id: CrateId,
307 ) -> Option<(&CargoWorkspace, Target)> {
308 let file_id = self.analysis().crate_root(crate_id).ok()?;
309 let path = self.vfs.read().file2path(VfsFile(file_id.0));
310 self.workspaces.iter().find_map(|ws| match ws {
311 ProjectWorkspace::Cargo { cargo, .. } => {
312 cargo.target_by_root(&path).map(|it| (cargo, it))
313 }
314 ProjectWorkspace::Json { .. } => None,
315 })
316 }
317
308 pub fn status(&self) -> String { 318 pub fn status(&self) -> String {
309 let mut buf = String::new(); 319 let mut buf = String::new();
310 if self.workspaces.is_empty() { 320 if self.workspaces.is_empty() {